Problem bei BMI rechner Variabletyp falsch?
-
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.
-
muffmolch schrieb:
an sich sollt eman sich eh angewöhnen verwaltete Pointer (auto_ptr, shared_ptr, etc.) zu verwenden.
Ja, das schon. Es ging mir auch eher darum, übertriebenes Null-Setzen aufzuzeigen. Und rohe Zeiger haben teilweise durchaus ihre Berechtigung.
muffmolch schrieb:
Abgesehen davon ist eine Initialisierung bei Pointern stark anzuraten.
Was? Wie meinst du das?
-
Ich hab folgenden Teil im Überfliegen nochmal angesehen und dann gepostet...
float weight, size; float bmi = weight/(size * size);Ist klar dass hier ohne Initialisierung irgendwas herauskommt.
Daher meinte ich es wäre in Fällen wo nichts eingelesen wird bzw. die Variable sich nachher nicht verändert, besser direkt den Wert zu vergeben.
-
Nexus schrieb:
muffmolch schrieb:
Abgesehen davon ist eine Initialisierung bei Pointern stark anzuraten.
Was? Wie meinst du das?
Ich denke mal, dass er die 0 Initialisierung meint. Von wegen Überprüfung, ob es ein gültiger Zeiger ist, delete usw.
-
drakon schrieb:
Ich denke mal, dass er die 0 Initialisierung meint. Von wegen Überprüfung, ob es ein gültiger Zeiger ist, delete usw.
Das macht für mich aber keinen Sinn... Wieso sollte davon im Allgemeinen stark abzuraten sein?
-
Nexus schrieb:
drakon schrieb:
Ich denke mal, dass er die 0 Initialisierung meint. Von wegen Überprüfung, ob es ein gültiger Zeiger ist, delete usw.
Das macht für mich aber keinen Sinn... Wieso sollte davon im Allgemeinen stark abzuraten sein?
Er schreib: anzuraten.
