Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Kleinste Zahl


paderborner - Mi 22.04.09 14:41
Titel: Kleinste Zahl
Hallo,

ich möchte eine Delphi-Programm schreiben (also in Pascal) mit dem über 3 Edit-Felder drei Zahlen einlesen kann und Delphi mir dann in einem Label die kleinste von den drei Zahlen ausgibt. Leider funktioniert das bisher nicht. Woran könnte das liegen?



Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
procedure TForm1.Button1Click(Sender: TObject);
VAR z1,z2,z3:integer;
    ergebnis: integer;

begin

if z1>z2 then ergebnis:=z2 else ergebnis:=z1;
if z2>z3 then ergebnis := z3;

label1.Caption := StrToInt(ergebnis);


end;

end.


z1,z2 ...sind die 3 Edit-Felder.

Danke schon mal im vorraus.

Moderiert von user profile iconChristian S.: Code- durch Delphi-Tags ersetzt


Hidden - Mi 22.04.09 14:50

Hi :)

Du hast da einen logischen Fehler drin: Um Min(a; b; c) zu bilden, kannst du auch Min(Min(a; b); c) bilden und das ganze so auf zwei Argumente pro Min()-Aufruf reduzieren. Was du aber machst, ist Min(z2, z3) für z1 > z2 und Min(z2, z3) sonst, wobei du aber im letzten Fall auf z2 prüfst und z1 ausgibst.

Du musst also auch wirklich Min(z1, z2) = 'ergebnis' mit z3 vergleichen, nicht in jedem Fall z2 mit z3.

Hilft das? ;)


iKilledKenny - Mi 22.04.09 14:54

Ich glaube, der Denkfehler liegt darin begründet, dass z1,z2,z3 Integer-Variablen sind und eben keine Edit-Felder. Du solltest also vor dem von Hidden angemerkten Vergleich die Texte aus den Edits in Integer konvertieren.


Delphi-Quelltext
1:
z1 := StrToInt (Edit1.Text);                    


Das ganze kann/muss dann noch mit Gültigkeitsprüfung versehen werden.

Um dann das Ergebnis auszugeben muss eine Konvertierung von Integer nach String passieren.


Delphi-Quelltext
1:
Label1.Caption := IntToStr (ergebnis);                    


paderborner - Mi 22.04.09 15:07

user profile iconHidden hat folgendes geschrieben Zum zitierten Posting springen:
Hi :)


Du musst also auch wirklich Min(z1, z2) = 'ergebnis' mit z3 vergleichen, nicht in jedem Fall z2 mit z3.

Hilft das? ;)


Hi... danke erstmal. Allerdings bin nicht ich mir jetzt nich sicher, wie ich das umsezten soll. (sorry). Nehmen wir mal an, ich würde nur von 2 Zahlen die kleinste heraus haben wollen. Dann könne ich doch schreiben:


Delphi-Quelltext
1:
if z1>z2 then ergebnis:=z2 else ergebnis:=z1;                    


Doch leider wird mir als Ergebniss dann eine völlig falsche Zahl angegeben..

Mfg
paderborner

Moderiert von user profile iconChristian S.: Code- durch Delphi-Tags ersetzt


Hidden - Mi 22.04.09 16:05

Hi :)

Am besten du zeigst mal den Quelltext fürs ein- und Auslesen der Zahlen. Welche Zahlen stekst du denn rein, welchen Output erwartest du und welcher kommt denn eigentlich?

mfG,


paderborner - Mi 22.04.09 18:28

Der Code für das einlesen der Zahlen aus den Edit-Feldern ist hier:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
procedure TForm1.Edit1Change(Sender: TObject);
begin
z1 := StrToInt (Edit1.Text);
end;

procedure TForm1.Edit2Change(Sender: TObject);
begin
z2 := StrToInt (Edit2.Text)
end;

procedure TForm1.Edit3Change(Sender: TObject);
begin
z3 := StrToInt (Edit3.Text)
end;

end.


Moderiert von user profile iconGausi: Code- durch Delphi-Tags ersetzt


jaenicke - Mi 22.04.09 19:07

user profile iconpaderborner hat folgendes geschrieben Zum zitierten Posting springen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
procedure TForm1.Button1Click(Sender: TObject);
VAR z1,z2,z3:integer;
    ergebnis: integer;

begin

if z1>z2 then ergebnis:=z2 else ergebnis:=z1;
Da du gleichnamige lokale Variablen deklariert hast, werden die globalen mit den eingelesenen Werten ja ignoriert.

Aber was hat es für einen Sinn das OnChange der Edits zu benutzen? :shock:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
procedure TForm1.Button1Click(Sender: TObject);
var
  z1, z2, z3: Integer;
  ergebnis: Integer;
begin
  z1 := StrToInt(Edit1.Text);
  z2 := StrToInt(Edit2.Text);
  z3 := StrToInt(Edit3.Text);

  if z1 > z2 then
    ergebnis := z2
  else
    ergebnis := z1;
  ...

  EditErgebnis.Text := ...


paderborner - Mi 22.04.09 19:30

Yeahh!! Danke an Euch alle! Es funktioniert 8) 8) . Hier der Code:


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
procedure TForm1.Button1Click(Sender: TObject);
var
  z1, z2, z3: Integer;
  ergebnis: Integer;
begin
  z1 := StrToInt(Edit1.Text);
  z2 := StrToInt(Edit2.Text);
  z3 := StrToInt(Edit3.Text);

  if z1 > z2 then
    ergebnis := z2
  else
    ergebnis := z1;

  if z2 > z3 then
    ergebnis := z3
  else
    ergebnis := z2;

    if z1 > z3 then
    ergebnis := z3
  else
    ergebnis := z1;
  

  Label2.Caption := IntToStr (ergebnis);

  end;

  end.


Schöne grüße aus Paderborn :wink:


jakobwenzel - Mi 22.04.09 19:32

Nee, so funktioniert das nur wenn z2 nicht das größte kleinste ist.
So gehts:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
procedure TForm1.Button1Click(Sender: TObject);
var
  z1, z2, z3: Integer;
  ergebnis: Integer;
begin
  z1 := StrToInt(Edit1.Text);
  z2 := StrToInt(Edit2.Text);
  z3 := StrToInt(Edit3.Text);

  if z1 > z2 then
    ergebnis := z2
  else
    ergebnis := z1;

  if z3 < ergebnis then
    ergebnis := z3;
  

  Label2.Caption := IntToStr (ergebnis);

  end;

  end.

EDIT: @jaenicke: stimmt, ich dachte irgendwie an größte und nicht kleinste Zahl


jaenicke - Mi 22.04.09 19:32

Wie wär eher so?

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
procedure TForm1.Button1Click(Sender: TObject);
var
  z1, z2, z3: Integer;
  ergebnis: Integer;
begin
  z1 := StrToInt(Edit1.Text);
  z2 := StrToInt(Edit2.Text);
  z3 := StrToInt(Edit3.Text);

  if z1 > z2 then
    ergebnis := z2
  else
    ergebnis := z1;

  if ergebnis > z3 then
    ergebnis := z3;
  
  Label2.Caption := IntToStr(ergebnis);
end;
// EDIT:
@user profile iconjakobwenzel: Nee, falschrum das zweite if. ;-)


Delete - Mi 22.04.09 20:08

Oder so?

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
uses math;

procedure TForm1.Button1Click(Sender: TObject);
var
  z1, z2, z3: Integer;
  ergebnis: Integer;
begin
  z1 := StrToInt(Edit1.Text);
  z2 := StrToInt(Edit2.Text);
  z3 := StrToInt(Edit3.Text);

  ergebnis := MinIntValue([z1,z2,z3]);
  Label2.Caption := IntToStr(ergebnis);
end;


jaenicke - Mi 22.04.09 20:13

Wobei das ja vermutlich ne Übung für die Schule ist, da ist die Lösung wohl nicht erwünscht. :mrgreen:


Die Muhkuh - Mi 22.04.09 20:17

Sollte man nicht lieber noch StrToIntDef oder TryStrToInt verwenden, dass es bei Fehleingaben nicht knallt?


Delete - Mi 22.04.09 20:18

Wenn man etwas in Delphi schreiben soll, wieso soll man da nicht bereits eingebaute Funktionen nutzen? Macht ja irgendwie keinen Sinn.