Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Lazarus (IDE) (https://www.delphipraxis.net/81-lazarus-ide/)
-   -   Vergleich von zwei eindimensionalen Arrays (https://www.delphipraxis.net/200120-vergleich-von-zwei-eindimensionalen-arrays.html)

Delphinus1 21. Mär 2019 21:24

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:
procedure TForm1.b_arraycreate1Click(Sender: TObject);
begin
   randomize;
   for i := 1 to 5 do
      arr1[i] := random(10);
end;
(Hinweis dazu: die Variablen i und j sowie die Arrays arr1[i] und arr2[j] habe ich global deklariert.
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:
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;
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.

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

jfheins 22. Mär 2019 06:55

AW: Vergleich von zwei eindimensionalen Arrays
 
Dein Code hier:
Delphi-Quellcode:
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;
Lässt sich ja zu dem hier vereinfachen:
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 ;-)

mkinzler 22. Mär 2019 07:13

AW: Vergleich von zwei eindimensionalen Arrays
 
Zitat:

Delphi-Quellcode:
// Übrigens immer true, wenn i gleich j !

Selbiges gilt für
Delphi-Quellcode:
if v = true
->
Delphi-Quellcode:
if v then
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.

Delphinus1 22. Mär 2019 08:48

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:
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.');
Würde das klappen? :(

Liebe Grüße

mkinzler 22. Mär 2019 09:18

AW: Vergleich von zwei eindimensionalen Arrays
 
Niemals auf false abprüfen!
Delphi-Quellcode:
if not v then ShowMessage('Keine Gemeinsamkeiten.');

Klaus01 22. Mär 2019 09:21

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

Delphi.Narium 22. Mär 2019 09:50

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;

mkinzler 22. Mär 2019 10:00

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;

Delphi.Narium 22. Mär 2019 10:05

AW: Vergleich von zwei eindimensionalen Arrays
 
Zitat:

Zitat von mkinzler (Beitrag 1428362)
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;

weils kürzer aussieht ;)
Delphi-Quellcode:
case v of
  true : s := Format(csErfolg,[arr1[i],i,j]);
else  
  s := csMisserfolg;
end;
Besser? ;-)

DeddyH 22. Mär 2019 10:43

AW: Vergleich von zwei eindimensionalen Arrays
 
Nein, auf true zu prüfen ist sogar noch schlimmer.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:06 Uhr.
Seite 1 von 2  1 2      

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