Entwickler-Ecke
Sonstiges (Delphi) - BMI Rechner
Dude566 - Mi 24.09.08 19:51
Titel: BMI Rechner
Also ich habe vor einen BMI Rechner zu erstellen, aber er gibt mir bei den Variablen die ich mit float deklariert habe einen Fehler an, wenn ich sie als double angebe läuft das Programm. Jedoch das Ergebnis kann auf keinen Fall stimmen.
Schaut doch bitte mal drüber:
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: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, jpeg, ExtCtrls;
type TForm1 = class(TForm) Image1: TImage; Label1: TLabel; Edit1: TEdit; Label2: TLabel; Label3: TLabel; Edit2: TEdit; Label4: TLabel; RadioButton1: TRadioButton; Button1: TButton; Image2: TImage; RadioButton2: TRadioButton; Edit3: TEdit; procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); private public end;
var Form1: TForm1; groese1 : float; groese2 : float; gewicht : float; bmi : float;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject); begin Image2.Visible := false; end;
procedure TForm1.Button1Click(Sender: TObject); begin gewicht := StrToFloat(Edit1.Text); groese1 := StrToFloat(Edit2.Text);
if RadioButton2.Checked then begin Image2.Visible := false; groese2 := groese1 * groese1; bmi := gewicht / groese2; Edit3.Text := FloatToStr(bmi); end;
if RadioButton1.Checked then begin Image2.Visible := true; groese2 := groese1 * groese1; bmi := gewicht / groese2; Edit3.Text := FloatToStr(bmi); end;
end;
end. |
Xentar - Mi 24.09.08 20:04
Die rechnung sieht erstmal richtig aus.. und Double sollte auch stimmen.
Was für Werte bekommst du denn? Du weißt, dass die Größe in Metern, nicht in cm, angegeben wird?
Dude566 - Mi 24.09.08 22:11
Wenn ich 80kg bei 1,80 Meter angebe, zeigt er einen BMI von "0,00246913580246914" an.
Ich bin verwirrt... was ist falsch???
jackle32 - Mi 24.09.08 22:47
Hallo,
dein Fehler ist, das du zur Berechnung des BMI die Größe in Meter nehmen musst. Da ich denke das du in deinem Edit cm eingibst musst du den Wert für groesse1 noch durch 100 rechnen bevor du ihn quadrierst.
Also für deine Beispiel:
NICHT 80/(180*180)= 0,002469
Sondern 80/(1,8*1,8 ) = 24,691, der Wert ist auch realistisch
Grüße Jack
Xentar - Mi 24.09.08 22:48
Hab ich erwähnt, dass man die Größe in Metern, und NICHT in Zentimetern, angeben muss? *grübel* *scroll* ja, hab ich.
Also, hab das mal schnell nachgestellt. Wenn ich in Edit2 "1,80" eintrage, kommt das korrekte Ergebnis raus, nämlich 24,69
Wenn ihc in Edit2 den Wert "180" eintrag, bekomm ich das Ergebnis von dir.
Och man, zu langsam :(
Dude566 - Mi 24.09.08 22:58
Ja sorry da kam die ersten Version in der ich noch mit Zentimetern hatte mit der Zweiten durcheinander.
Ich hatte als Wert für das Edit2 feld 180 "cm", habe es aber nicht umgeändert.
baka0815 - Do 25.09.08 08:56
Titel: Re: BMI Rechner
Dude566 hat folgendes geschrieben: |
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); begin gewicht := StrToFloat(Edit1.Text); groese1 := StrToFloat(Edit2.Text);
if RadioButton2.Checked then begin Image2.Visible := false; groese2 := groese1 * groese1; bmi := gewicht / groese2; Edit3.Text := FloatToStr(bmi); end;
if RadioButton1.Checked then begin Image2.Visible := true; groese2 := groese1 * groese1; bmi := gewicht / groese2; Edit3.Text := FloatToStr(bmi); end;
end; | |
Die beiden RadioButtons machen doch fast das gleiche, nur dass bei dem einen Image2 sichtbar ist und bei dem anderen nicht, oder?
Delphi-Quelltext
1: 2: 3: 4: 5:
| groese2 := groese1 * groese1; bmi := gewicht / groese2; Edit3.Text := FloatToStr(bmi);
Image2.Visible := RadioButton1.Checked and not RadioButton2.Checked; |
Müßte das gleiche machen, nur deutlich kürzer. ;)
Delete - Do 25.09.08 10:41
Ich würde aus der Berechnung eine Funktion machen, um die Logik von der Darstellung zu trennen.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| function BMI(const gew, groesse: double): double; begin Result := gew/sqr(groesse); end;
procedure TForm1.Button1Click(Sender: TObject); var gewicht, groesse: double; begin gewicht := StrToFloatDef(Edit1.Text,0); groesse := StrToFloatDef(Edit2.Text,1); Edit3.Text := FloatToStr(BMI(gewicht,groesse)); Image2.Visible := RadioButton1.Checked; end; |
Getippt und nicht getestet.
baka0815 - Do 25.09.08 10:56
DeddyH hat folgendes geschrieben: |
Ich würde aus der Berechnung eine Funktion machen, um die Logik von der Darstellung zu trennen. Delphi-Quelltext 1: 2: 3: 4: 5:
| function BMI(const gew, groesse: double): double; begin Result := gew/sqr(groesse); end; [...] |
Getippt und nicht getestet. |
sqr (
sqrt?) ist auch falsch (Square root = Wurzel), du meinst
pow.
Delete - Do 25.09.08 11:07
sqr(), nicht sqrt(). Steht in Unit System und die Hilfe dazu sagt:
| Zitat: |
| Die Funktion Sqr gibt das Quadrat eines Wertes zurück. |
;)
baka0815 - Do 25.09.08 12:34
DeddyH hat folgendes geschrieben: |
sqr(), nicht sqrt(). Steht in Unit System und die Hilfe dazu sagt: | Zitat: | | Die Funktion Sqr gibt das Quadrat eines Wertes zurück. |
;) |
Wenn man keine Ahnung hat... :oops:
Nächstes mal gucke ich erst nach, bevor ich sowas schreib... :roll:
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!