Java Editor Wie erstelle ich einen BMI-Rechner?

Daniela_Mysliwski

Neues Mitglied
Hallo zusammen!

Ich bin verzweifelt. Wir sollen zu Themen verschiedene Sachen herstellen. Ich muss einen BMI Rechner erstellen und verstehe in Java wirklich garnichts. Alles was ich gerade hinbekommen habe war :
Class BMI

ich habe versucht mir hilfe aus dem Internet zu holen, da mein Informatiklehrer niemanden hilft, außer er kann es an sich hat sich aber in etwas komplizierterem verstrickt.
Wir sollen nur mit den Sachen arbeiten die wir bisher genutzt haben und ich bräuchte dringend hilfe.

Ich wäre seeeeehr dankbar wenn jemand die Geduld und zeit hätte mir hier zu helfen!
 

Robat

Top Contributor
Wenn du Probleme hast sofort aus dem Kopf heraus Code auf die Beine zu stellen würde ich dir empfehlen erstmal Stift und Papier zur Hand zu nehmen.

Mach dir folgende Punkte klar:
Was soll der Rechner können (also was macht ein bmi Rechner)
Wie viele Variablen brauchst du um eventuelle Werte abzuspeichern. Was für Datentypen?

Wir sollen nur mit den Sachen arbeiten die wir bisher genutzt haben
Was habt ihr denn bis jetzt benutzt? Wie ist denn dein Kenntnisstand?

Gruß Robert
 

JStein52

Top Contributor
Mal ein Ansatz:

Code:
public class BMI {

    private static final float FAKTOR_WEIBLICH = 0.85f;
    private static final float FAKTOR_MAENNLICH = 0.9f;
  
    private float normalgewicht;
    private float idealgewicht;
    private float bmiwert;
  
    public BMI(int koerpergroesseInZentimeter, float koerpergewicht, Geschlecht geschlecht) {
        this.normalgewicht = berechneNormalgewicht(koerpergroesseInZentimeter);
        this.idealgewicht = berechneIdealgewicht(this.normalgewicht, geschlecht);
        this.bmiwert = berechneBMI(koerpergewicht, koerpergroesseInZentimeter);
    }
  
    public float getNormalgewicht() {
        return normalgewicht;
    }

    public float getIdealgewicht() {
        return idealgewicht;
    }

    public float getBmi() {
        return bmiwert;
    }

    private float berechneNormalgewicht(int koerpergroesseInZentimeter) {
        return koerpergroesseInZentimeter - 100;
    }

    private float berechneIdealgewicht(float normalgewicht, Geschlecht geschlecht) {
        float faktor = geschlecht == Geschlecht.WEIBLICH ? FAKTOR_WEIBLICH : FAKTOR_MAENNLICH;
        return normalgewicht * faktor;
    }
  
    private float berechneBMI(float koerpergewicht, int koerpergroesseInZentimeter) {
        float koerpergroesseInMeter = (float) (koerpergroesseInZentimeter / 100.0);
        return koerpergewicht / (koerpergroesseInMeter * koerpergroesseInMeter);
    }
  

}
 

Viktim

Bekanntes Mitglied
Guck dir den Code von @JStein52 am besten erst an, wenn du selber was hinbekommen hast ;)

Also der BMI berechnet sich ja aus dem Körpergewicht und der Größe.

Eine Klasse machst du Folgendermaßen:
Code:
public class BMIRechner {


}

das public sorgt dafür, dass du die Klasse aus anderen Klassen ansprechen kannst, aber das brauchst du erstmal noch nicht.
Diese Klammern: "{" und "}" sagen, dass das was dazwischen steht zu dem gehört, was vor der öffnenden Klammer steht, also hier zur Klasse.

Als nächstes brauchst du eine main-Methode. Das ist der Anfang jedes Programms und sieht so aus:

Java:
public static void main(String[] args) {

}

So, und aller Code den du schreibst muss irgendwie von der Main ausgehen.

Wenn du die Main-Methode jetzt in die Klasse schreibst sieht das ganze So aus:

Java:
public class BMIRechner {
  public static void main(String[] args) {

  }
}

Das Programm könntest du jetzt schon ausführen, allerdings macht das noch rein garnichts.

Als nächstes, müsste man warscheinlich den Benutzer nach dem Körpergewicht fragen.
Dazu machen wir am besten eine Konsolenausgabe, die dem Benutzer sagt, was er machen soll.
Eine Konsolenausgabe geht so:
Java:
System.out.println("Irgendein Text");

Also bei uns:
Java:
public class BMIRechner {
  public static void main(String[] args) {
    System.out.println("Bitte gib das Körpergewicht ein.");
  }
}

Damit macht dein Programm dann schonmal was :D

Als nächstes musst du ja irgendwie die Eingabe des Benutzers bekommen.
Dafür brauchen wir einen Reader, den man z.B. so erstellen kann.
Java:
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
System.in ist hier einfach die Konsole an sich auf dem Input stream, sprich der Eingabe.
Der InputstreamReader kann das ganze dann einlesen, und den BufferedReader tun wir außenrum, um mehr Funktionalität für den Reader zu Bekommen, die ganz praktisch sein kann.

Den Reader können wir jetzt ganz oben in der main-Methode erstellen, weil wir den öfters brauchen, und er aufjedenfall überall in der Main-Methode bekannt ist, wenn er oben steht.

Wenn wir den erzeugten reader benutzen wollen, geht das mit:
Java:
reader.readLine()

Das ganze Müssen wir dann in einen String(also einfach eine Zeichenkette) speichern.
Zu beachten ist, dass die aufgerufen Reader-Methode, also das "readLine()" eine Exception also einen Fehler werfen kann, der so eingestellt ist, dass man ihn abfangen Muss.
Dafür fürgen wir hier einfach mal ein throws IOException, also der Fehler, der hier möglicherweise geworfen wird, zur main hinzu.
Unser Programm sieht dann so aus:
Java:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class BMIRechner {
  public static void main(String[] args) throws IOException {
    BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

    System.out.println("Bitte gib das Körpergewicht ein.");
    String koerpergewicht = reader.readLine();
  }
}
So, jetzt haben wir schonmal das Gewicht.
Dann machen wir das ganze einfach nochmal für die Größe.

Jetzt sieht das ganze so aus:
Java:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class BMIRechner {
  public static void main(String[] args) throws IOException {
    BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

    System.out.println("Bitte gib das Körpergewicht ein.");
    String koerpergewicht = reader.readLine();
    System.out.println("Bitte gib die Körpergröße ein.");
    String koerpergroesse= reader.readLine();
   
   
  }
}

Aber wir wollen das ganze ja als Zahlen(Integer) und nicht als Strings, damit wir damit Rechnen können. Also müssen wir das ganze Parsen.
Das geht so:
Java:
Integer zahl = Integer.parseInt("123");
Aber weil es ja auch sein kann, dass die Zeichenkette keine Zahl ist, sollten wir, wenn wir Fehler vermeiden wollen, Abfragen, ob überhaupt eine Zahl in unseren Variablen steht.
Da kenn ich leider bloß eine möglichkeit und die sieht nicht sehr schön aus....
Undzwar mit "IrgendeineZahlOderHaltNicht".matches("\\d+")
Das matches verwertet einen Regulären Ausdruck, mit denen du dich im Moment aber noch nicht befassen solltest. "\\d+" bedeutet dabei das wir eine Zahl haben wollen. (d wie diggit)

So, das bringt uns aber nichts, wenn wir es nicht mit einer If-Abfrage kombinieren.
Eine ifabfrage besteht immer aus einem 'if', dann in Klammern die Bedingung und dann wieder der gewohnte "{}" - Block
außerdem kann hinter der schließenden Klammer ein Else-Block kommen, der den Fall behandelt, wenn die Bedingung nicht zutrifft.

Unser Code könnte jetzt also so aussehen:
Java:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class BMIRechner {
  public static void main(String[] args) throws IOException {
    BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

    System.out.println("Bitte gib das Körpergewicht ein.");
    String koerpergewicht = reader.readLine();
    System.out.println("Bitte gib die Körpergröße in cm ein.");
    String koerpergroesse = reader.readLine();

    Integer gewicht;
    if (koerpergewicht.matches("\\d+")) {
      gewicht = Integer.parseInt(koerpergewicht);
    } else {
      System.out.println("Gewicht ist keine Zahl!!");
      return;
    }

    Double groesse;
    if (koerpergroesse.matches("\\d+")) {
      groesse = Double.parseDouble(koerpergroesse);
      groesse = groesse / 100; //Groesse in Metern
    } else {
      System.out.println("Größe ist keine Zahl");
      return;
    }
  }
}

So, und das einzige was uns jetzt eigentlich noch fehlt ist die Berechnung.

Die formel dafür ist ja Gewicht / (Größe * Größe)
Also fügen wir einfach diese Formel hinzu und am Ende noch eine Ausgabe, und wir sind Fertig.

So siehts dann am Ende aus:
Java:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class BMIRechner {
  public static void main(String[] args) throws IOException {
    BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

    System.out.println("Bitte gib das Körpergewicht ein.");
    String koerpergewicht = reader.readLine();
    System.out.println("Bitte gib die Körpergröße in cm ein.");
    String koerpergroesse = reader.readLine();

    Integer gewicht;
    if (koerpergewicht.matches("\\d+")) {
      gewicht = Integer.parseInt(koerpergewicht);
    } else {
      System.out.println("Gewicht ist keine Zahl!!");
      return;
    }

    Double groesse;
    if (koerpergroesse.matches("\\d+")) {
      groesse = Double.parseDouble(koerpergroesse);
      groesse = groesse / 100;
    } else {
      System.out.println("Größe ist keine Zahl");
      return;
    }

    Double bmi = gewicht / (groesse * groesse);
    System.out.println("Der BMI ist " + bmi);
  }
}
 

Thallius

Top Contributor
Nur mal so al Tipp Leute:

Wenn sich jemand neu anmeldet und dann noch mit einem Mädchen Namen und dann um Hilfe bei einer Aufgabe bittet:

Dann schaut vorm Helfen doch einfach mal wann der das letzte mal aktiv war. Der Type (und ich wette mal nen 30l Faß Bier das es sich hierbei um ein mänliches Individuum handelt) war nach seiner Registrierung nie wieder online und wird es wahrscheinlich auch nie wieder sein. Der hat bestimmt in 10 Foren gleichzeit gepostet und wo anders schneller Hilfe bekommen.

Gruß

Claus
 

Viktim

Bekanntes Mitglied
Ich hab nichts bemerkt und auch nicht drüber nachgedacht :D

Schade eigentlich, ich hab mir so viel Mühe gegeben :/
 

Robert Zenz

Top Contributor
Ich finde den Beispiel-Code nicht so prickelnd, gut erklaert, aber nicht ideal...vielleicht lege ich spaeter dann doch noch ein Repostiory mit Beispiel-Code/Projekten fuer das Forum an.

Eigentlich sollte man HA anderer nicht machen ...

Aeh, interessiert in Wahrheit niemanden. Klar kannst du jetzt sagen "Wer keinen BMI-Rechner programmieren kann, sollte das Studium nicht schaffen." aber der Zug ist so oder so abgefahren. Man kann jetzt drei Ansaetze fahren:

1. Man macht es wie Konrad, und versucht die Person Stueck fuer Stueck durch Probleme zur Loesung zu fuehren.
2. Man macht es wie Viktim hier, erstellt eine gut beschriebene und dokumentierte Loesung.
3. Man labert die Leute zu dass sie gefaellist selbst lernen sollen.

Rate mal, was davon Konstruktiv ist (auch fuer Personen welche aehnliche Probleme und Fragen haben) und was nicht.
 

philanthrop

Bekanntes Mitglied
Also, ich hab mal kurz drüber geschaut, Zeile 16 bis 26 von #3 ist unschön. Außerdem wird mit float statt double gerechnet und ich bin mir auch nicht so sicher, ob die Formeln in den berechne...-Methoden so stimmen. Und wenige Kommentare. #4 gefällt mir besser (erklärt).

Vielleicht erstelle ich später auch noch mal einen ganz simplen BMI-Rechner fürs Forum ... Obwohl... wenn man mal aufs Datum schaut... vielleicht auch nicht. ;)
 

philanthrop

Bekanntes Mitglied
Hier mal meine Variante:

Java:
import java.util.Map;
import java.util.Scanner;
import java.util.SortedMap;
import java.util.TreeMap;

public class BMI {
    private final SortedMap<Double, String> bmiCat = new TreeMap<>();
    private final double verengung_m_l = 18.5 / 20.0;
    private final double verengung_m_u = 1.0;
    private final double verengung_w_l = 18.5 / 19.0;
    private final double verengung_w_u = 25.0 / 24.0;

    public BMI() {
        bmiCat.put(10.0, "meist nicht mit Überleben vereinbar");
        bmiCat.put(12.0, "akute Lebensgefahr");
        bmiCat.put(13.0, "hochgradiges Untergewicht");
        bmiCat.put(16.0, "stationäre Aufnahme empfehlenswert, zunehmend organische Komplikationen, Starkes Untergewicht");
        bmiCat.put(17.0, "Mäßiges Untergewicht");
        bmiCat.put(17.5, "Anorektisches Gewicht");
        bmiCat.put(18.5, "Leichtes Untergewicht");
        bmiCat.put(25.5, "Normalgewicht");
        bmiCat.put(30.0, "Präadipositas");
        bmiCat.put(35.0, "Adipositas Grad I");
        bmiCat.put(40.0, "Adipositas Grad II");
        bmiCat.put(111.11, "Adipositas Grad III"); //(111.11 placeholder)
    }

    public void getBMI() {
        System.out.println("Bitte Geschlecht m oder w:");
        char c = new Scanner(System.in).nextLine().charAt(0);
        System.out.println("Bitte Körpergröße in cm:");
        double cm = Double.parseDouble(new Scanner(System.in).nextLine());
        System.out.println("Bitte Körpergewicht in kg:");
        double kg = Double.parseDouble(new Scanner(System.in).nextLine());

        double bmi = kg / (cm * cm / 10_000.0);
        double bmi_l = bmi * verengung_m_l;
        double bmi_u = bmi * verengung_m_u;
        if (c == 'w') {
            bmi_l = bmi * verengung_w_l;
            bmi_u = bmi * verengung_w_u;
        }
        String cat = "";
        for (Map.Entry<Double, String> e : bmiCat.entrySet()) {
            if (e.getKey() >= bmi_l && e.getKey() >= bmi_u) {
                cat = e.getValue();
                break;
            }
        }

        System.out.println("Dein BMI beträgt: " + bmi + " (" + bmi_l + ", " + bmi_u + ")");
        System.out.println("Aufgrund deines Geschlechts und Körperbau, gilt folgendes:");
        System.out.println(cat);

        System.out.println("Wir wünschen Ihnen einen schönen Tag.");
    }

    public static void main(String[] args) {
        new BMI().getBMI();
    }
}

Beispiel:

Bitte Geschlecht m oder w:
m
Bitte K�rpergr��e in cm:
200
Bitte K�rpergewicht in kg:
140
Dein BMI betr�gt: 35.0 (32.375, 35.0)
Aufgrund deines Geschlechts und K�rperbau, gilt folgendes:
Adipositas Grad I
Wir w�nschen Ihnen einen sch�nen Tag.
 

Robert Zenz

Top Contributor
Yeah, ich darf wirklich wieder auf meine Wiederholung zum Thema Boxing verweisen. Auszerdem solltest du vermutlich den Scanner nicht konstant neu erzeugen, den kannst du ruhig einmal erzeugen und behalten. Auszerdem solltest du Variablennamen nicht abkuerzen nur weil du kannst, das macht die Sache meistens schwerer lesbar. Auch ist die Methode getBMI nicht so toll benannt, weil sie holt ja keinen BMI, sie macht viel mehr.
 

Robert Zenz

Top Contributor
Also um auch mal wieder was zu schreiben, meine Idee:

Java:
package org.bonsaimind.javaforum.bmirechner;

import java.io.InputStream;
import java.io.OutputStream;
import java.util.InputMismatchException;
import java.util.Scanner;

public final class Main {
	private Main() {
	}
	
	public static final void main(String[] args) {
		Eingabeleser eingabeleser = new Eingabeleser(System.out, System.in);
		
		double koerpergroeszeInMeter = eingabeleser.leseDouble("Koerpergroesze (cm)") / 100.0d;
		double gewichtInKilogramm = eingabeleser.leseDouble("Gewicht (kg)");
		
		BmiRechner bmiRechner = new BmiRechner();
		
		double bmi = bmiRechner.berechne(gewichtInKilogramm, koerpergroeszeInMeter);
		GewichtsKlassifikation gewichtsKlassifikation = bmiRechner.getGewichtsKlassifikation(bmi);
		
		System.out.println("BMI: " + String.format("%,.1f", Double.valueOf(bmi)));
		System.out.println("Gruppe: " + gewichtsKlassifikation.getGruppe());
		System.out.println("Beschreibung: " + gewichtsKlassifikation.getBeschreibung());
	}
	
	public static class BmiRechner {
		protected static final GewichtsKlassifikation[] GEWICHTS_KLASSIFIKATIONEN = new GewichtsKlassifikation[] {
				new GewichtsKlassifikation(10.0d, "Tod", "meist nicht mit Überleben vereinbar"),
				new GewichtsKlassifikation(12.0d, "Untergewicht", "akute Lebensgefahr"),
				new GewichtsKlassifikation(13.0d, "Untergewicht", "hochgradiges Untergewicht Grad II"),
				new GewichtsKlassifikation(16.0d, "Untergewicht", "hochgradiges Untergewicht Grad I"),
				new GewichtsKlassifikation(17.0d, "Untergewicht", "Mäßiges Untergewicht"),
				new GewichtsKlassifikation(17.5d, "Untergewicht", "Anorektisches Gewicht"),
				new GewichtsKlassifikation(18.5d, "Untergewicht", "Leichtes Untergewicht"),
				new GewichtsKlassifikation(25.0d, "Normalgewicht", "Normalgewicht"),
				new GewichtsKlassifikation(30.0d, "Übergewicht", "Präadipositas"),
				new GewichtsKlassifikation(35.0d, "Adipositas behandlungsbedürftig", "Adipositas Grad I"),
				new GewichtsKlassifikation(40.0d, "Adipositas behandlungsbedürftig", "Adipositas Grad II"),
				new GewichtsKlassifikation(Double.MAX_VALUE, "Adipositas behandlungsbedürftig", "Adipositas Grad III")
		};
		
		public BmiRechner() {
			super();
		}
		
		public double berechne(double gewichtInKilogramm, double koerpergroeszeInMeter) {
			return gewichtInKilogramm / (koerpergroeszeInMeter * koerpergroeszeInMeter);
		}
		
		public GewichtsKlassifikation getGewichtsKlassifikation(double bmi) {
			for (GewichtsKlassifikation gewichtsKlassifikation : GEWICHTS_KLASSIFIKATIONEN) {
				if (bmi < gewichtsKlassifikation.getMaximalerBmi()) {
					return gewichtsKlassifikation;
				}
			}
			
			return GEWICHTS_KLASSIFIKATIONEN[GEWICHTS_KLASSIFIKATIONEN.length - 1];
		}
	}
	
	public static class Eingabeleser {
		protected Scanner inputStreamScanner = null;
		protected OutputStream outputStream = null;
		
		public Eingabeleser(OutputStream outputStream, InputStream inputStream) {
			super();
			
			this.outputStream = outputStream;
			this.inputStreamScanner = new Scanner(inputStream);
		}
		
		public double leseDouble(String eingabeaufforderung) {
			while (true) {
				System.out.print(eingabeaufforderung + ": ");
				
				try {
					return inputStreamScanner.nextDouble();
				} catch (InputMismatchException e) {
					String ungueltigeEingabe = inputStreamScanner.nextLine();
					
					System.out.println("Die Eingabe <" + ungueltigeEingabe + "> ist keine gueltige Zahl.");
				}
			}
		}
	}
	
	public static class GewichtsKlassifikation {
		protected String beschreibung = null;
		protected String gruppe = null;
		protected double maximalerBmi = 0.0d;
		
		public GewichtsKlassifikation(double maximalerBmi, String gruppe, String beschreibung) {
			super();
			
			this.maximalerBmi = maximalerBmi;
			this.gruppe = gruppe;
			this.beschreibung = beschreibung;
		}
		
		public String getBeschreibung() {
			return beschreibung;
		}
		
		public String getGruppe() {
			return gruppe;
		}
		
		public double getMaximalerBmi() {
			return maximalerBmi;
		}
	}
}

Wobei ich das Gefuehl ahbe irgendwas wichtiges vergessen zu haben (Maennlich/Weiblich habe ich absichtlich verzichtet)...
 
Zuletzt bearbeitet:

Robert Zenz

Top Contributor
Und ich bilde mir ein es gaebe so etwas wie eine LinkedTreeMap oder aehnliches, mit der man "den naechstbesten passenden" Eintrag bekommen, also man geht mit 22.0d in die Map und bekommt den Eintrag mit 25.0d...aber das finde ich gerade nicht mehr.
 

philanthrop

Bekanntes Mitglied
private final double verengung_w_u = 25.0 / 24.0;

Ich glaube, bei mir ist das noch falsch ... Das sollte glaube ich 25.5 / 24.0; sein ...

Wenn ich Wikipedia richtig verstanden hatte, dann werden Frauen eher als untergewichtig eingestuft und Männer eher als übergewichtig eingestuft, bedingt durch mehr bzw. weniger Körperfettanteil. Genau weiß ich das aber nicht, bin ja kein Arzt.^^

Auszerdem solltest du vermutlich den Scanner nicht konstant neu erzeugen, den kannst du ruhig einmal erzeugen und behalten.

Ja, das stimmt, (unter anderem) an der Stelle hatte ich es mir einfach gemacht und die Anwendung würde einfach abstürzen bei einer falschen Eingabe...
 

Robert Zenz

Top Contributor
Ja, das stimmt, (unter anderem) an der Stelle hatte ich es mir einfach gemacht und die Anwendung würde einfach abstürzen bei einer falschen Eingabe...
Ja, Fehlerbehandlung hat mich auch bei meinem Beispiel beschaeftigt. Ist aber immer so. Benutzerinteraktion und Fehlerbehandlung sind immer die zwei groeszten Baustellen die du in einem Projekt haben kannst. Die Geschaeftslogik selbst ist meist recht einfach, das d'rumherum zieht sich immer ein wenig.

Ich glaube mein Beispiel hat da auch noch ein paar Probleme.
 

Neue Themen


Oben