Problem bei BMI rechner Variabletyp falsch?
-
Hi,
ich habe ein kleines problem, wollte einen ganz und gar simplen bmi rechner coden, beim kompilieren hatte ich soweit keine fehler, als ich das programm dann aber ausgeführt habe, erhielt ich beim ergebniss ein mir nicht verständliches ergebniss.
ich hoffe ihr könnt mir da einen tipp geben was da falsch gelaufen sein könnte
hab schon verschiedene variabletypen versucht immer ohne erfolg
#include <iostream> using namespace std; int main() { cout << "Herzlich Willkommen beim BMI Programm Nr1. \n"; float weight, size; float bmi = weight/(size * size); cout << "Bitte geben sie zur berechnung ihres BMI, ihr Gewicht an \n"; cin >> weight; cout << "Nun geben sie bitte noch ihre Koerpergroesse in cm an\n"; cin >> size; cout <<"Ihr Bodymass Index betraegt \" " << bmi << " \" " << endl; if (bmi < 20) { cout << " sie leiden unter Untergewicht! " << endl; } else if (bmi > 25) { cout << " sie leiden unter Uebergewicht" << endl; } else cout <<"sie haben ein Normalgewicht" << endl; return 0; }thx 4 help
gruß
me
-
ups sorry das hier der aktuelle code
#include <iostream> using namespace std; int main() { cout << "Herzlich Willkommen beim BMI Programm Nr1. \n"; float weight, size; float bmi = weight/(size / 100) * size; cout << "Bitte geben sie zur berechnung ihres BMI, ihr Gewicht an. \n"; cin >> weight; cout << "Nun geben sie bitte noch ihre Koerpergroesse in cm an\n"; cin >> size; cout <<"Ihr Bodymass Index betraegt \" " << bmi << " \" " << endl; if (bmi < 20) { cout << " sie leiden unter Untergewicht! " << endl; } else if (bmi > 25) { cout << " sie leiden unter Uebergewicht" << endl; } else cout <<"sie haben ein Normalgewicht" << endl; return 0; }
-
naja, du berechnest den bmi mit bzw zufällig initialisierten werten!
du kannst den BMI erst dann bestimmen, wenn du weigh und size mit konkreten werten belegt hast.
sieh:#include <iostream> using namespace std; int main() { cout << "Herzlich Willkommen beim BMI Programm Nr1. \n"; float weight=0.0f, size=0.0f; cout << "Bitte geben sie zur berechnung ihres BMI, ihr Gewicht an. \n"; cin >> weight; cout << "Nun geben sie bitte noch ihre Koerpergroesse in cm an\n"; cin >> size; //erst jetzt float bmi = weight/(size / 100.0f) * size; cout <<"Ihr Bodymass Index betraegt \" " << bmi << " \" " << endl; if (bmi < 20) cout << " sie leiden unter Untergewicht! " << endl; else if (bmi > 25) cout << " sie leiden unter Uebergewicht" << endl; else cout <<"sie haben ein Normalgewicht" << endl; return 0; }
-
danke erstmal für die hilfe, jetzt erhalte ich schonmal ein lesbares ergebniss. leider ist dieses aber trotz alledem nicht ganz konform - bekomme statt den üblichen 10-50 ergebnissen, ergebnisse im tausender bereich raus.
abgesehen davon - warum muss ich unbedingt im vorraus 0.0f bzw. 100.0f einsetzen?
und warum mit zufälligen zahlen? die zahlen sollen ja individuell im programm eingegeben werden oder hab ich da irgendwie in diesem fall irgendwas falsch verstanden?float ansich als variabletyp war aber schon richtig oder?
-
bmi schrieb:
danke erstmal für die hilfe, jetzt erhalte ich schonmal ein lesbares ergebniss. leider ist dieses aber trotz alledem nicht ganz konform - bekomme statt den üblichen 10-50 ergebnissen, ergebnisse im tausender bereich raus.
abgesehen davon - warum muss ich unbedingt im v****** 0.0f bzw. 100.0f einsetzen?
und warum mit zufälligen zahlen? die zahlen sollen ja individuell im programm eingegeben werden oder hab ich da irgendwie in diesem fall irgendwas falsch verstanden?float ansich als variabletyp war aber schon richtig oder?
das mit sternchen verdeckte sollte variabletyp float die werte 0.0f bzw. 100.0f einsetzen - wofür baut man das f ein?
und weshalb scheint das doch irgendwie nicht die richtigen zahlen wiederzugeben z. B. erscheint statt BMI 20 irgendwas mit BMI 6100 oder 5900 o. ä. als wert
-
So wird ein Schuh draus:
float bmi = weight/((size * size)/ 100.0f);BMI ist Gewicht/KörpergrößeInMeterZumQuadrat
-
aha ok erstmal natürlich dane für die antwort - jetzt klappt et

aber aus welchem grund brauch ich 100**.0f** oder überhaupt die wertzuweisungen 0.0f
kannst du mir das auch nochmal schnell erklären??auf jedenfall big thx
-
bmi schrieb:
aha ok erstmal natürlich dane für die antwort - jetzt klappt et

aber aus welchem grund brauch ich 100**.0f** oder überhaupt die wertzuweisungen 0.0f
kannst du mir das auch nochmal schnell erklären??auf jedenfall big thx
.irgendwasf lässt es den Compiler als float interpretieren
Ich hab eigentlich nur schnell die Formel korrigiert...;)
-
Weißt du denn nun auch, warum diese Zuweisung nur nach der Eingabe des Benutzers funktioniert? Schließlich sollst du daraus auch etwas gelernt haben. Durch ein einfaches Copy & Paste und "Juhuu, es klappt!" kommst du nicht unbedingt weiter

MFG
Wärmstens zu empfehlen, nach Eingabe des Benutzers:
size /= 100; // z.B. 172cm = 1.72m - Formelkonform float bmi = weight/(size*size); cout.precision(4); // zwei Nachkommastellen cout << "Ihr Bodymass Index betraegt \" " << bmi << " \" " << endl;
-
root2k schrieb:
Weißt du denn nun auch, warum diese Zuweisung nur nach der Eingabe des Benutzers funktioniert? Schließlich sollst du daraus auch etwas gelernt haben. Durch ein einfaches Copy & Paste und "Juhuu, es klappt!" kommst du nicht unbedingt weiter

da ich c++ nicht wegen schule, arbeit und co mache sondern eher für mich privat lerne. ist der erfolg zumindestens in diesem fall für mich nicht so entscheidend wie das eigentliche verstehen der sprache.
Aus diesem grund habe ich auch nachgefragt warum bzw. wozu man überhaupt size/weight mit konkreten größen wie 0.0f belegen soll etc. was ich immernoch nicht verstehe
root2k schrieb:
size /= 100; // z.B. 172cm = 1.72m - Formelkonform float bmi = weight/(size*size); cout.precision(4); // zwei Nachkommastellen cout << "Ihr Bodymass Index betraegt \" " << bmi << " \" " << endl;habe den code nun entsprechend deiner verbesserung verbessert, die konkreten größen bei size und weight entfernt und voilà es funktioniert auch ohne - nur da wiederrum die frage - wann muss ich nun konkrete größen vorab eingeben und wann nicht? - also jetzt konkret nur bei variable typen
jetzt aber zu den fragen dabei -
size /= 100; // z.B. 172cm = 1.72m - Formelkonformwarum size /= 100 <--- geteilt durch gleich 100 ?! was hat das "=" da in diesem fall für eine wichtige bedeutung und warum geht es nicht ohne?[/cpp]
cout.precision(4); // zwei Nachkommastellendas ist dann auch klar - die ersten vier zahlen sind entscheidend
big thx schonmal für die antworten
-
bmi schrieb:
jetzt aber zu den fragen dabei -
size /= 100; // z.B. 172cm = 1.72m - Formelkonformwarum size /= 100 <--- geteilt durch gleich 100 ?! was hat das "=" da in diesem fall für eine wichtige bedeutung und warum geht es nicht ohne?
Statt
size /= 100;könntest du auch schreiben:
size = size / 100;Die obere Variante wird als "zusammengesetzte Zuweisung" bezeichnet und ist einfach nur eine verkürzte Schreibweise der unteren Variante.
-
bmi schrieb:
Aus diesem grund habe ich auch nachgefragt warum bzw. wozu man überhaupt size/weight mit konkreten größen wie 0.0f belegen soll etc. was ich immernoch nicht verstehe
[...]
nur da wiederrum die frage - wann muss ich nun konkrete größen vorab eingeben und wann nicht? - also jetzt konkret nur bei variable typenEs ist ganz konkret einfach: Wenn du die Variablen sowieso gleich überschreibst, brauchst du sie nicht zu initialisieren. Wenn aber deren Werte gelesen werden (insbesondere auch auf der linken Seite von
operator/=), ist eine Initialisierung sinnvoll.
-
das erklärt schonmal viel mehr, super big thx für eure hilfe

-
Nexus schrieb:
bmi schrieb:
Aus diesem grund habe ich auch nachgefragt warum bzw. wozu man überhaupt size/weight mit konkreten größen wie 0.0f belegen soll etc. was ich immernoch nicht verstehe
[...]
nur da wiederrum die frage - wann muss ich nun konkrete größen vorab eingeben und wann nicht? - also jetzt konkret nur bei variable typenEs ist ganz konkret einfach: Wenn du die Variablen sowieso gleich überschreibst, brauchst du sie nicht zu initialisieren. Wenn aber deren Werte gelesen werden (insbesondere auch auf der linken Seite von
operator/=), ist eine Initialisierung sinnvoll."Notwendig" trifft es eher.
Wenn du Variablen verwendest deren Inhalt nicht definiert ist, ist auch das Verhalten deines Programms undefiniert.
Daher lieber immer direkt initialisieren
-
Kuldren schrieb:
...
"Notwendig" trifft es eher.Wenn du Variablen verwendest deren Inhalt nicht definiert ist, ist auch das Verhalten deines Programms undefiniert.
Daher lieber immer direkt initialisierenNein ist es nicht. Das Programm befindet sich in einem wohldefinierten Zustand. Lediglich der Inhalt der Variable ist dem Programmierer nicht bekannt. Was aber auch bei Zufallszahlen der Fall ist.
-
drakon schrieb:
Kuldren schrieb:
...
"Notwendig" trifft es eher.Wenn du Variablen verwendest deren Inhalt nicht definiert ist, ist auch das Verhalten deines Programms undefiniert.
Daher lieber immer direkt initialisierenNein ist es nicht. Das Programm befindet sich in einem wohldefinierten Zustand. Lediglich der Inhalt der Variable ist dem Programmierer nicht bekannt. Was aber auch bei Zufallszahlen der Fall ist.
Spätestens wenn man anfängt mit Pointern zu arbeiten sollte man es sich aber angewöhnt haben die immer direkt zu initialisieren, und sei es mit 0. Sonst bereut man das schnell.

-
also natürlich ist das initialisieren der variablen hier nicht notwendig. Und bei dem Code, bei dem sofort Werte von der Tastatur gelesen werden erst recht nicht, aber ansonsten macht es insofern sinn, als das sich der code dann teils einfacher debuggen lässt.
-
Ah...hab den falschen Code angesehen....
Hier ist es nicht notwendig...Da sowieso direkt eingelesen wird
-
Kuldren schrieb:
"Notwendig" trifft es eher.
Nein, es ist eben nicht notwendig. Gerade wenn die Variablen sowieso kurz danach überschrieben werden.
Fellhuhn schrieb:
Spätestens wenn man anfängt mit Pointern zu arbeiten sollte man es sich aber angewöhnt haben die immer direkt zu initialisieren, und sei es mit 0. Sonst bereut man das schnell.

Naja, tendenziell ist es schon eine sichere Variante. Nur würde ich das nicht pauschal durchziehen. Es gibt ja zum Teil Leute, die machen so etwas:
int* p = 0; p = new int(5);Dann sollte man schauen, dass man nicht in den Null-Wahn kommt.
Sonst passiert es auch schnell, dass man aus Versehen noch gültige Zeiger zurücksetzt und damit Memory Leaks erzeugt.Grundsätzlich würde ich folgende Regel anwenden: Wenn ein Zeiger erstellt wird, der längere Zeit auf kein gültiges Objekt zeigt und die Gefahr besteht, dass auf ihn lesend zugegriffen wird, sollte man ihn auf Null setzen.
-
C/C++ Code: int* p = 0; p = new int(5);an sich sollt eman sich eh angewöhnen verwaltete Pointer (auto_ptr, shared_ptr, etc.) zu verwenden. Abgesehen davon ist eine Initialisierung bei Pointern stark anzuraten.