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
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  groese1 : float;
  groese2 : float;
  gewicht : float;
  bmi     : float;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);  // On Create
begin
 Image2.Visible := false;
end;

procedure TForm1.Button1Click(Sender: TObject);  // Berechnen
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
user profile iconDude566 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);  // Berechnen
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);  // Berechnen
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

user profile iconDeddyH 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

user profile iconDeddyH 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: