Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
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!
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?
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
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);
}
}
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.
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.
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.
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.
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.
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.
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.
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.^^
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.