Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Arraywerte vergleichen


Noctis - Fr 06.03.09 00:46
Titel: Arraywerte vergleichen
Abend,

Sitze jetzt seit 6 Stunden an einem Programm, jetzt komm ich aber an einer Stelle nicht mehr weiter und mir brummt langsam der Kopf.

Ich habe mit record mehrere arrays (integer) definiert.
die werte werden eingelesen und an eine listbox übergeben.

nun möchte ich in der listbox die eingegebenen werte vergleichen um herauszufinden welches der größte bzw der niedrigste wert dieser listbox ist.

den größten/niedrigste wert (mach ich dann mit einer radiobox) wert soll dann erstmal an ein edit feld übergeben werden.

wie könnte man das am besten bewerkstelligen?

bis jetzt bin ich bei

Delphi-Quelltext
1:
2:
3:
 FOR i := 0 TO ListBox1.Items.Count - 1 DO
      if listbox1.Items[i] > listbox1.Items[i+1then
         edit1.text:=listbox1.Items[i];


bin mir erstmal noch ein kaffee machen ;)


Moderiert von user profile iconNarses: Topic aus VCL (Visual Component Library) verschoben am Fr 06.03.2009 um 01:13


Narses - Fr 06.03.09 00:54

Moin!

user profile iconNoctis hat folgendes geschrieben Zum zitierten Posting springen:
Ich habe mit record mehrere arrays (integer) definiert.
[...]
nun möchte ich in der listbox die eingegebenen werte vergleichen um herauszufinden welches der größte bzw der niedrigste wert dieser listbox ist.
Wenn die Elemente der Listbox Zahlen sind, dann darfst du keinen Stringvergleich machen (was du aktuell tust), das klappt nicht. Du mußt die Werte als Zahl vergleichen. :idea:

user profile iconNoctis hat folgendes geschrieben Zum zitierten Posting springen:
bis jetzt bin ich bei

Delphi-Quelltext
1:
2:
3:
 FOR i := 0 TO ListBox1.Items.Count 1 DO
      if listbox1.Items[i] > listbox1.Items[i+1then
         edit1.text:=listbox1.Items[i];
Das knallt auf jeden Fall, da du über die Anzahl der Elemente hinaus zugreifst. :?

user profile iconNoctis hat folgendes geschrieben Zum zitierten Posting springen:
wie könnte man das am besten bewerkstelligen?
Ansatz:
- Den ersten Wert aus der Listbox als größten/kleinsten Wert annehmen
- In einer Schleife vom 2. bis zum letzten Element durchgehen und schauen, ob der aktuelle Wert größer/kleiner ist

cu
Narses


jaenicke - Fr 06.03.09 00:58

user profile iconNoctis hat folgendes geschrieben Zum zitierten Posting springen:
Ich habe mit record mehrere arrays (integer) definiert.
die werte werden eingelesen und an eine listbox übergeben.

nun möchte ich in der listbox die eingegebenen werte vergleichen um herauszufinden welches der größte bzw der niedrigste wert dieser listbox ist.
Moment mal, was hat es für einen Sinn die Werte erst in einen String umzuwandeln und dann in der ListBox irgendwie vergleichen, wenn du sie doch voeher schon direkt als Zahlen hast?

user profile iconNoctis hat folgendes geschrieben Zum zitierten Posting springen:
den größten/niedrigste wert (mach ich dann mit einer radiobox) wert soll dann erstmal an ein edit feld übergeben werden.
Wenn du mit dem Integerarray arbeitest, dann kannst du direkt vorgehen wie user profile iconNarses geschrieben hat und am Ende den kleinsten Wert aus der entsprechenden Variable ins Edit schreiben.


Noctis - Fr 06.03.09 01:13

naja, Problem ist nur dass ich nicht recht weiss wie ich es anstellen soll.

das mit dem integer <-> string bringt mich hier auch schon ein wenig durcheinander, da ich in der methode die ich jetzt habe auch erst wieeder vom string in den integerwert umrechne.

wie soll ich die werte denn vorher vergleichen?


..das habe ich eben probiert


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
begin
  listbox1.Items[1]:=max;
    for I := 1 to ListBox3.Items.Count do
      begin
        if listbox3.items[i] > listbox3.Items[1then
        listbox3.items[i]:=max;
      end;

      edit1.text:=max;

  end;


Narses - Fr 06.03.09 01:20

Moin!

user profile iconNoctis hat folgendes geschrieben Zum zitierten Posting springen:
das mit dem integer <-> string bringt mich hier auch schon ein wenig durcheinander, da ich in der methode die ich jetzt habe auch erst wieeder vom string in den integerwert umrechne.
Machst du doch gar nicht, jedenfalls nicht in dem Code, den du gezeigt hast. :gruebel:

user profile iconNoctis hat folgendes geschrieben Zum zitierten Posting springen:
wie soll ich die werte denn vorher vergleichen?
Fragen wir mal anders rum: Wie kommen denn die Werte in die Listbox? ;)

cu
Narses


Noctis - Fr 06.03.09 01:26

in dem code oben fehlt vor jedem max das StrtoInt ^^

*schnief* ja jetzt seh ich das auch gerade, guck wahrscheinlich heute schon zulange auf delphie


Delphi-Quelltext
1:
 liste[i].jump:=strtoint(Edit3.Text);                    


und dann ->


Delphi-Quelltext
1:
Listbox3.Items.Add(inttostr(liste[i].jump));                    


so ejtzt sind die werte als string in der liste.
meine logik war dabei: ich kann die werte nicht vergleichen bevor diese nicht in der liste eingetragen sind.


Narses - Fr 06.03.09 01:29

Moin!

user profile iconNoctis hat folgendes geschrieben Zum zitierten Posting springen:
so ejtzt sind die werte als string in der liste.
meine logik war dabei: ich kann die werte nicht vergleichen bevor diese nicht in der liste eingetragen sind.
Und das ist genau "falsch rum" :arrow: du solltest die Minimum/Maximum-Suche vor der Ausgabe in die Listbox machen (naja, genau genommen sollte es egal sein, wann du das machst, wenn du die Werte in der Listbox nicht mehr veränderst). :idea: So sparst du dir nämlich das ständige Umwandeln für die numerischen Vergleiche. ;)

cu
Narses


Noctis - Fr 06.03.09 01:47

mir missfällt bloß leider die Syntax um werte eines arrays zu vergleichen ^^, sonst wäre mir unter umständen schon vorhin eine idee gekommen.

nach dem motto


Delphi-Quelltext
1:
2:
3:
4:
case of
a[1] > a [2]
a[2] > a[3]
...


möchte ich es ja nun nicht gerade machen :S


Narses - Fr 06.03.09 01:49

Moin!

Wo ist das Problem? Geht z.B. so:

Delphi-Quelltext
1:
if (liste[i].jump > liste[i+1].jump) then                    
Schleife drum rum, fertig. :)

cu
Narses


Noctis - Fr 06.03.09 02:08

ahhhh :D


gesagt, getan.


Delphi-Quelltext
1:
2:
3:
for i := 1 to 20 do
if (liste[i].jump > liste[i+1].jump) then
max:=liste[i].jump;


aber irgendwie hab ich noch einen fehler in der ausgabe, er gibt nicht [i]>[i+1] sondern den zuletzt eingegebenen [i]-wert ein :?


Narses - Fr 06.03.09 02:11

Moin!

user profile iconNoctis hat folgendes geschrieben Zum zitierten Posting springen:
aber irgendwie hab ich noch einen fehler in der ausgabe, er gibt nicht [i]>[i+1] sondern den zuletzt eingegebenen [i]-wert ein :?
Du hast dich ja auch nicht an das Kochrezept von weiter oben gehalten... ;)


Delphi-Quelltext
1:
2:
3:
4:
max := liste[1].jump; // erster Wert ist angenommenes Maximum
for i := 2 to 20 do // vom 2. bis zum letzten Wert schauen
  if (liste[i].jump > max) then // ist dieser Wert größer als das (bisherige) Maximum?
    max := liste[i].jump; // jup, dann merken
cu
Narses


Noctis - Fr 06.03.09 02:20

jetzt funktioniert es, danke für die investierte zeit :)

werde dann mal an dem rest des programmes weiterarbeiten :P


Narses - Fr 06.03.09 02:31

Moin!

Markierst du den Thread noch entsprechend, wenn dein Problem gelöst ist? Danke. ;)

cu
Narses