![]() |
Prüfen ob Integer in Array?
hallo zusammen,
ich hoffe mal das ist die richtige sparte... also ich habe ein array:
Delphi-Quellcode:
nun möchte ich prüfen, ob in diesem array jede zahl von 1 bis 9 GENAU 1 MAL vorkommt.
var a: Array[0..8] of Integer;
ich wollte das so prüfen:
Delphi-Quellcode:
leider geht das ja nicht mit arrays.
if 1 in a then // blabla
if 2 in a then // blabla if 3 in a then // blabla //... wie kann ich prüfen ob z.B. die Zahl 1 in dem array ist? gruss urbanbruhin |
Re: Prüfen ob Integer in Array?
Da musst du wohl oder übel eine FOR-Schleife bemühen.
|
Re: Prüfen ob Integer in Array?
Hallo,
falls das zu prüfende Array immer genau 9 Elemente besitzt, hilft Dir vielleicht folgender Code:
Delphi-Quellcode:
Falls das Array mehr als 9 Elemente enthält, kann mit dem Code nur noch das Vorhandensein, nicht aber die Eindeutigkeit einer Zahl überprüft werden:
var i : Integer;
s : set of 1..9; begin // Menge der enthaltenen Zahlen zusammenstellen s := []; for i := 0 to 8 do if (a[i] in [1..9]) then Include (s, a[i]); // Ergebnis prüfen if (s = [1..9]) then ShowMessage ("Jede Zahl genau 1x enthalten"); end;
Delphi-Quellcode:
Gruß Hawkeye
if (4 in s) then...
|
Re: Prüfen ob Integer in Array?
Hai ihr,
hier mal mein Ansatz für diesen Fall ;-)
Delphi-Quellcode:
Eigentlich mache ich nichts anderes als das Bit an der Postition welche von TestArray[ndx] bestimmt ist zu negieren.
procedure TDemoForm.Button1Click(Sender: TObject);
var TestArray: array[0..8] of Integer; TestInteger: Integer; ndx: Integer; begin // Ersteinmal für den Test das Array mit den Zahlen 1 bis 9 füllen for ndx := Low(TestArray) to High(TestArray) do begin TestArray[ndx] := ndx + 1; end; // Jetzt der Test. TestInteger := 0; // Alle Bits auf 0 for ndx := Low(TestArray) to High(TestArray) do begin TestInteger := (TestInteger xor (1 shl (TestArray[ndx] - 1))); end; if (TestInteger = $1FF) then // Das ist 2^9 -1 begin ShowMessage('blubb'); end; end; Ist aber nicht die schönste aller möglichen Lösungen ;-) |
Re: Prüfen ob Integer in Array?
die wohl simpelste lösung ist das ganze zu addieren :P
|
Re: Prüfen ob Integer in Array?
Zitat:
Frage 1: Ist jede Zahl von 1 bis 9 genau 1x enthalten? Frage 2: Ist die Zahl 7 enthalten? Was sagt Dein Algorithmus? |
Re: Prüfen ob Integer in Array?
Zitat:
1 + 1 + 4 ... = 45 Wenn du zu 100% sagen kannst, dass nur Zahlen von 1 bis9 drin sind und immer nur eine Zahl einmal, dann reicht eine einfaches Addieren. Aber wenn du das sagen kannst, dann musst du nicht prüfen. :p |
Re: Prüfen ob Integer in Array?
Zitat:
Code:
:zwinker: Ich denke, du siehst, worauf das rausläuft ===> simpel, aber grottenfalsch ;)
1+2+3+4+5+6+7+8+9 => 45 //Alle Zahlen von 1 bis 9 genau einmal vorhanden, wie gewünscht
2+2+2+4+5+6+7+8+9 => 45 2+2+3+3+5+6+7+8+9 => 45 2+2+3+3+6+6+7+7+9 => 45 ... ... ... |
Re: Prüfen ob Integer in Array?
Zitat:
Code:
Es geht aber auch so oder anders:
1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 = 45
Code:
MfG
1 + 1 + 4 + 4 + 5 + 6 + 7 + 8 + 9 = 45
Edit: Hat der rote Kasten schon Oster-Urlaub :gruebel: Edit 2: Die Addier-"Lösung" wär möglich, wenn jede Zahl nur einmal vorkommen kann und urbanbruhin prüfen wollte, ob schon alle Zahlen von 1 bis 9 im Array sind. |
Re: Prüfen ob Integer in Array?
tschuldigung :oops:
|
Re: Prüfen ob Integer in Array?
Ist es ein sortiertes Array? Wenn ja, könnte man eine binäre Suche machen.
|
Re: Prüfen ob Integer in Array?
Zitat:
Delphi-Quellcode:
Da braucht man gar nicht viel suchen ;)
Result := true;
For i := 0 To 8 Do Result := Result AND (a[i] = i+1) |
Re: Prüfen ob Integer in Array?
Und wenn eine Zahl mehrmals vorkommt?
Aber ich glaube bei einem 10er Array ist es eh ziemlich egal, da wäre binäre Suche eigentlich Verschwendung. |
Re: Prüfen ob Integer in Array?
Zitat:
|
Re: Prüfen ob Integer in Array?
hallo zusammen,
erstmal danke für eure antworten :bounce1: ich werde morgen mal die vorschläge von Hawkeye219 und Sharky testen. Ich denke das müsste so funktionieren. ich dachte eben, mit arrays geht es so ähnlich wie "if x in Array"... gruss urbanbruhin |
Re: Prüfen ob Integer in Array?
"in" gibt es nur für Sets (Mengen).
Könntest aber auch einfach mal schauen, inwiefern sich dein Problem vielleicht auch mit Sets lösen lassen würde. |
Re: Prüfen ob Integer in Array?
Zitat:
ich habe gestern zum ersten mal mit arrays gearbeitet, und sets habe ich noch nie verwendet :mrgreen: aber mir ist es ja egal ob ich ein set oder ein array nehme, hauptsache es funktioniert. EDIT: ich habs jetzt mal mit einem set probiert. hier die funktion, die überprüft ob jede zahl von 1 bis 9 einmal enthalten ist:
Delphi-Quellcode:
und so habe ich die function dann getestet:
function TForm1.CorrectIntegers(i1, i2, i3, i4, i5, i6, i7, i8, i9: integer): boolean;
var s : set of 1..9; begin result := false; Include(s, i1); Include(s, i2); Include(s, i3); Include(s, i4); Include(s, i5); Include(s, i6); Include(s, i7); Include(s, i8); Include(s, i9); if (1 in s) and (2 in s) and (3 in s) and (4 in s) and (5 in s) and (6 in s) and (7 in s) and (8 in s) and (9 in s) then result := true; end;
Delphi-Quellcode:
bei den ersten zwei showmessages steht true drin, stimmt ja auch so. beim dritten sollte false stehen, kommt aber true raus :gruebel:
procedure TForm1.Button2Click(Sender: TObject);
begin showmessage(booltostr(correctintegers(5, 4, 6, 7, 2, 3, 8, 1, 9), true)); // das müsste true geben showmessage(booltostr(correctintegers(1, 9, 2, 8, 3, 7, 4, 6, 5), true)); // das auch true showmessage(booltostr(correctintegers(1, 2, 3, 4, 5, 6, 8, 8, 9), true)); // und das false showmessage(booltostr(correctintegers(1, 2, 3, 4, 5, 5, 7, 8, 9), true)); // und nochmals false end; das vierte stimmt wieder, da kommt false raus... weiss jemand was das problem ist? |
Re: Prüfen ob Integer in Array?
Ich hätte auch noch einen Vorschlag. Mein verfahren geht den array durch und speichert in einem vergleichs array, wie oft die gefundene zahl vorkommt. Dannach prüfe ich, ob die werte alle gleich 1 sind.
Delphi-Quellcode:
var MyArray: array [1..9] of Integer;
{...} procedure TestMyArray; var i, CurrInt: integer; TestArray: array [1..9] of integer; Valid: boolean; begin //Erstmal alles im testarray auf 0 setzen. for i:=1 to 9 do TestArray[i]:=0; Valid:=true; //fangen wir mal positiv an for i:=1 to 9 do begin CurrInt:=MyArray[i]; //die aktuelle zahl auslesen try TestArray[CurrInt]:=TestArray[CurrInt]+1; //und im testarray eintragen if TestArray[CurrInt]<>1 then //prüfen, ob die zahl schon begin Valid:=false; //mal vorgekommen ist break; end; except Valid:=false; //wenn was nicht stimmt end; end; if Valid=true then ShowMessage('Alles stimmt!') else ShowMessage('Nix is!'); end; |
Re: Prüfen ob Integer in Array?
Zitat:
Delphi-Quellcode:
Die Abfrage kannst Du vereinfachen. Statt
var s : set of 1..9;
begin result := false; s := []; // <<----- hier Include(s, i1);
Delphi-Quellcode:
schreibst Du es so:
if (1 in s) and (2 in s) and (3 in s) and (4 in s) and (5 in s) and
(6 in s) and (7 in s) and (8 in s) and (9 in s) then result := true;
Delphi-Quellcode:
Zumindest beim Test auf Gleichheit kannst Du Sets wie "normale" Variablen benutzen. Die Abfrage mit "in" hast Du ja offenbar schon verstanden. :)
if (s = [1..9]) then result := True;
Gruß Hawkeye |
Re: Prüfen ob Integer in Array?
hallo Hawkeye219,
danke für deine antwort, es funktioniert wunderbar :bounce1: gruss urbanbruhin |
Re: Prüfen ob Integer in Array?
Noch einfacher: Result:=s=[0..9];
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:37 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz