Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Prüfen ob Integer in Array? (https://www.delphipraxis.net/67367-pruefen-ob-integer-array.html)

100nF 13. Apr 2006 17:54


Prüfen ob Integer in Array?
 
hallo zusammen,

ich hoffe mal das ist die richtige sparte...

also ich habe ein array:
Delphi-Quellcode:
var a: Array[0..8] of Integer;
nun möchte ich prüfen, ob in diesem array jede zahl von 1 bis 9 GENAU 1 MAL vorkommt.
ich wollte das so prüfen:
Delphi-Quellcode:
if 1 in a then // blabla
if 2 in a then // blabla
if 3 in a then // blabla
//...
leider geht das ja nicht mit arrays.

wie kann ich prüfen ob z.B. die Zahl 1 in dem array ist?

gruss
urbanbruhin

jbg 13. Apr 2006 17:55

Re: Prüfen ob Integer in Array?
 
Da musst du wohl oder übel eine FOR-Schleife bemühen.

Hawkeye219 13. Apr 2006 18:28

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

Delphi-Quellcode:
if (4 in s) then...
Gruß Hawkeye

Sharky 13. Apr 2006 18:42

Re: Prüfen ob Integer in Array?
 
Hai ihr,

hier mal mein Ansatz für diesen Fall ;-)
Delphi-Quellcode:
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;
Eigentlich mache ich nichts anderes als das Bit an der Postition welche von TestArray[ndx] bestimmt ist zu negieren.
Ist aber nicht die schönste aller möglichen Lösungen ;-)

pacman1986 13. Apr 2006 18:47

Re: Prüfen ob Integer in Array?
 
die wohl simpelste lösung ist das ganze zu addieren :P

Hawkeye219 13. Apr 2006 18:59

Re: Prüfen ob Integer in Array?
 
Zitat:

Zitat von pacman1986
die wohl simpelste lösung ist das ganze zu addieren

Ok, gegeben sei folgende Zahlenmenge: (1, 2, 3, 3, 4, 5, 9, 9, 9).

Frage 1: Ist jede Zahl von 1 bis 9 genau 1x enthalten?
Frage 2: Ist die Zahl 7 enthalten?

Was sagt Dein Algorithmus?

ste_ett 13. Apr 2006 19:02

Re: Prüfen ob Integer in Array?
 
Zitat:

Zitat von pacman1986
die wohl simpelste lösung ist das ganze zu addieren :P

1 + 2 + 3 ... = 45
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

leddl 13. Apr 2006 19:03

Re: Prüfen ob Integer in Array?
 
Zitat:

Zitat von pacman1986
die wohl simpelste lösung ist das ganze zu addieren :P

OK, dann gehen wir mal davon aus, daß du recht hast ;)
Code:
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
...
...
...
:zwinker: Ich denke, du siehst, worauf das rausläuft ===> simpel, aber grottenfalsch ;)

Thorben77 13. Apr 2006 19:04

Re: Prüfen ob Integer in Array?
 
Zitat:

Zitat von pacman1986
die wohl simpelste lösung ist das ganze zu addieren :P

Dann muss aber das Ergebnis nicht stimmen:
Code:
1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 = 45
Es geht aber auch so oder anders:
Code:
1 + 1 + 4 + 4 + 5 + 6 + 7 + 8 + 9 = 45
MfG

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.

pacman1986 13. Apr 2006 19:06

Re: Prüfen ob Integer in Array?
 
tschuldigung :oops:

3_of_8 13. Apr 2006 19:34

Re: Prüfen ob Integer in Array?
 
Ist es ein sortiertes Array? Wenn ja, könnte man eine binäre Suche machen.

leddl 13. Apr 2006 19:59

Re: Prüfen ob Integer in Array?
 
Zitat:

Zitat von 3_of_8
Ist es ein sortiertes Array? Wenn ja, könnte man eine binäre Suche machen.

:lol: Also wenn das Array sortiert wäre, hätte er garantiert nicht gefragt :lol:
Delphi-Quellcode:
Result := true;
For i := 0 To 8 Do
  Result := Result AND (a[i] = i+1)
Da braucht man gar nicht viel suchen ;)

3_of_8 13. Apr 2006 20:17

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.

leddl 13. Apr 2006 20:20

Re: Prüfen ob Integer in Array?
 
Zitat:

Zitat von 3_of_8
Und wenn eine Zahl mehrmals vorkommt?

Dann entspricht das Array nicht den geforderten Voraussetzungen und es wird false zurückgegeben :zwinker:

100nF 13. Apr 2006 21:02

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

leddl 13. Apr 2006 21:08

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.

100nF 14. Apr 2006 08:31

Re: Prüfen ob Integer in Array?
 
Zitat:

Zitat von leddl
"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.

was ist denn genau der unterschied von sets und arrays?
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:
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;
und so habe ich die function dann getestet:
Delphi-Quellcode:
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;
bei den ersten zwei showmessages steht true drin, stimmt ja auch so. beim dritten sollte false stehen, kommt aber true raus :gruebel:
das vierte stimmt wieder, da kommt false raus...

weiss jemand was das problem ist?

emteg 14. Apr 2006 09:15

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;

Hawkeye219 14. Apr 2006 09:28

Re: Prüfen ob Integer in Array?
 
Zitat:

Zitat von urbanbruhin
[weiss jemand was das problem ist?

Du mußt das Set zunächst initialisieren, sonst enthält es zufällige Werte: :wink:

Delphi-Quellcode:
var s : set of 1..9;
begin
  result := false;
  s := []; // <<----- hier
  Include(s, i1);
Die Abfrage kannst Du vereinfachen. Statt

Delphi-Quellcode:
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;
schreibst Du es so:
Delphi-Quellcode:
if (s = [1..9]) then result := True;
Zumindest beim Test auf Gleichheit kannst Du Sets wie "normale" Variablen benutzen. Die Abfrage mit "in" hast Du ja offenbar schon verstanden. :)


Gruß Hawkeye

100nF 14. Apr 2006 10:48

Re: Prüfen ob Integer in Array?
 
hallo Hawkeye219,

danke für deine antwort, es funktioniert wunderbar :bounce1:

gruss
urbanbruhin

3_of_8 14. Apr 2006 11:10

Re: Prüfen ob Integer in Array?
 
Noch einfacher: Result:=s=[0..9];


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:39 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz