Java Rechnung ergibt immer Infinity?
Ich muss aktuell für die Schule über die Ferien einen Alkoholrechner erstellen (in BlueJ Java). Ich habe jetzt ein grobes Grundprogramm ohne alle Details geschrieben, doch als Lösung kommt immer Infinity oder eine sehr große gerundete Zahl raus, obwohl im Taschenrechner mit den gegebenen Variablen der richtige Wert heraus kommt. Was für einen Fehler mache ich? Wie kann ich ihn beheben? (Ich nutze Scanner in den vorherigen Eingabe Methoden, falls das Einfluss hat)
import java.util.*;
class Alkoholrechner {
//Attribute
double körperMasse;
double konsumZeit;
double alkoholmenge;
double alter;
double geschlecht;
double alkoholgehalt;
double r;
Scanner input = new Scanner(System.in);
double verteilungsfaktorM = 0.69;
double verteilungsfaktorFJ = 0.57;
double verteilungsfaktorK = 0.77;
//Methoden
void eingabeGewichtZeit(){
System.out.println("Dies ist ein Alkoholrechner. Bitte geben Sie die geforderten Daten an.");
System.out.println("Ihr Gewicht in kg:");
körperMasse = input.nextDouble();
System.out.println("Vor wie vielen Stunden haben Sie den Alkohol konsumiert?");
konsumZeit = input.nextDouble();
}
void eingabeAlkohol(){
System.out.println("Wie viel Alkohol in Milliliter haben Sie konsumiert?");
alkoholmenge = input.nextDouble();
}
void eingabeAlter(){
System.out.println("Wie alt sind Sie?");
alter = input.nextDouble();
}
void eingabeGeschlecht(){
System.out.print("Was ist Ihr Geschlecht?");
System.out.println(" Tippen Sie 1, falls Sie männlich, und 2, falls Sie weiblich sind.");
geschlecht = input.nextDouble();
}
void ausgabe(){
if (geschlecht == 1){
double r = verteilungsfaktorM;
} else if (geschlecht == 2){
r = verteilungsfaktorFJ;
}else { System.out.println("Sie haben falsche Daten eingetippt. Versuchen Sie es erneut.");}
if(alter < 18 && alter > 13){
r = verteilungsfaktorFJ;
}else if (alter < 13){
r = verteilungsfaktorK;}
double zwischen = alkoholmenge * 0.05;
double a = zwischen * 0.8;
double alkoholgehalt = (a / (körperMasse * r));
double promille = Math.round((alkoholgehalt*100)/100.0);
System.out.println("Ihr Alkoholwert beträgt " + promille + ".");
}
void control(){
eingabeGewichtZeit();
eingabeAlkohol();
eingabeAlter();
eingabeGeschlecht();
ausgabe();
}
}
3 Antworten
1) Hier:
if (geschlecht == 1) {
double r = verteilungsfaktorM;
}
legst du eine neue lokale Variable r an, die nur innerhalb des if-Körpers existiert. Nachdem der Programmfluss diesen Körper durchlaufen hat, wird die Variable schon wieder gelöscht.
Du wolltest sicherlich das Feld r definieren.
r = verteilungsfaktorM;
2) Wenn der Nutzer exakt 13 Jahre alt ist, wird für ihn der gleiche Verteilungsfaktor verwendet, wie für alle Nutzer über 18.
3) Du solltest bessere, aussagekräftigere Namen für deine Variablen finden und auf magic numbers verzichten. Es ist zum Beispiel nicht sofort ersichtlich, wieso du mit Zahlen wie 0.05 oder 0.8 multiplizierst. Verwende an der Stelle dann doch Konstanten oder benenne wenigstens die Variable, die das Ergebnis erhält, entsprechend (z.B. alkoholmengeInGramm).
4) Deine Berechnung ist unvollständig, denn du subtrahierst nicht das Produkt aus vergangener Zeit (seit Trinkbeginn) und stündlichen Abbaus (~0.1) von deinem.
5) Ich würde das Ergebnis nicht durch eine Rundung verfälschen. Nutze doch einfach einen Formatter, um den Wert auf beispielsweise zwei Nachkommastellen zu kürzen.
System.out.printf("Ihr Alkoholwert beträgt %.2f%n", promille);
Danke, jetzt funktioniert es. Ich werde auch noch die anderen Verbesserungen vornehmen, war insgesamt noch nicht ganz fertig, wollte nur das Grundprinzip fertig und funktionstüchtig haben.
(Könntest du bitte die Texte als Texte hier posten? Oder wenigstens als Screenshots vom Computer statt als Fotos?)
Besonders merkwürdig ist, dass beidemale dieselben Eingaben gemacht zu werden scheinen, das Ergebnis aber ein anderes ist.
Ich sehe im Code keine Zuweisungen zu verteilungsfaktor*, alkoholmenge oder körperMasse - was GENAU steht da?
Lass dir auch mal nach jeder Zuweisung den Inhalt der gerade zugewiesenen Variablen ausgeben (wie nach der Zuweisung zur Variablen "promille"). Was steht jeweils da?
Hab nur das halbe Programm fotografiert. Die Werte sind anders, weil ich einmal das Ergebnis noch gerundet hab. Ich füg mal noch das gesamte Programm hinzu.
Was mir aufgefallen ist: alkoholgehalt*100)/100.0
Du multiplizierst mit 100 nur um danach direkt wieder durch hundert zu teilen.
D.h. "promille" wird immer den gerundeten Wert von "alkoholgehalt" annehmen