Autor Beitrag
Dude566
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1592
Erhaltene Danke: 79

W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
BeitragVerfasst: Mi 24.09.08 19:51 
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:
ausblenden volle Höhe 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2077
Erhaltene Danke: 2

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: 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?

_________________
PROGRAMMER: A device for converting coffee into software.
Dude566 Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1592
Erhaltene Danke: 79

W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 183
Erhaltene Danke: 7

Win7
Delphi XE5 Starter, RAD Studio XE7 Pro
BeitragVerfasst: 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

_________________
Es gibt keine dummen Fragen, nur dumme Antworten.


Zuletzt bearbeitet von jackle32 am Mi 24.09.08 22:48, insgesamt 1-mal bearbeitet
Xentar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2077
Erhaltene Danke: 2

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: 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 :(

_________________
PROGRAMMER: A device for converting coffee into software.
Dude566 Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1592
Erhaltene Danke: 79

W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 489
Erhaltene Danke: 14

Win 10, Win 8, Debian GNU/Linux
Delphi 10.1 Berlin, Java, C#
BeitragVerfasst: Do 25.09.08 08:56 
user profile iconDude566 hat folgendes geschrieben:

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);  // 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?

ausblenden 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. ;)
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 25.09.08 10:41 
Ich würde aus der Berechnung eine Funktion machen, um die Logik von der Darstellung zu trennen.
ausblenden 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.


Zuletzt bearbeitet von DeddyH am Do 25.09.08 15:57, insgesamt 1-mal bearbeitet
baka0815
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 489
Erhaltene Danke: 14

Win 10, Win 8, Debian GNU/Linux
Delphi 10.1 Berlin, Java, C#
BeitragVerfasst: 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.
ausblenden 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.
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 489
Erhaltene Danke: 14

Win 10, Win 8, Debian GNU/Linux
Delphi 10.1 Berlin, Java, C#
BeitragVerfasst: 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: