Autor Beitrag
paderborner
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Mi 22.04.09 14:41 
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?


ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2242
Erhaltene Danke: 55

Win10
VS Code, Delphi 2010 Prof.
BeitragVerfasst: 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? ;)

_________________
Centaur spears can block many spells, but no one tries to block if they see that the spell is a certain shade of green. For this purpose it is useful to know some green stunning hexes. (HPMoR)
iKilledKenny
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 394
Erhaltene Danke: 8

Win XP
D5 Prof, C# Express 2005
BeitragVerfasst: 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.

ausblenden 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.

ausblenden Delphi-Quelltext
1:
Label1.Caption := IntToStr (ergebnis);					
paderborner Threadstarter
Hält's aus hier
Beiträge: 11



BeitragVerfasst: 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:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2242
Erhaltene Danke: 55

Win10
VS Code, Delphi 2010 Prof.
BeitragVerfasst: 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,

_________________
Centaur spears can block many spells, but no one tries to block if they see that the spell is a certain shade of green. For this purpose it is useful to know some green stunning hexes. (HPMoR)
paderborner Threadstarter
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Mi 22.04.09 18:28 
Der Code für das einlesen der Zahlen aus den Edit-Feldern ist hier:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 22.04.09 19:07 
user profile iconpaderborner hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden 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:
ausblenden 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 Threadstarter
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Mi 22.04.09 19:30 
Yeahh!! Danke an Euch alle! Es funktioniert 8) 8) . Hier der Code:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1889
Erhaltene Danke: 1

XP home, ubuntu
BDS 2006 Prof
BeitragVerfasst: Mi 22.04.09 19:32 
Nee, so funktioniert das nur wenn z2 nicht das größte kleinste ist.
So gehts:
ausblenden 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

_________________
I thought what I'd do was, I'd pretend I was one of those deaf-mutes.


Zuletzt bearbeitet von jakobwenzel am Mi 22.04.09 19:40, insgesamt 1-mal bearbeitet
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 22.04.09 19:32 
Wie wär eher so?
ausblenden 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. ;-)
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 22.04.09 20:08 
Oder so?
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 33



BeitragVerfasst: Mi 22.04.09 20:17 
Sollte man nicht lieber noch StrToIntDef oder TryStrToInt verwenden, dass es bei Fehleingaben nicht knallt?
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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.