AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Lazarus (IDE) Vergleich von zwei eindimensionalen Arrays

Vergleich von zwei eindimensionalen Arrays

Ein Thema von Delphinus1 · begonnen am 21. Mär 2019 · letzter Beitrag vom 22. Mär 2019
Antwort Antwort
Seite 1 von 2  1 2   
Delphinus1

Registriert seit: 20. Nov 2018
2 Beiträge
 
#1

Vergleich von zwei eindimensionalen Arrays

  Alt 21. Mär 2019, 22:24
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...

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
Egal, ob ja oder nein, vielen Dank schon mal für's Lesen

Liebe Grüße
Delphinus
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.578 Beiträge
 
#2

AW: Vergleich von zwei eindimensionalen Arrays

  Alt 22. Mär 2019, 07:55
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:
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
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.804 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Vergleich von zwei eindimensionalen Arrays

  Alt 22. Mär 2019, 08:13
Zitat:
// Übrigens immer true, wenn i gleich j !
Selbiges gilt für
if v = true -> 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.
Markus Kinzler
  Mit Zitat antworten Zitat
Delphinus1

Registriert seit: 20. Nov 2018
2 Beiträge
 
#4

AW: Vergleich von zwei eindimensionalen Arrays

  Alt 22. Mär 2019, 09:48
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

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
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.804 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Vergleich von zwei eindimensionalen Arrays

  Alt 22. Mär 2019, 10:18
Niemals auf false abprüfen!
if not v then ShowMessage('Keine Gemeinsamkeiten.');
Markus Kinzler
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.639 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: Vergleich von zwei eindimensionalen Arrays

  Alt 22. Mär 2019, 10:21
v ist ausserhalb der Methode nicht bekannt.

Wenn eine Gemeinsamkeit gefunden wurde, kannst Du die Routine mit exit/break verlassen.

Grüße
Klaus
Klaus

Geändert von Klaus01 (22. Mär 2019 um 11:16 Uhr)
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
1.950 Beiträge
 
Delphi 7 Professional
 
#7

AW: Vergleich von zwei eindimensionalen Arrays

  Alt 22. Mär 2019, 10:50
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;
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.804 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: Vergleich von zwei eindimensionalen Arrays

  Alt 22. Mär 2019, 11:00
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;
Markus Kinzler
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
1.950 Beiträge
 
Delphi 7 Professional
 
#9

AW: Vergleich von zwei eindimensionalen Arrays

  Alt 22. Mär 2019, 11:05
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?
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.310 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: Vergleich von zwei eindimensionalen Arrays

  Alt 22. Mär 2019, 11:43
Nein, auf true zu prüfen ist sogar noch schlimmer.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:56 Uhr.
Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf