Autor Beitrag
Schadowmaster
Hält's aus hier
Beiträge: 13



BeitragVerfasst: So 28.06.09 18:58 
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 28.06.09 19:02 
Ein kleines Beispiel:
ausblenden 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'); // wird nicht angezeigt
  if ttTwo in MyTest then
    ShowMessage('ttTwo Drin'); // wird angezeigt
Schadowmaster Threadstarter
Hält's aus hier
Beiträge: 13



BeitragVerfasst: 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).


Zuletzt bearbeitet von Schadowmaster am So 28.06.09 19:49, insgesamt 1-mal bearbeitet
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 28.06.09 19:46 
Wie bei jedem anderen boolschen Wert: ;-)
ausblenden Delphi-Quelltext
1:
2:
if not (a in b) then
  ...
Schadowmaster Threadstarter
Hält's aus hier
Beiträge: 13



BeitragVerfasst: 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:


ausblenden Delphi-Quelltext
1:
2:
Telemente = (1..36);
  Tmenge =  set of integer;



(und mit eckigen Klammern nimmt ers auch nicht)
FinnO
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1331
Erhaltene Danke: 123

Mac OSX, Arch
TypeScript (Webstorm), Kotlin, Clojure (IDEA), Golang (VSCode)
BeitragVerfasst: So 28.06.09 20:01 
wenn du eh Zahlen meinst kannst du das auch so machen:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
if a in [1..n] then
begin

end;
Schadowmaster Threadstarter
Hält's aus hier
Beiträge: 13



BeitragVerfasst: So 28.06.09 20:05 
ja, aber ich will ja kein einfaches intervall

mom, ich zeig dir mal den ganzen Code:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 28.06.09 20:07 
Wie wäre es so? ;-)
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
var
  Test: set of Byte;
begin
  Test := [46..1030];
  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:
www.delphi-library.d...iewtopic.php?t=71713
Jetzt brauchst du nur jeweils Zahl 1 und 2, 3 und 4 usw. zu nehmen. ;-)
Schadowmaster Threadstarter
Hält's aus hier
Beiträge: 13



BeitragVerfasst: 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 ;)