Problem bei verschachtelten while/if Anweisungen



  • Hallo an alle ,
    Ich habe mich heute drangesetzt einen etwas besseren Taschenrechner zu schreiben als ich es bisher getan hatte.

    Nun habe ich jedoch ein Problem bei dem ich die Welt nichtmehr verstehe.

    Hier ist grade mal ein Codeausschnitt zuerst vom Berreich wo der Fehler auftritt.

    string wie_gehts_weiter = "" ;
    	    cin  >> wie_gehts_weiter;
    int iCondition = 0;
    	while (iCondition == 0)
    
    	{
    
    		if(wie_gehts_weiter == "Neu"||"neu"||"NEU")
    	{
    		cout << "Warum wird dieses If aufgerufen obwohl man alt eingibt \n";
    	}
    
    	else if(wie_gehts_weiter == "alt"||"Alt"||"ALT") // RECHNE MIT ALTEN ZAHLEN WEITER
    	{
    
    	if (which_numbers == "ganz" || "Ganz"||"GANZ")
    	{
    
    	cout << ergebniss_ganzzahlen ;
    	}  
    
    	else if (which_numbers == "komma" || "Komma"||"KOMMA" )
    	{
    	cout << ergebniss_komma ;
    	}
    
    	else
    	{
    	cerr << " Fehler Falsche eingabe bitte komma oder ganz eingeben .\n";
    	}
    
    	} // Ende  elseif wiegehtsweiter == alt
    
    	else
    	{
    	cout << "Falsche Eingabe nitte alt oder neu eingeben\n";
    
    	}
    
    	}//Ende der while(iCondition == 0) Schleife
    

    Das Problem ist , dass auch wenn ich in den string wie_gehts_weiter "alt" per cin einlese wird dennoch folgende Anweisung ausgeführt

    if(wie_gehts_weiter == "Neu"||"neu"||"NEU")
    	{
    		cout << "Warum wird dieses If aufgerufen obwohl man alt eingibt \n";
    	}
    

    Habt ihr eine Idee wo das das Problem sein könnte?
    Er müsste doch theoretisch sobald ich "alt" ,"ALT", oder "Alt" einlese die else if Anweisungen ausführen wieso ruft er immer das erste if auf?

    Falls es jemand zum verständnis braucht ist hier der bisherige Code ( Er ist noch unvollständig , daher werden manche Dinge vlt noch nicht klar sein wieso ich etwas mache dann einfach nachfragen bitte).

    #include <iostream>
    #include <string>
    using namespace std;
    
     long rechen_function_ganzzahlen( long first_number, long second_number ,char rechenzeichen)
    {   
    	long result   ; 
    	switch(rechenzeichen)  
    	{
    	case '+' :       result = first_number+second_number ; break;
    	case '-' :       result = first_number-second_number ; break;
    	case '*' :       result =  first_number*second_number ; break;
    	case '/' :       result = first_number/second_number;  break;
    	default: cout << "unbekanntes Rechenzeichen...\n"; return 1;
    	}
    
    	return result;
    }
    
     float rechen_function_kommazahlen( float first_number, float second_number ,char rechenzeichen )
    {   float result ;
    	switch(rechenzeichen)  
    	{
    	case '+' :       result =  first_number+second_number; break;
    	case '-' :       result =  first_number-second_number; break;
    	case '*' :       result =  first_number*second_number; break;
    	case '/' :       result =  first_number/second_number; break;
    	default: cout << "unbekanntes Rechenzeichen...\n"; return 1;
    	}
    	return result ;
    
    }
    
    int main()
    {   
    
    	long  ergebniss_ganzzahlen = 0;
    	float ergebniss_komma = 0;
    	cout  <<"\t\t\t############################\n"
    		<<  "\t\t\t#     Taschenrechner       #\n"
    		<<  "\t\t\t#     von    Mir :)       #\n"
    		<<  "\t\t\t#     -------------        #\n"                  
    		<<  "\t\t\t############################\n";
    
    	int global_condition = 0 ;
    	while (global_condition == 0) 
    	{ //ANFANG WHILE (global_condition)
    
    	cout << "Wollen sie mit vollen Zahlen , oder Gleitkommazahlen rechnen? \n "
    	     << "Geben sie nun entweder ganz ,oder komma ein\n";
    	string which_numbers = "";
    	cin >> which_numbers ;
    	if (which_numbers == "ganz" || "Ganz"||"GANZ")
    	{
    	// Wenn mit Ganzzahlen gerechnet werden soll kommt dieser Part 
        cout << " Geben sie bitte ihre Rechnung ein und bestätigen sie mit die Eingabe jeweils \n mit Enter\n"
    	     << " Die Rechnung muss 2 Zahlen , und ein Rechenzeichen beinhalten \n";
    
    	long  number_one = 0, number_two = 0 ;
    	char rechenzeichen_auswahl = '\0';
    
    	cout << "Erste Zahl\n";
    	cin >> number_one ;
    	cout << "Rechenzeichen(+  -  *   /  ) \n";
    	cin >> rechenzeichen_auswahl;
    	cout <<"Zweite Zahl\n";
    	cin >> number_two ;
    
    	ergebniss_ganzzahlen =  rechen_function_ganzzahlen(number_one ,number_two ,rechenzeichen_auswahl);
    
    	cout << "Das Ergebnis ihrer Rechnung beträgt : " << ergebniss_ganzzahlen << endl ; 
      // Bis hier mit ganzzahlen 
    	}
    	// Ab hier mit Komma Zahlen 
    	else if(which_numbers == "komma" || "Komma"||"KOMMA" )
    	{
    
        cout << " Geben sie bitte ihre Rechnung ein und bestätigen sie mit die Eingabe jeweils \n mit Enter\n"
    	     << " Die Rechnung muss 2 Zahlen , und ein Rechenzeichen beinhalten \n";
    
    	float  number_1 = 0, number_2 = 0;
    	char rechenzeichen_auswahl = '\0';
    
    	cout << "Erste Zahl\n";
    	cin >> number_1 ;
    	cout << "Rechenzeichen(+  -  *   /  ) \n";
    	cin >> rechenzeichen_auswahl;
    	cout <<"Zweite Zahl\n";
    	cin >> number_2 ;
    
    	ergebniss_komma =  rechen_function_kommazahlen(number_1 ,number_2 ,rechenzeichen_auswahl);
    	cout << "Das Ergebnis ihrer Rechnung beträgt : " << ergebniss_komma << endl ; 
    	// Bis hierhin mit Kommazahlen
    	}
    	cout <<"Moechten sie noch eine Zahl zu ihrem Ergebnis dazu Rechnen , oder wollen sie wieder mit neuen Zahlen Rechnen\n"
    	     <<"Wenn sie mit neuen Zahlen rechnen wollen geben sie \' neu in die Konsole ein \n"
    		 <<"Möchten sie mit dem alten Ergebnis weiterrechnen geben sie \'alt ein \n";
    	string wie_gehts_weiter = "" ;
    	    cin  >> wie_gehts_weiter;
    	int iCondition = 0;
    	while (iCondition == 0)
    
    	{
    
    		if(wie_gehts_weiter == "Neu"||"neu"||"NEU")
    	{
    		cout << "Warum wird dieses If aufgerufen obwohl man alt eingibt \n";
    	}
    
    	else if(wie_gehts_weiter == "alt"||"Alt"||"ALT") // RECHNE MIT ALTEN ZAHLEN WEITER
    	{
    
    	if (which_numbers == "ganz" || "Ganz"||"GANZ")
    	{
    
    	cout << ergebniss_ganzzahlen ;
    	}  
    
    	else if (which_numbers == "komma" || "Komma"||"KOMMA" )
    	{
    	cout << ergebniss_komma ;
    	}
    
    	else
    	{
    	cerr << " Fehler Falsche eingabe bitte komma oder ganz eingeben .\n";
    	}
    
    	} // Ende  elseif wiegehtsweiter == alt
    
    	else
    	{
    	cout << "Falsche Eingabe nitte alt oder neu eingeben\n";
    
    	}
    
    	}//Ende der while(iCondition == 0) Schleife
    
    	}//ENDE WHILE (global_condition)
    return 0 ;
    }
    

    Würde mich über hilfreiche Antworten sehr freuen 🙂 .



  • DerNoob1993 schrieb:

    if(wie_gehts_weiter == "Neu"||"neu"||"NEU")
    

    ->

    if (wie_gehts_weiter == "Neu" || wie_gehts_weiter == "neu" || ... == "NEU")
    

  • Mod

    Was ist denn, wenn der Nutzer "NEu" oder "neU" eintippt?

    if (wie_gehts_weiter == "Neu"||"neu"||"NEU")
    

    Du meinst

    if (wie_gehts_weiter == "Neu" || wie_gehts_weiter == "neu"|| wie_gehts_weiter == "NEU")
    

    Ebenso an all den anderen Stellen, die so ähnlich aussehen. Damit du dich nicht tot tippst, bietet es sich an, dass du eine Funktion zum Stringvergleich schreibst, die dann auch automatisch alle Groß- und Kleinschreibvarianten testet.

    (Oder du nimmst die fertige Funktion dafür aus der Boost Bibliothek)



  • Nathan schrieb:

    DerNoob1993 schrieb:

    if(wie_gehts_weiter == "Neu"||"neu"||"NEU")
    

    ->

    if (wie_gehts_weiter == "Neu" || wie_gehts_weiter == "neu" || ... == "NEU")
    

    Ach ich danke dir vielmals 🙂 daß hab ich bei ganz vielen anderen ifs auch falsch gemacht 😃 .
    War echt verzweifelt , und habe einfach nicht verstanden wieso er immer nur das erste if aufruft ^^.

    @SEPP ja das ist ne sehr gute Idee mir ne Funktionen zum vergleichen von strings zu schreiben.Werde ich mich gleich dranbegeben :).



  • SeppJ schrieb:

    Was ist denn, wenn der Nutzer "NEu" oder "neU" eintippt?

    if (wie_gehts_weiter == "Neu"||"neu"||"NEU")
    

    Du meinst

    if (wie_gehts_weiter == "Neu" || wie_gehts_weiter == "neu"|| wie_gehts_weiter == "NEU")
    

    Ebenso an all den anderen Stellen, die so ähnlich aussehen. Damit du dich nicht tot tippst, bietet es sich an, dass du eine Funktion zum Stringvergleich schreibst, die dann auch automatisch alle Groß- und Kleinschreibvarianten testet.

    (Oder du nimmst die fertige Funktion dafür aus der Boost Bibliothek)

    Bevor du ihn lange im Dunkeln tappen lässt:
    http://en.cppreference.com/w/cpp/algorithm/transform
    http://de.cppreference.com/w/cpp/algorithm/transform

    transform(to_modify.begin(), to_modify.end(), to_modify.begin(), tolower );
    

    Header + namespace suchst du dir selber raus.



  • EOP schrieb:

    SeppJ schrieb:

    Was ist denn, wenn der Nutzer "NEu" oder "neU" eintippt?

    if (wie_gehts_weiter == "Neu"||"neu"||"NEU")
    

    Du meinst

    if (wie_gehts_weiter == "Neu" || wie_gehts_weiter == "neu"|| wie_gehts_weiter == "NEU")
    

    Ebenso an all den anderen Stellen, die so ähnlich aussehen. Damit du dich nicht tot tippst, bietet es sich an, dass du eine Funktion zum Stringvergleich schreibst, die dann auch automatisch alle Groß- und Kleinschreibvarianten testet.

    (Oder du nimmst die fertige Funktion dafür aus der Boost Bibliothek)

    Bevor du ihn lange im Dunkeln tappen lässt:
    http://en.cppreference.com/w/cpp/algorithm/transform
    http://de.cppreference.com/w/cpp/algorithm/transform

    transform(to_modify.begin(), to_modify.end(), to_modify.begin(), tolower );
    

    Header + namespace suchst du dir selber raus.

    Danke , aber ich werde nachdem ich das gröbste vom Taschenrechner fertig habe mich mal selbst dransetzen ,und versuchen eine Funktion zu schreiben welche alle Groß/Kleinschreibvarianten durchgeht,da ich nur dabei etwas lerne.
    Ich schreibe einfach eine Funktion welche jedes Zeichen in einem String durchgeht , und jedes Zeichen mit der tolower() Funktion in einen Kleinbuchstaben umwandelt , dann brauch ich beim if nurnoch eine Bedingung in kleinschrift schreiben .



  • Edit: s. u.



  • Sone, Du nervst!

    -> N3337 §25.3.4/5



  • Caligulaminus schrieb:

    Sone, Du nervst!

    Entspann dich, hab mich versehen. 😃



  • Was mich noch interessieren würde grade.
    Kann man einer switch() anweisung auch irgendwie einen string oder ein char array übergeben?
    Habe beides probiert mein Compiler sagt allerdings " Der Ausdruck muss einen Integralen Typ oder einen Enumerationstyp aufweisen". Gibt es da garkeine möglichkeit? Denn die case Fälle sind wesentlich übersichtlicher , und ich muss noch wesentlich mehr verschachtelte if fälle mit strings einfügen da wäre das mit cases deutlich übersichtlicher finde ich .


  • Mod

    DerNoob1993 schrieb:

    Was mich noch interessieren würde grade.
    Kann man einer switch() anweisung auch irgendwie einen string oder ein char array übergeben?
    Habe beides probiert mein Compiler sagt allerdings " Der Ausdruck muss einen Integralen Typ oder einen Enumerationstyp aufweisen". Gibt es da garkeine möglichkeit? Denn die case Fälle sind wesentlich übersichtlicher , und ich muss noch wesentlich mehr verschachtelte if fälle mit strings einfügen da wäre das mit cases deutlich übersichtlicher finde ich .

    Nein, das geht nicht direkt. Das solltest du auch gar nicht brauchen. switch ist zwar bei Anfängern recht beliebt, kommt meiner Erfahrung nach praktisch aber so gut wie nie vor. Technisch geht es bei der switch-Anweisung eher um schnelle Sprünge im Maschinencode. Wenn es jedoch darum geht, massive if-Kaskaden zu vermeiden, so sind andere Techniken meistens viel besser geeignet. Was genau hast du vor? Vielleicht wäre eine map<string, irgendwas> das richtige. Nein, das ist wahrscheinlich noch weit über dem, was du derzeit kennst. Ein guter Anfang sind, wie schon gesagt, Funktionen. Vielleicht kannst du das, was du vor hast, in schöne Funktionen, mit jeweils klar umrissenen Aufgaben, fassen. Erfahrungsgemäß vereinfachen sich dadurch viele Probleme so weit, dass sie sich praktisch von alleine lösen.



  • Nein, nur einen int (wobei enum gewissermaßen auch ein int ist).

    EDIT: Da war ich wohl anderthalb Minuten zu langsam. 🙂



  • SeppJ schrieb:

    DerNoob1993 schrieb:

    Was mich noch interessieren würde grade.
    Kann man einer switch() anweisung auch irgendwie einen string oder ein char array übergeben?
    Habe beides probiert mein Compiler sagt allerdings " Der Ausdruck muss einen Integralen Typ oder einen Enumerationstyp aufweisen". Gibt es da garkeine möglichkeit? Denn die case Fälle sind wesentlich übersichtlicher , und ich muss noch wesentlich mehr verschachtelte if fälle mit strings einfügen da wäre das mit cases deutlich übersichtlicher finde ich .

    Nein, das geht nicht direkt. Das solltest du auch gar nicht brauchen. switch ist zwar bei Anfängern recht beliebt, kommt meiner Erfahrung nach praktisch aber so gut wie nie vor. Technisch geht es bei der switch-Anweisung eher um schnelle Sprünge im Maschinencode. Wenn es jedoch darum geht, massive if-Kaskaden zu vermeiden, so sind andere Techniken meistens viel besser geeignet. Was genau hast du vor? Vielleicht wäre eine map<string, irgendwas> das richtige. Nein, das ist wahrscheinlich noch weit über dem, was du derzeit kennst. Ein guter Anfang sind, wie schon gesagt, Funktionen. Vielleicht kannst du das, was du vor hast, in schöne Funktionen, mit jeweils klar umrissenen Aufgaben, fassen. Erfahrungsgemäß vereinfachen sich dadurch viele Probleme so weit, dass sie sich praktisch von alleine lösen.

    Ok ich danke dir für die Antwort.
    Dann werd ichs einfach in Funktionen packen um es übersichtlich zu halten.


  • Mod

    EOP schrieb:

    Nein, nur einen int (wobei enum gewissermaßen auch ein int ist) integrale Typen, Aufzählungstypen, oder Klassen mit einem eindeutigen Umwandlungsoperator hin zu einem integralen oder Aufzählungstyp.

    FTFY 🙂 .
    http://www.c-plusplus.net/forum/194356



  • SeppJ schrieb:

    EOP schrieb:

    Nein, nur einen int (wobei enum gewissermaßen auch ein int ist) integrale Typen, Aufzählungstypen, oder Klassen mit einem eindeutigen Umwandlungsoperator hin zu einem integralen oder Aufzählungstyp.

    FTFY 🙂 .
    http://www.c-plusplus.net/forum/194356

    TY. 😉
    Fehlen noch Funktionen, die einen integralen- oder Aufzählungstypen zurückgeben.

    Hatte aber eigentlich nicht vor einen offensichtlichen Anfänger mit zu detaillierten Infos eher zu verwirren als ihm eine einfache Antwort zu geben.

    Das passiert hier schon viel zu oft, daß auf einfache Fragen manche Leute meinen mit "Kuck mal was ich Tolles kenne, was du garantiert nicht verstehst" antworten zu müssen.

    Wobei ich sicher nicht dich damit meine.



  • Sind Aufzählungstypen gleichbedeutend mit Charakteren, also "char" ?

    mfg



  • HarteWare schrieb:

    Sind Aufzählungstypen gleichbedeutend mit Charakteren, also "char" ?

    Nein. Aufzählungstypen sind enum s.



  • Ach ja, bool und char geht auch noch.
    Im Prinzip wohl alles, was in einem einzigen Register übergeben werden kann.

    EDIT: ...und kein pointer ist (wobei ich das noch nicht versucht habe).


  • Mod

    EOP schrieb:

    Fehlen noch Funktionen, die einen integralen- oder Aufzählungstypen zurückgeben.

    Das sind aber keine Typen, sondern Ausdrücke.

    Das passiert hier schon viel zu oft, daß auf einfache Fragen manche Leute meinen mit "Kuck mal was ich Tolles kenne, was du garantiert nicht verstehst" antworten zu müssen.

    Das ist eher so als Klarstellung/Ausblick gemeint. Wenn du gleich mit meiner Antwort gekommen wärst, hätte ich wohl im Gegenteil eine Antwort wie deine darunter geschrieben, damit der TE es auch versteht.

    EOP schrieb:

    Ach ja, bool und char geht auch noch.
    Im Prinzip wohl alles, was in einem einzigen Register übergeben werden kann.

    Nein, das ist nicht das Kriterium. Es geht um die Ganzzahligkeit. Fließkommazahlen gehen z.B. nicht.



  • SeppJ schrieb:

    EOP schrieb:

    Das passiert hier schon viel zu oft, daß auf einfache Fragen manche Leute meinen mit "Kuck mal was ich Tolles kenne, was du garantiert nicht verstehst" antworten zu müssen.

    Das ist eher so als Klarstellung/Ausblick gemeint. Wenn du gleich mit meiner Antwort gekommen wärst, hätte ich wohl im Gegenteil eine Antwort wie deine darunter geschrieben, damit der TE es auch versteht.

    Hahaha, das ist mal cool. 👍


Log in to reply