BlueJ Programmierfehler NaN?

... komplette Frage anzeigen

6 Antworten

Nachdem das NaN Problem nun geklärt ist, könnte man die Berechnung des Idealgewichts näher unter die Lupe nehmen.

Ich kenne die Formel "Körpergewicht in Zentimetern minus 100 minus 10% bei Männern oder 15 bis 20% bei Frauen" oder über den Body-Mass-Index (BMI):

Idealgewicht Formel: (Größe in m)

Idealgewicht Männer (unterer Bereich) = GRÖßE ² x 20

Idealgewicht Männer (oberer Bereich) = GRÖßE ² x 25

Idealgewicht Frauen (unterer Bereich) = GRÖßE ² x 19

Idealgewicht Frauen (oberer Bereich) = GRÖßE ² x 24

Mit gewicht / groesse² bekommst du keinen vernünftigen Wert. Das Idealgewicht ist sicher unabhängig vom aktuellen Gewicht. Bei einem 2-Meter Mann von 100 kg wäre das Idealgewicht nach deiner Rechnung 25 kg!

Vgl.: http://www.bmi-rechner.net/idealgewicht.htm

Antwort bewerten Vielen Dank für Deine Bewertung

NaN = not a number

ich nehme an, du dividierst durch 0.
Wann wird denn der "groesse" ein Wert <> 0 zugewiesen?

Antwort bewerten Vielen Dank für Deine Bewertung
Kommentar von RebelOfBerlin
15.08.2016, 17:47

Das wäre mir neu, aber danke schon mal, ich werd's noch einmal durch schauen!

0
private void idealgewicht()
{
idealgewicht = gewicht / groesseZumQuadrat;
}
private void groesseZumQuadrat()
{
groesseZumQuadrat = groesse * groesse;
}

da fehlt hier und da ein "this". An anderen Stellen im Quelltext vielleicht auch. ;) Die Methoden kennen die Variablen idealgewicht, gewischt, groesse gar nicht (bzw. wissen nicht, ob sich diese auf die Klasse beziehen. Deswegen sind das wohl "NaN"s.

private void idealgewicht()
{
this.idealgewicht = this.gewicht / this.groesseZumQuadrat;
}
private void groesseZumQuadrat()
{
this.groesseZumQuadrat = this.groesse * this.groesse;
}

Antwort bewerten Vielen Dank für Deine Bewertung
Kommentar von Schachpapa
15.08.2016, 17:57

Man muss die Instanzvariablen nicht mit this spezifizieren, wenn es keine gleichnamigen lokalen Variablen gibt (man darf es aber).

Der Grund für das merkwürdige Ergebnis ist die Division durch Null, die nur bei Integern zu einer Exception führt, bei float und double aber eine erlaubte Operation ist.

2
Kommentar von IdiotvonNatur
15.08.2016, 17:58

Was für einen Quark du da schreibst! Bemerkenswert! :D
"this." sagt aus, dass die Felder der Klasse, in der sich die Methode befindet, verwendet werden. Wird "this." nicht verwendet, ermöglicht das "Shadowing", also das verwenden von Parametern und anderen lokalen Variablen mit denselben Bezeichnern. Wird aber nichts dergleichen verwendet, läuft es auf die Nutzen der gleichnamigen Felder hinaus.

1
  1. Wenn du für die Größe einen Integer verwendest muss die Einheit aber "mm" sein.
  2. double differenz = gewicht - idealgewicht;
    Das provoziert Rundungsfehler. Außerdem gehst du davon aus, dass das eigene Gewicht stets größer ist als das Idealgewicht. Du solltest "Math.abs()" drum herum setzen oder eine andere Maßnahme anwenden, um diese Zahl stets positiv zu halten. (Andernfalls kann auch dein "zu dürr"-Fall nicht eintreten.)
  3. Da haben wir ja den Übeltäter!
    idealgewicht = gewicht / groesseZumQuadrat;
    Du teilst hier durch 0, denn "groesseZumQuadrat" ist eine Variable. Setzen vor die Zeile "idealgewicht = [...]" noch "groesseZumQuadrat();", das sollte den Fehler beheben.
Antwort bewerten Vielen Dank für Deine Bewertung
Kommentar von ceevee
15.08.2016, 18:27

Um die Differenz-Variable rum hat der Fragesteller auch einen logischen Fehler, sein Programm würde Idealgewicht diagnostizieren, wenn man genau 5 Kilo über dem Idealgewicht liegt. Wenn das eigene Gewicht dem Idealgewicht entspricht, dann würde das Programm den Untergewicht-Satz ausgeben. 

Das, was der Fragesteller "Idealgewicht" nennt, ist kein Gewicht, sondern der BMI-Wert und bei dem müsste man prüfen, ob der im Bereich 18,5 - 25, darunter oder darüber liegt... oder er müsste die BMI-Formel nach dem Gewicht umstellen. Da ist so einiges an Code logisch falsch.

https://de.wikipedia.org/wiki/Body-Mass-Index

0
Kommentar von Schachpapa
15.08.2016, 18:32

Zu 1. Ob man für groesse Meter, Zentimeter oder Millimeter verwendet, ist eigentlich egal, in keinem Fall ergibt gewicht durch groesse^2 ein brauchbares Idealgewicht.

Zu 2. der Fall "zu dürr" tritt ein, wenn das Gewicht weniger als 5 über dem Idealgewicht liegt, also auch wenn es unter dem Idealgewicht liegt. Das Prädikat "krasser Lifestyle" erhält man nur, wenn die Differenz exakt 5 beträgt, also so gut wie nie. Das Problem bekommt man durch Math.abs() nicht in den Griff. Das zweite if sollte die Bedingung (differenz < -5) enthalten.

Btw: Wenn man mit der Beurteilung "Quark" etwas zurückhaltender ist, erspart man sich hämisches Grinsen, wenn man selbst Fehler macht.

0

Wenn man double durch 0 teilt, kommt als Ergebnis NaN (Not a Number). Du teilst bei idealgewicht durch groessezumquadrat, rufst aber die Methode die groessezumquadrat berechnet nie auf.

Das müsste passieren, nachdem du groesse eingelesen hast, spätestens vor oder in der Berechnung von idealgewicht.

Antwort bewerten Vielen Dank für Deine Bewertung

Die Variablen haben alle den Wert 0 zugewiesen.

Wenn du dann bei der Berechnung des Idealgewichts durch 0 teilst, kommt natürlich NaN raus (Not a Number)

Setze von Null verschiedene Werte ein oder prüfe vorher, ob die Werte von Null verschieden sind.

Antwort bewerten Vielen Dank für Deine Bewertung