Problem bei BMI rechner Variabletyp falsch?



  • 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 typen

    Es 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 typen

    Es 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 initialisieren

    Nein 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 initialisieren

    Nein 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. 😉



  • Fellhuhn schrieb:

    Er schreib: anzuraten. 😉

    Hehe, tatsächlich. Das hab ich jetzt schon die ganze Zeit falsch gelesen - merkwürdig. In dem Fall ist natürlich alles klar. 😃



  • Nexus schrieb:

    Fellhuhn schrieb:

    Er schreib: anzuraten. 😉

    Hehe, tatsächlich. Das hab ich jetzt schon die ganze Zeit falsch gelesen - merkwürdig. In dem Fall ist natürlich alles klar. 😃

    sorry, hab jetzt erst wieder reingeschaut. aber die frage hat sich ja dann doch von selbst geklärt... aBzuraten wäre davon die pointer nicht mit NULL zu initialisieren 😉 ich werde in zukunft solche unstimmigkeiten besser hervorheben



  • muffmolch schrieb:

    ich werde in zukunft solche unstimmigkeiten besser hervorheben

    Nein, das war absolut okay von dir. Ich habe nur falsch gelesen, der Fehler liegt also gänzlich bei mir... Sorry für die entstandenen Umstände 🙂



  • Wow ihr habt alle einen voll kurzen Quelltext, also wir hatten das jetzt in der schule, ich hab nen ewig langen xDD aber er funzt! xDD

    //Lanny-------------------10.12.09------------BMI.cpp
    
    #include<iostream>
    #include<iomanip>
    
    using namespace std;
    
    int main()
    {
    
    	char cgeschlecht;
    	float fgros, fgewicht, falter, fNormal, fideal, fabwei, fbmi;
    
    	cout<<"\n\nGeben Sie Ihr Geschlecht ein(m oder w)\t:\t";
    	cin>>cgeschlecht;
    	cout<<"\nGeben Sie Ihre Groesse (in cm) ein\t:\t";
    	cin>>fgros;
    	cout<<"\nGeben Sie Ihr Gewicht (in kg) ein\t:\t";
    	cin>>fgewicht;
    	cout<<"\nGeben Sie Ihr Alter ein (in Jahren)\t:\t";
    	cin>>falter;
    
    	system("cls");
    
    	cout<<"\n\nGeschlecht:\t\t"<<cgeschlecht;
    	cout<<"\nGroesse:\t\t"<<fgros;
    	cout<<"\nGewicht:\t\t"<<fgewicht;
    	cout<<"\nAlter:\t\t\t"<<falter<<"\n\n";
    
    	//Berechnungen
    
    	fNormal=fgros-100;
    
    	if(cgeschlecht=='m')
    	{
    		fideal=fNormal/100*90;
    		fabwei=fgewicht-fideal;
    		fbmi=fgewicht/(fgros/100*fgros/100);
    
    	}
    	else
    	{
    		fideal=fNormal/100*85;
    		fabwei=fgewicht-fideal;
    		fbmi=fgewicht/(fgros/100*fgros/100);
    	}
    
    		//BMI Bewertung
    
    	switch(cgeschlecht)
    	{
    		case 'm' : 
    	{
    
    			if(fbmi<20)
    			{
    				cout<<"Mit einem BMI von "<<fbmi<<" haben sie Untergewicht!";
    				cout<<"\n\n\nIhr Idealgewicht:\t\t\t"<<fideal;
    				cout<<"\n\nIhre Abweichung vom Idealgewicht:\t"<<fabwei;
    				cout<<"\n\nIhr BMI betraegt:\t\t\t\t"<<fbmi;
    			}
    			else
    			{
    				if(fbmi<25)
    				{
    					cout<<"Mit einem BMI von "<<fbmi<<" haben Sie Normalgewicht!";
    					cout<<"\n\n\nIhr Idealgewicht:\t\t\t"<<fideal;
    					cout<<"\n\nIhre Abweichung vom Idealgewicht:\t"<<fabwei;
    					cout<<"\n\nIhr BMI betraegt:\t\t\t\t"<<fbmi;
    				}
    				else
    				{
    					if(fbmi<30)
    					{
    						cout<<"Mit einem BMI von "<<fbmi<<" haben Sie Uebergewicht!";
    						cout<<"\n\n\nIhr Idealgewicht:\t\t\t"<<fideal;
    						cout<<"\n\nIhre Abweichung vom Idealgewicht:\t"<<fabwei;
    						cout<<"\n\nIhr BMI betraegt:\t\t\t\t"<<fbmi;
    					}
    					else
    					{
    						if(fbmi<40)
    						{
    							cout<<"Mit einem BMI von "<<fbmi<<" haben Sie Adipositas!\nBitte suchen Sie umgehend einen Arzt auf!!";
    							cout<<"\n\n\nIhr Idealgewicht:\t\t\t"<<fideal;
    							cout<<"\n\nIhre Abweichung vom Idealgewicht:\t"<<fabwei;
    							cout<<"\n\nIhr BMI betraegt:\t\t\t\t"<<fbmi;
    						}
    						else
    						{
    								cout<<"Mit einem BMI von "<<fbmi<<" haben Sie starke Adipositas!\nBitte suchen Sie umgehend einen Arzt auf!";
    								cout<<"\n\n\nIhr Idealgewicht:\t\t\t"<<fideal;
    								cout<<"\n\nIhre Abweichung vom Idealgewicht:\t"<<fabwei;
    								cout<<"\n\nIhr BMI betraegt:\t\t\t\t"<<fbmi;
    						}
    					}
    				}
    			}
    	}
    
    	break;
    
    					case 'w' : 
    						{
    
    			if(fbmi<19)
    			{
    				cout<<"Mit einem BMI von "<<fbmi<<" haben sie Untergewicht!";
    				cout<<"\n\n\nIhr Idealgewicht:\t\t\t"<<fideal;
    				cout<<"\n\nIhre Abweichung vom Idealgewicht:\t"<<fabwei;
    				cout<<"\n\nIhr BMI betraegt:\t\t\t\t"<<fbmi;
    			}
    			else
    			{
    				if(fbmi<=24)
    				{
    					cout<<"Mit einem BMI von "<<fbmi<<" haben Sie Normalgewicht!";
    					cout<<"\n\n\nIhr Idealgewicht:\t\t\t"<<fideal;
    					cout<<"\n\nIhre Abweichung vom Idealgewicht:\t"<<fabwei;
    					cout<<"\n\nIhr BMI betraegt:\t\t\t\t"<<fbmi;
    				}
    				else
    				{
    					if(fbmi<=30)
    					{
    						cout<<"\n\nMit einem BMI von "<<fbmi<<" haben Sie Uebergewicht!";
    						cout<<"\n\n\nIhr Idealgewicht:\t\t\t"<<fideal;
    						cout<<"\n\nIhre Abweichung vom Idealgewicht:\t"<<fabwei;
    						cout<<"\n\nIhr BMI betraegt:\t\t\t\t"<<fbmi;
    					}
    					else
    					{
    						if(fbmi<=40)
    						{
    							cout<<"Mit einem BMI von "<<fbmi<<" haben Sie Adipositas!\nBitte suchen Sie umgehend einen Arzt auf!";
    							cout<<"\n\n\nIhr Idealgewicht:\t\t\t"<<fideal;
    							cout<<"\n\nIhre Abweichung vom Idealgewicht:\t"<<fabwei;
    							cout<<"\n\nIhr BMI betraegt:\t\t\t\t"<<fbmi;
    						}
    						else
    						{
    								cout<<"Mit einem BMI von "<<fbmi<<" haben Sie starke Adipositas!\nBitte suchen Sie umgehend einen Arzt auf!";
    								cout<<"\n\n\nIhr Idealgewicht:\t\t\t"<<fideal;
    								cout<<"\n\nIhre Abweichung vom Idealgewicht:\t"<<fabwei;
    								cout<<"\n\nIhr BMI betraegt:\t\t\t\t"<<fbmi;
    						}
    					}
    				}
    			}
    						}
    
    						break;
    
    		default: 
    			{
    				cout<<"Falsche eingabe!";
    			}
    
    	}
    
    		//optimale BMI nach Alter
    
    	if(falter>=19 && falter<=24 && fbmi>=19 && fbmi<=24)
    	{
    		cout<<"\n\nSie haben einen optimalen BMI!";
    	}
    	else
    	{
    		if(falter<=34 && fbmi>=20 && fbmi<=25)
    		{
    			cout<<"\n\nSie haben einen optimalen BMI!";
    		}
    		else
    		{
    			if(falter<44 && fbmi>=21 && fbmi<=26)
    			{
    				cout<<"\n\nSie haben einen optimalen BMI!";
    			}
    			else
    			{
    				if(falter<54 && fbmi>=22 && fbmi<=27)
    				{
    					cout<<"\n\nSie haben einen optimalen BMI!";
    				}
    				else
    				{
    					if(falter<64 && fbmi>=23 && fbmi<=28)
    					{
    						cout<<"\n\nSie haben einen optimalen BMI!";
    					}
    					else
    					{
    						if(falter>65 && fbmi>=24 && fbmi<=29)
    						{
    							cout<<"\n\nSie haben einen optimalen BMI!";
    						}
    						else
    						{
    							cout<<"\n\nSie haben keinen optimalen BMI!";
    						}
    					}
    				}
    			}
    		}
    	}
    
    	cin.get();cin.get();
    
    	return 0;
    }
    


  • Funktionen und Schleifen sind hier wohl das Stichwort!

    Du wirst den Code noch exterm verbessern können, wenn du diese 2 Sprachfeatures auch noch lernst!


Anmelden zum Antworten