Java Rechnung ergibt immer Infinity?


01.01.2025, 21:32

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

Vom Beitragsersteller als hilfreich ausgezeichnet

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

xbael 
Beitragsersteller
 04.02.2025, 17:55

15 Punkte btw

xbael 
Beitragsersteller
 01.01.2025, 22:30

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?


xbael 
Beitragsersteller
 01.01.2025, 21:28

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