Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - mengen
Schadowmaster - So 28.06.09 18:58
Titel: mengen
moin,
Ich suche grad nen Weg zu überprüfen, ob ein Wert in einer Sammlung von Werten ist.
Am einfachsten ist es wohl zu verstehen am Beispiel
if (5 "element aus" A) ...
ich weiß nur leider nicht, welcher Datentyp solche Mengen haben, wie man da Werte reinschreibt und wie man guckt, ob ein Wert da drin ist.
Ich könnte es mit einem array machen, aber angeblich soll es ja einen eigenen Typ für sowas geben, also dachte ich mir benutz ich mal den (falls ihn mir jemand verraten kann^^).
MfG
Schadowmaster
jaenicke - So 28.06.09 19:02
Ein kleines Beispiel:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| type TTestTypes = (ttOne, ttTwo, ttThree); TTest = set of TTestTypes; var MyTest: TTest; begin MyTest := [ttOne, ttTwo]; if ttThree in MyTest then ShowMessage('ttThree Drin'); if ttTwo in MyTest then ShowMessage('ttTwo Drin'); |
Schadowmaster - So 28.06.09 19:45
hmm, thx schonmal
und wie ist die verneinung von in?
not in
!in
und ach ja, fast vergesssen:
wie verlängert man das Set?
du hast am Anfang nur zwei Elemente reingeschrieben und es dabei belassen, ich möchte aber in jedem Durchgang neue Elemente reinschreiben (soll ein Weg werden, mehrere Zahlen zufällig, aber ohne Wiederhohlung, auszuwählen).
jaenicke - So 28.06.09 19:46
Wie bei jedem anderen boolschen Wert: ;-)
Delphi-Quelltext
1: 2:
| if not (a in b) then ... |
Schadowmaster - So 28.06.09 19:51
ja, ok, so kann mans auch machen.^^
und ach ja, fast vergesssen:
wie verlängert man das Set?
du hast am Anfang nur zwei Elemente reingeschrieben und es dabei belassen, ich möchte aber in jedem Durchgang neue Elemente reinschreiben (soll ein Weg werden, mehrere Zahlen zufällig, aber ohne Wiederhohlung, auszuwählen).
MyTest := MyTest + [] vielleicht?
geht natürlich bei dir nicht, weil schon alle Tests drin sind, aber es müsst ja eigendlich bei integern gehen.
edit: hmm, er sagt mir grad sets dürfen nicht so viele Elemente besitzen.
also muss ich zuerst bei den TTestTypes ein paar Zahlen reinschreiben oder wie?
aber so gehts leider auch nicht:
Delphi-Quelltext
1: 2:
| Telemente = (1..36); Tmenge = set of integer; |
(und mit eckigen Klammern nimmt ers auch nicht)
FinnO - So 28.06.09 20:01
wenn du eh Zahlen meinst kannst du das auch so machen:
Delphi-Quelltext
1: 2: 3: 4:
| if a in [1..n] then begin
end; |
Schadowmaster - So 28.06.09 20:05
ja, aber ich will ja kein einfaches intervall
mom, ich zeig dir mal den ganzen Code:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| procedure TForm1.FormCreate(Sender: TObject); type Telemente = (1..36); Tmenge = set of Telemente; var i,zufall1,zufall2 : integer; x : Tmenge; begin randomize; for i := 1 to 18 do begin repeat zufall1 := random(36)+1; zufall2 := random(36)+1; until (zufall1 <> zufall2) and not ((zufall1 in x) or (zufall2 in x)); .... |
Hier hinter müssen jetzt zufall1 und zufall2 irgendwie in x geschrieben werden.
Ich möchte einfach 18 Paare von Zufallszahlen zwischen 1 und 36, wobei keine von ihnen mehrmals vorkommen darf...
Das soll ein Memoryspiel werden. *g*
jaenicke - So 28.06.09 20:07
Wie wäre es so? ;-)
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| var Test: set of Byte; begin Test := [4, 6..10, 30]; if 7 in Test then ShowMessage('7: Drin'); if not (5 in Test) then ShowMessage('5: Nicht drin'); |
// EDIT:
Wobei für nicht mehrfaches Vorkommen eher ein Mischen sinnvoll wäre. ;-)
Nimm einfach ein Array mit den Zahlen 1..36 und mische dieses zufällig mit Fisher Yates:
http://www.delphi-library.de/viewtopic.php?t=71713
Jetzt brauchst du nur jeweils Zahl 1 und 2, 3 und 4 usw. zu nehmen. ;-)
Schadowmaster - So 28.06.09 20:41
hmm, arrays mischen
das ist natürlich auch eine Idee.
Ich glaub ich werd mir das mal angucken und morgen noch ein paar Fragen stellen.
thx schonmal soweit ;)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!