bmi rechner delphi 7 probleme

MuschBuschAffe

Cadet 2nd Year
Registriert
Aug. 2013
Beiträge
27
Was hab ich den hier alles falsch gemacht das es nicht tut ?? könnt ihr mir da bissle helfen??

Fehler sind nur "Ordinaltyp erforderlich" und "Doppeltes case-label"

und ich weis dazu gibts schon paar beiträge aber die helfen net



unit Ubmi;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;

type
TForm1 = class(TForm)
pnlErgebnis: TPanel;
btnrechnen: TButton;
btnclose: TButton;
GroupBox2: TGroupBox;
GroupBox1: TGroupBox;
Label1: TLabel;
Label2: TLabel;
edgroese: TEdit;
edgewicht: TEdit;
rgGeschlecht: TRadioGroup;
procedure btncloseClick(Sender: TObject);
procedure btnrechnenClick(Sender: TObject);
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.btncloseClick(Sender: TObject);
begin
close;
end;

procedure TForm1.btnrechnenClick(Sender: TObject);
var Groese,Gewicht,fehler : Integer;
BMI : real;
Kommentar : extended;

begin
val(edgroese.Text,Groese,fehler);
val(edgewicht.text,Gewicht,fehler);
BMI:= Gewicht/Groese*Groese;


if Form1.rgGeschlecht.ItemIndex = 0 //Berechnung Mann
then begin
case BMI of
16..19: begin
pnlErgebnis.caption:= 'Untergewicht'
end;
19..25: begin
pnlErgebnis.caption:='Normalgewicht'
end;
25..30: begin
pnlErgebnis.caption:='Übergewicht'
end;
30..40: begin
pnlErgebnis.caption:='Fettsack'
end;
end
else begin
case BMI of //Berechnung Frau
15..18: begin
pnlErgebnis.caption:= 'Untergewicht'
end;
18..24: begin
pnlErgebnis.caption:='Normalgewicht'
end;
24..29: begin
pnlErgebnis.caption:='Übergewicht'
end;
29..40: begin
pnlErgebnis.caption:='Fettsack'
end;

end;

end.
 
Schätze, die Intervalle in den Case-Statements überlappen. Für Leute, die im Gegensatz zu mir Delphi kennen, wären die Zeilennumnern, die die Fehler generieren sicher hilfreich.
 
Packs in Code-Blöcke, sonst hab ich keine Lust mich da durchzufitzen!

Ansonsten solltest du dir vlt mal klar machen was ein Ordinaltyp ist, dann würdest du die Fehlermeldung vlt auch verstehen und der zweite Fehler also die doppelten Case-Label sind genau das was es sagt ... doppelte Case-Label 19 fällt in die ersten beiden Cases, 30 in 2 und 3 usw
 
Zuletzt bearbeitet:
ich weis was ein ordinaltyp ist aber ich weis net wie ich des anders hinschreiben kann. ( der fehler is jeweils in der "case BMI of" zeile)
 
Gewöhn dir an...
- Code in Foren auch in
Code:
-Tags zu setzen
- deinen Code übersichtlich zu klammern
- Variablen in englisch zu verfassen & eines der üblichen Benennungsschemata zu nutzen, z.B. CamelCase
 
Genau der Fehler ist jeweils in der "Case-Of"-Zeile ...

aus der Delphi-Hilfe:
Zu den ordinalen Typen gehören Integer-, Zeichen-, Aufzählungs-, Teilbereichs- und Boolesche Typen. Ein ordinaler Typ definiert eine Menge von Werten mit eindeutiger Reihenfolge, in der jeder Wert mit Ausnahme des ersten einen eindeutigen Vorgänger und mit Ausnahme des letzten einen eindeutigen Nachfolger hat.

dein "16..19" ist zwar ein Teilbereichstyp aber
Bei der Definition eines Teilbereichs müssen Sie nicht den Namen des Basistyps angeben. Sie müssen nur zwei Konstanten dieses Typs vorgeben. Der ursprüngliche Typ muss ein ordinaler Typ sein, und der resultierende Typ wird ein weiterer ordinaler Typ.

ergo ... Teilbereichstypen lassen sicht nich aus dem Typ Real (deine Variable BMI ist vom Typ Real) ableiten.

Und warum in der Zeile noch ein weiterer Fehler namens "Doppelte Case-Labels" steckt hab ich dir ja schon in meinem ersten Post erklärt.

Und wie du das ganze umgehst? Auch wenn es vlt nicht schön aussieht, aber für die 4 Fälle kannst du auch einfach 4 IF-Zweige bauen.
 
und wie gibt man ein teilbereich mit if-zweigen an ?? ich dachte das geht nur mit case of-verzweigung?
 
Muss man das? Mal ganz ehrlich? If (x<19) {echo "untergewicht";}elseif(x<25){...
Ok, das war jetzt PHP-artige Notation, aber das Prinzip ist klar, oder?
 
Code:
if Form1.rgGeschlecht.ItemIndex = 0 //Berechnung Mann
then begin
  ...
end
else
...
Die Syntax von if scheinst du zu kennen. Wo ist dann das Problem den Vorschlag von Daaron zu übernehmen?
Schreib' es doch einfach mal auf Verdacht auf if um und lies dir die Fehlermeldungen vom Compiler durch. Dann nochmal nach der Syntax von if googeln.
 
Vlt bissle offtopic, aber warum machst du das hier eigentlich?
Willst du das Programmieren lernen? Wenn ja sollte ein wenig mehr Eigeninitiative und weniger Trotzigkeit an den Tag gelegt werden.
Du behauptest du hättest gegoogelt aber alle Lösungen würden bei dir nicht passen ... diese Fehler sind sehr eindeutig beschrieben und können garnicht soviele Ursachen haben das die auffindbaren Lösungen nicht passen.
Du behauptest du wüsstest was ein Ordinaltyp wäre, aber nicht wie man es anders hinschreibt ... Wenn du wüsstest was ein Ordinaltyp ist, würde man garnicht erst auf die Idee kommen es so hinzuschreiben.
Das gleiche beim IF ... aber ich vermute vielmehr das wir dir deine Info-Hausaufgaben machen mussten weil du mit Facebook beschäftigt warst als es im Unterricht dran war :(
 
Noch ein bisschen mehr Offtopic. Der BMI ist der größte Unfug den es gibt. Stell dir einen Bodybuilder mit einer Große von 1,67 vor. Dieser wiegt sagen wir mal 105Kg, bei einem Körperfettanteil von 3%. Laut BMI ist er schwer übergewichtig.

Was sagt uns der BMI? Richtig, nichts.
 
In der Fahrschule lernt man eine Formel für den Bremsweg (s = v^2 / 100), die ungefähr alle Faktoren der Realität vernachlässigt. Deshalb sollte man auf sie scheißen und einfach so schnell fahren, wie man Lust hat.

Natürlich ist die Formel für den BMI wertlos, wenn man sein Gehirn abschaltet und die Realität ignoriert. Aber sie hat genausowenig den Anspruch, die absolute Wahrheit wiederzugeben, wie die Formel für den Bremsweg.
Das ist nun einmal, was eine Faustregel ausmacht. Wenn Umstände vorhanden sind, die die Faustformel offensichtlich versagen lassen (bin grad mit einem Vierzigtonner auf einer vereisten Straße unterwegs), muss man
halt eine Formel benutzen, die für den aktuellen Fall geeigneter ist, oder falls das nicht sinnvoll ist einfach seinen Verstand benutzen.

Abgesehen davon, dass das natürlich für so eine Übung gar keine Rolle spielt, ist es also genauso falsch, eine Näherung grundsätzlich für wertlos zu erklären, weil sie ist, was sie ist, wie es falsch ist, sich unbeirrt jederzeit
auf sie zu verlassen. Am Ende des Tages ist jedes Modell der Realität nur eine mehr oder weniger gute Näherung und es ist gerade die vernünftige Wahl, welche Näherung im konkreten aktuellen Fall die beste Balance
zwischen Korrektheit und Effizienz darstellt, die den größten Wert für die Lösung des aktuellen Problems hat.

Als anderes Beispiel: In der Physik kann man die einfache Formel mit der Erdbeschleunigung benutzen, Newtons Gravitationsgesetz oder die allgemeine Relativitätstheorie. Die letzte Methode ist die beste die wir (meines
Wissens) im Moment haben, aber ist der Aufwand gerechtfertigt, wenn man wissen möchte, wie weit man einen Ball werfen kann?
 
Zuletzt bearbeitet:
Code:
procedure TForm1.btnrechnenClick(Sender: TObject);
var 
  Groese,
  Gewicht,
  fehler : Integer;
  BMI: Real;
  Kommentar: Extended;

begin
  Val(edgroese.Text, Groese, fehler);
  Val(edgewicht.text, Gewicht, fehler);
  BMI := Gewicht / Groese * Groese;


  case Form1.rgGeschlecht.ItemIndex of
    0: // Berechnung Mann
    begin
      case Round(BMI) of
        0..18: pnlErgebnis.caption:= 'Untergewicht';
        19..25: pnlErgebnis.caption:='Normalgewicht';
        26..30: pnlErgebnis.caption:='Übergewicht';
        31..40: pnlErgebnis.caption:='Fettsack';
      end;
    end;
    1: // Berechnung Frau
    begin
      case Round(BMI) of
        0..17: pnlErgebnis.caption:= 'Untergewicht';
        18..24: pnlErgebnis.caption:='Normalgewicht';
        25..29: pnlErgebnis.caption:='Übergewicht';
        30..40: pnlErgebnis.caption:='Fettsack';
      end;
    end;
  end;
end;

Man könnte das auch abkürzen, wenn man den ItemIndex direkt in die Berechnung einfliessen lässt, da sich bei der Frau ja nur die Zahl um 1 verringert.
Dann quasi:

Code:
procedure TForm1.btnrechnenClick(Sender: TObject);
var 
  Groese,
  Gewicht,
  fehler : Integer;
  BMI: Real;
  Kommentar: Extended;

begin
  Val(edgroese.Text, Groese, fehler);
  Val(edgewicht.text, Gewicht, fehler);
  BMI := (Gewicht / Groese * Groese) + rgGeschlecht.ItemIndex;


  case Round(BMI) of
    0..18: pnlErgebnis.caption:= 'Untergewicht';
    19..25: pnlErgebnis.caption:='Normalgewicht';
    26..30: pnlErgebnis.caption:='Übergewicht';
    31..40: pnlErgebnis.caption:='Fettsack';
  end;
end;
 
Zuletzt bearbeitet:
Zurück
Oben