![]() |
Vergleich von zwei eindimensionalen Arrays
Hallo :)
Ich bin dabei, meine Lazarus- bzw. Pascalkenntnisse aufzufrischen und habe ein Problem, was ich mir selber nicht wirklich erklären kann. Zunächst einmal kurz die Info: ich habe schon mehrere Foren und Webseiten durchsucht und zwar ähnliche Themen gefunden, aber eine Lösung für mein Problem hat es mir nicht gebracht... :pale: Mein Ziel: ein Programm, mit dem ich zwei zufällige eindimensionale Arrays vom Typ integer vergleichen kann. Mein Ansatz: ich generiere über zwei Buttons jeweils ein Array (ja man könnte es auch mit einem Button machen, aber das spielt erstmal keine Rolle :) ) mit 5 unterschiedlichen Zahlen zwischen 0 und 10. Als Beispiel mal einer der beiden Buttons (der andere dann eben mit j statt i):
Code:
(Hinweis dazu: die Variablen i und j sowie die Arrays arr1[i] und arr2[j] habe ich global deklariert.
procedure TForm1.b_arraycreate1Click(Sender: TObject);
begin randomize; for i := 1 to 5 do arr1[i] := random(10); end;
Code:
)
var
Form1: TForm1; arr1: array[0..5] of integer; arr2: array[0..5] of integer; i,j:integer; Soweit, so gut. Ich habe die jeweilige Belegung der Arrays auch zum Test, ob die beiden Arrays wirklich immer wieder per Knopfdruck zufällig generiert werden, in ein Memofeld ausgeben lassen. DAS funktioniert noch. Jetzt aber das Problem, der Vergleich beider Arrays. Ziel: ich möchte per Knopfdruck ein Ausgabefenster erhalten, das mir mitteilt, ob eine Zahl in beiden Arrays vorkommt und falls ja, an welcher Stelle in Array 1 und an welcher Stelle in Array 2. Hier mein Code dazu:
Code:
Lazarus kriegt das auch problemlos kompiliert, nur leider zeigt der mir - egal wie die Arrays bestückt sind - an, dass es keine Übereinstimmung gibt. Auch wenn beide Übereinstimmungen haben. Noch bekloppter: wenn ich das "else" mit der Anzeige für fehlende Übereinstimmung rausnehme, funktioniert das (mehr schlecht als recht, da das Fenster nach Knopfdruck nur erscheint, wenn die Arrays gleiche Elemente enthalten) plötzlich.
procedure TForm1.b_vergleichClick(Sender: TObject);
var v:boolean; begin for i := 1 to 5 do begin for j := 1 to 5 do begin if arr1[i] = arr2[j] then begin v:=true; end else begin v:=false; end; end; end; if v = true then begin ShowMessage('Es gibt eine Übereinstimmung in beiden Arrays! Es handelt sich um den Wert ' +IntToStr(arr1[i])+ ', der sich in Array 1 an Position ' +IntToStr(i)+ ' und in Array 2 an Position ' +IntToStr(j)+ ' befindet.'); end else begin ShowMessage('Es gibt keine Übereinstimmung in beiden Arrays. Generiere doch einfach zwei neue Arrays!'); end end; Ich habe wirklich absolut keine Ahnung, woran das liegen könnte und ich würde mich sehr freuen, wenn mir hier jemand helfen könnte :oops: :) Egal, ob ja oder nein, vielen Dank schon mal für's Lesen :) Liebe Grüße Delphinus |
AW: Vergleich von zwei eindimensionalen Arrays
Dein Code hier:
Delphi-Quellcode:
Lässt sich ja zu dem hier vereinfachen:
for i := 1 to 5 do
begin for j := 1 to 5 do begin if arr1[i] = arr2[j] then // Übrigens immer true, wenn i gleich j ! begin v:=true; end else begin v:=false; end; end; end;
Delphi-Quellcode:
v := arr1[5] = arr2[5];
Weil du v in jedem Durchlauf setzt, ist eigentlich nur der letzte Durchlauf relevant. Falls du wissen möchtest, ob es gleiche Element gibt, darfst du bei ungleichen Elementen das Ergebnis nicht überschreiben ;-) |
AW: Vergleich von zwei eindimensionalen Arrays
Zitat:
Delphi-Quellcode:
->
if v = true
Delphi-Quellcode:
Deine Ausgabe ist ja ausserhalb der geschachtelten Schleife, sowohl i, wie auch j haben also immer die maximalen Werte und nicht die Werte bei denen die Inhalte der Arrays übereinstimmen.
if v then
|
AW: Vergleich von zwei eindimensionalen Arrays
Vielen lieben Dank erstmal für die beiden interessanten Hinweise. Leider weiß ich nicht, ob ich damit aber auch wirklich eine praktikable Lösung für mein Problem finden werd.
Es ist wirklich sinnlos, dass ich die Ausgabe nach Beendigung der geschachtelten Schleife machen wollte :oops: :-D :-D Als Konsequenz aus Euren Aussagen würde mir nur Folgendes einfallen (Mittlerweile würde es mir zur Not auch reichen, einfach ausgeben zu lassen, ob eine Gemeinsamkeit vorliegt oder nicht):
Code:
Würde das klappen? :(
procedure TForm1.b_vergleichClick(Sender: TObject);
var v:boolean; begin for i := 1 to 5 do begin for j := 1 to 5 do begin if arr1[i] = arr2[j] then begin v:=true; ShowMessage('Gemeinsamkeit gefunden.'); break; end else begin v:=false; end; end; end; if v = false then ShowMessage('Keine Gemeinsamkeiten.'); Liebe Grüße |
AW: Vergleich von zwei eindimensionalen Arrays
Niemals auf false abprüfen!
Delphi-Quellcode:
if not v then ShowMessage('Keine Gemeinsamkeiten.');
|
AW: Vergleich von zwei eindimensionalen Arrays
v ist ausserhalb der Methode nicht bekannt.
Wenn eine Gemeinsamkeit gefunden wurde, kannst Du die Routine mit exit/break verlassen. Grüße Klaus |
AW: Vergleich von zwei eindimensionalen Arrays
Eventuell sowas? (nur hingedaddelt und ungetestet)
Delphi-Quellcode:
procedure TForm1.b_vergleichClick(Sender: TObject);
const csErfolg = 'Es gibt eine Übereinstimmung in beiden Arrays! ' + #13 + 'Es handelt sich um den Wert %d, ' + #13 + 'der sich in Array 1 an Position %d ' +#13 + 'und in Array 2 an Position %d befindet.'; csMisserfolg = 'Es gibt keine Übereinstimmung in beiden Arrays. ' + #13 + 'Generiere doch einfach zwei neue Arrays!'; var v : boolean; s : String; begin for i := 1 to 5 do begin for j := 1 to 5 do begin v := arr1[i] = arr2[j]; if v then break; end; if v then break; end; case v of true : s := Format(csErfolg,[arr1[i],i,j]); false: s := csMisserfolg; end; ShowMessage(s); end; |
AW: Vergleich von zwei eindimensionalen Arrays
Warum ein case? Einen Boolean nie auf false abprüfen!!!!
Delphi-Quellcode:
if v
then s := Format(csErfolg,[arr1[i],i,j]) else s := csMisserfolg; |
AW: Vergleich von zwei eindimensionalen Arrays
Zitat:
Delphi-Quellcode:
Besser? ;-)
case v of
true : s := Format(csErfolg,[arr1[i],i,j]); else s := csMisserfolg; end; |
AW: Vergleich von zwei eindimensionalen Arrays
Nein, auf true zu prüfen ist sogar noch schlimmer.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:53 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 by Thomas Breitkreuz