Kleines problem :(



  • Hi hab mal ne cpp aus spass gemacht und will versuchen alles was ich bis jetzt gelernt hab unterzubringen um es zufestigen.
    Aber bei den switch funktionen hab ich noch das problem das er immer die default einspielt obwohl alles korrekt funktioniert.

    Hier mal die datei:

    #include <iostream>
    using namespace std;
    int zahl1;
    int zahl2;
    int erg;
    
    int function(int, int, int);
    
    int main()
    {
    	cout<<"Dies ist ein grosses test programm"<<endl
    		<<"Wir beginnen mit der deklaration von 2 zahlen"<<endl
    		<<"Nun geben sie die beiden zahlen ein!"<<endl;
    		cin>>zahl1;
    		cin>>zahl2;
    		cout<<"Nun deklarieren wir einen switch opaerator"<<endl;
    		int op;
    		cout<<"Was wollen sie jetzt tun?"<<endl
    			<<"Geben sie nun ein was sie mit den zahlen tun wollen!"<<endl;
    		cout<<"Hier eine uebersicht(1=booltest, 2=zeiger auf die zahl1 und 2"<<endl 
    			<<"im speicher und 3=funktionsrechnung)"<<endl;
    		cin>>op;
    		switch (op)
    		{
    		case 1:
    			cout<<"Nun Wird die zahl mit bool getestet!"<<endl
    				<<"wenn sie gleich sind ist der wert true, wenn nicht dann false"<<endl;
    			cout.setf(cout.boolalpha);
    			bool test;
    			test=(zahl1==zahl2);
    			cout<<"Das Ergebnis ist "<<test<<endl;
    			break;
    		case 2:
    			cout<<"Nun Werden die zahlen mit zeigern im speicher angezeigt!"<<endl;
    		int* pzahl1;
    		int* pzahl2;
    		pzahl1=&zahl1;
    		pzahl2=&zahl2;
    		cout<<"Die addressen von zahl1 und 2 ist:"<<pzahl1<<pzahl2<<endl
    			<<"Nun wurde die addresse in pzahl1 und 2 gespeichert"<<endl;
    		cout<<"Nun geben wir über die zeiger einen neuen wert fuer pzahl1 und 2!"<<endl;
    			*pzahl1=100;
    			*pzahl2=200;
    			cout<<"Die werte sind nun:"<<*pzahl1 <<", "<<*pzahl2<<endl;
    			break;
    		case 3:
    			cout<<"Nun lassen wir die beiden Zahlen über eine funktion addieren!"<<endl;
    			zahl1, zahl2, erg=function(zahl1, zahl2, erg);
    			cout<<"Hier nun Das ergebnis:"<<erg<<endl;
    		}
    
       system("PAUSE");
    }
    
    int function(int zahl1, int zahl2, int erg)
    {
    	cout<<"Wollen sie einen neuen wert für die zahlen eingeben?"<<endl
    		<<"Wenn ja dann drücken sie 1, Wenn nicht dann 2"<<endl;
    	char wechsel2;
    	cin>>wechsel2;
    	switch(wechsel2)
    	{
    	case 1:
    		cout<<"Geben sie nun die neuen 2 zahlen ein"<<endl;
    		cin>>zahl1;
    		cin>>zahl2;
    		break;
    	case 2:
    		cout<<"Okay weiter gehts"<<endl;
    		break;
    	default:
    		cout<<"Eingabe Ungueltig"<<endl;
    	}
    	cout<<"Was wollen sie nun tun?"<<endl
    		<<"Hier die übersicht(1=+,2=-,3=*,4=/)"<<endl;
    		char(op2);
    		cin>>op2;
    	switch(op2)
    	{
    	case 1:
    		erg=zahl1+zahl2;
    		break;
    	case 2:
    		erg=zahl1-zahl2;
    		break;
    	case 3:
    		erg=zahl1*zahl2;
    		break;
    	case 4:
    		erg=zahl1/zahl2;
    		break;
    	default:
    		cout<<"Eingabe Ungueltig"<<endl;
    	}
    	return erg;
    }
    

    Das war jetzt ungefähr die arbeit von 10-20 mins also nicht gleich lässtern über einen Anfänger wie mich 😉
    Aber da ich noch keine Arrays, strings, und if und lse und und und noch nicht drin hab ist das programm nicht fertig und deshalb sind die ausgaben auch noch nicht richtig beschrieben(also ne kleine denkhilfe für mich und die zeilen umbüche kommen auch noch besser rein) :p



  • Wenn jemand 1 eingibt und du das in char einliest, bekommst du '1', nicht 1.



  • Die Zahl 1 enspricht nicht dem Zeichen 1



  • Dein Problem ist der Wert der switch-Variablen. Dort wurde nach dem cin>>wechsel2 ein Zeichenwert (im Regelfall '1'=0x31 oder '2'=0x32) eingetragen, aber dann überprüfst du auf die Werte 1 oder 2 (das sind keine darstellbaren Zeichen). Also entweder du änderst die Abfragevariable auf int (dann wird das automatisch konvertiert) oder die case-Anweisungen auf "case '1':" etc.



  • *vor kopf hau* Danke der fehler war das ich ein char anstelle eines int deklariert habe 😢 Danke an alle 🙂

    EDIT:Okay funktioniert einwand frei. 😉
    Bald kommt der nächste teil. 🙂



  • mal unabhängig von deinem problem:
    warum sind nutzt du globale variablen? (1. schlechter stil und 2. in deinem beispiel nicht mal nötig).
    und weshalb übergibst du der funktion function denn erg? ebenfalls nicht nötig.



  • Okay die globalen werden gleich gefixt und erg brauch ich auch nicht 😉
    ich könnte ja auch return zahl1+zahl2; schreien 😉

    EDIT:Hier der neue code ohne Globale Variablen und ohne erg in der funktion:

    #include <iostream>
    using namespace std;
    
    int function(int, int);
    
    int main()
    {
    	cout<<"Dies ist ein grosses test programm"<<endl
    		<<"Wir beginnen mit der deklaration von 2 zahlen"<<endl
    		<<"Nun geben sie die beiden zahlen ein!"<<endl;
    		int zahl1;
    		int zahl2;
    		int erg;
    		cin>>zahl1;
    		cin>>zahl2;
    		cout<<"Nun deklarieren wir einen switch opaerator"<<endl;
    		int op;
    		cout<<"Was wollen sie jetzt tun?"<<endl
    			<<"Geben sie nun ein was sie mit den zahlen tun wollen!"<<endl;
    		cout<<"Hier eine uebersicht(1=booltest, 2=zeiger auf die zahl1 und 2"<<endl 
    			<<"im speicher, 3=funktionsrechnung, 4=Arrays)"<<endl;
    		cin>>op;
    		switch (op)
    		{
    		case 1:
    			cout<<"Nun Wird die zahl mit bool getestet!"<<endl
    				<<"wenn sie gleich sind ist der wert true, wenn nicht dann false"<<endl;
    			cout.setf(cout.boolalpha);
    			bool test;
    			test=(zahl1==zahl2);
    			cout<<"Das Ergebnis ist "<<test<<endl;
    			break;
    		case 2:
    			cout<<"Nun Werden die zahlen mit zeigern im speicher angezeigt!"<<endl;
    		int* pzahl1;
    		int* pzahl2;
    		pzahl1=&zahl1;
    		pzahl2=&zahl2;
    		cout<<"Die addressen von zahl1 und 2 ist:"<<pzahl1<<pzahl2<<endl
    			<<"Nun wurde die addresse in pzahl1 und 2 gespeichert"<<endl;
    		cout<<"Nun geben wir über die zeiger einen neuen wert fuer pzahl1 und 2!"<<endl;
    			*pzahl1=100;
    			*pzahl2=200;
    			cout<<"Die werte sind nun:"<<*pzahl1 <<", "<<*pzahl2<<endl;
    			break;
    		case 3:
    			cout<<"Nun lassen wir die beiden Zahlen über eine funktion addieren!"<<endl;
    			zahl1, zahl2, erg=function(zahl1, zahl2);
    			cout<<"Hier nun Das ergebnis:"<<erg<<endl;
    			break;
    		case 4:
    			cout<<"Nun wollen wir mal mit arrays handtieren."<<endl;
    			int array[]={zahl1, zahl2};
    			cout<<"Array1:"<<array[0]<<endl;
    			cout<<"Array2:"<<array[1]<<endl;
    		}
    
       system("PAUSE");
    }
    
    int function(int zahl1, int zahl2)
    {
    	cout<<"Wollen sie einen neuen wert für die zahlen eingeben?"<<endl
    		<<"Wenn ja dann drücken sie 1, Wenn nicht dann 2"<<endl;
    	int wechsel2;
    	cin>>wechsel2;
    	switch(wechsel2)
    	{
    	case 1:
    		cout<<"Geben sie nun die neuen 2 zahlen ein"<<endl;
    		cin>>zahl1;
    		cin>>zahl2;
    		break;
    	case 2:
    		cout<<"Okay weiter gehts"<<endl;
    		break;
    	default:
    		cout<<"Eingabe Ungueltig"<<endl;
    	}
    	do
    {
        cout<<"Was wollen sie nun tun?"<<endl
    		<<"Hier die übersicht(1=+,2=-,3=*,4=/)"<<endl;
        int(op2);
        cin>>op2;
        switch(op2)
        {
        case 1:
    		return zahl1+zahl2;
        case 2:
            return zahl1-zahl2;
        case 3:
            return zahl1*zahl2;
        case 4:
            return zahl1/zahl2;
        default:
            cout<<"Eingabe Ungueltig"<<endl;
        }
    } while(true);
    }
    


  • noch zwei Punkte zu function():
    - nach dem return ist ein break überflüssig, da dort die Funktion und damit auch der switch-Block verlassen wird.
    - im Default-Zweig des unteren switch wird kein Rückgabewert angegeben. Dort solltest du entweder einen Dummy-Wert angeben oder zurück zur Operationsabfrage wechseln:

    //Variante (a)
    cout<<"Operation?"<<endl
    int(op2);// hier sind übrigens die Klammern zu viel
    cin>>op2;
    switch(op2)
    {
    case 1:
        return zahl1+zahl2;
    case 2:
        return zahl1-zahl2;
    case 3:
        return zahl1*zahl2;
    case 4:
        return zahl1/zahl2;
    default:
        cout<<"Eingabe Ungueltig"<<endl;
        return -1;
    }
    
    //Variante (b)
    do
    {
        cout<<"Operation?"<<endl
        int(op2);
        cin>>op2;
        switch(op2)
        {
        case 1:
        return zahl1+zahl2;
        case 2:
            return zahl1-zahl2;
        case 3:
            return zahl1*zahl2;
        case 4:
            return zahl1/zahl2;
        default:
            cout<<"Eingabe Ungueltig"<<endl;
        }
    } while(true);
    

    Und nochmal zurückzukommen auf deine ursprüngliche Version: Du kannst ruhig char verwenden und dann den eingelesenen Wert nach 'j'/'n' bzw. '+'/'-'/'*'/'/' abfragen - ist womöglich benutzerfreundlicher 😉



  • Habs gemacht aber es kamm die fehler meldung:

    ------ Erstellen gestartet: Projekt: printf, Konfiguration: Debug Win32 ------

    Kompilieren...
    printf.cpp
    c:\Dokumente und Einstellungen\Milbret\Eigene Dateien\Visual Studio Projects\C++ Projekte\printf\printf.cpp(69) : error C2065: 'j': nichtdeklarierter Bezeichner
    c:\Dokumente und Einstellungen\Milbret\Eigene Dateien\Visual Studio Projects\C++ Projekte\printf\printf.cpp(69) : error C2051: case-Ausdruck ist keine Konstante
    c:\Dokumente und Einstellungen\Milbret\Eigene Dateien\Visual Studio Projects\C++ Projekte\printf\printf.cpp(74) : error C2065: 'n': nichtdeklarierter Bezeichner
    c:\Dokumente und Einstellungen\Milbret\Eigene Dateien\Visual Studio Projects\C++ Projekte\printf\printf.cpp(74) : error C2051: case-Ausdruck ist keine Konstante
    c:\Dokumente und Einstellungen\Milbret\Eigene Dateien\Visual Studio Projects\C++ Projekte\printf\printf.cpp(79) : warning C4065: switch-Anweisung enthält 'default', aber keine case-Marken

    Das Build-Protokoll wurde unter "file://c:\Dokumente und Einstellungen\Milbret\Eigene Dateien\Visual Studio Projects\C++ Projekte\printf\Debug\BuildLog.htm" gespeichert.
    printf - 4 Fehler, 1 Warnung(en)

    ---------------------- Fertig ----------------------

    Erstellen: 0 erfolgreich, 1 fehlgeschlagen, 0 übersprungen

    sonst mit int zahlen geht es ohne probleme. 😮

    hier der geänderte code:

    #include <iostream>
    using namespace std;
    
    int function(int, int);
    
    int main()
    {
    	cout<<"Dies ist ein grosses test programm"<<endl
    		<<"Wir beginnen mit der deklaration von 2 zahlen"<<endl
    		<<"Nun geben sie die beiden zahlen ein!"<<endl;
    		int zahl1;
    		int zahl2;
    		int erg;
    		cin>>zahl1;
    		cin>>zahl2;
    		cout<<"Nun deklarieren wir einen switch opaerator"<<endl;
    		int op;
    		cout<<"Was wollen sie jetzt tun?"<<endl
    			<<"Geben sie nun ein was sie mit den zahlen tun wollen!"<<endl;
    		cout<<"Hier eine uebersicht(1=booltest, 2=zeiger auf die zahl1 und 2"<<endl 
    			<<"im speicher, 3=funktionsrechnung, 4=Arrays)"<<endl;
    		cin>>op;
    		switch (op)
    		{
    		case 1:
    			cout<<"Nun Wird die zahl mit bool getestet!"<<endl
    				<<"wenn sie gleich sind ist der wert true, wenn nicht dann false"<<endl;
    			cout.setf(cout.boolalpha);
    			bool test;
    			test=(zahl1==zahl2);
    			cout<<"Das Ergebnis ist "<<test<<endl;
    			break;
    		case 2:
    			cout<<"Nun Werden die zahlen mit zeigern im speicher angezeigt!"<<endl;
    		int* pzahl1;
    		int* pzahl2;
    		pzahl1=&zahl1;
    		pzahl2=&zahl2;
    		cout<<"Die addressen von zahl1 und 2 ist:"<<pzahl1<<pzahl2<<endl
    			<<"Nun wurde die addresse in pzahl1 und 2 gespeichert"<<endl;
    		cout<<"Nun geben wir über die zeiger einen neuen wert fuer pzahl1 und 2!"<<endl;
    			*pzahl1=100;
    			*pzahl2=200;
    			cout<<"Die werte sind nun:"<<*pzahl1 <<", "<<*pzahl2<<endl;
    			break;
    		case 3:
    			cout<<"Nun lassen wir die beiden Zahlen über eine funktion addieren!"<<endl;
    			zahl1, zahl2, erg=function(zahl1, zahl2);
    			cout<<"Hier nun Das ergebnis:"<<erg<<endl;
    			break;
    		case 4:
    			cout<<"Nun wollen wir mal mit arrays handtieren."<<endl;
    			int array[]={zahl1, zahl2};
    			cout<<"Array1:"<<array[0]<<endl;
    			cout<<"Array2:"<<array[1]<<endl;
    		}
    
       system("PAUSE");
    }
    
    int function(int zahl1, int zahl2)
    {
    	cout<<"Wollen sie einen neuen wert für die zahlen eingeben?"<<endl
    		<<"Wenn ja dann drücken sie 1, Wenn nicht dann 2"<<endl;
    	int wechsel2;
    	cin>>wechsel2;
    	switch(wechsel2)
    	{
    	case 1:
    		cout<<"Geben sie nun die neuen 2 zahlen ein"<<endl;
    		cin>>zahl1;
    		cin>>zahl2;
    		break;
    	case 2:
    		cout<<"Okay weiter gehts"<<endl;
    		break;
    	default:
    		cout<<"Eingabe Ungueltig"<<endl;
    	}
    	cout<<"Was wollen sie nun tun?"<<endl
    		<<"Hier die übersicht(1=+,2=-,3=*,4=/)"<<endl;
    	do
    {
        cout<<"Operation?"<<endl;
        int(op2);
        cin>>op2;
        switch(op2)
        {
        case 1:
        return zahl1+zahl2;
        case 2:
            return zahl1-zahl2;
        case 3:
            return zahl1*zahl2;
        case 4:
            return zahl1/zahl2;
        default:
            cout<<"Eingabe Ungueltig"<<endl;
        }
    } while(true);
    }
    


  • Char-Konstanten werden auch nicht als j geschrieben, sondern als 'j', alles andere wären (in deinem Fall unbekannte) Variablen:

    char w;
    cin >> w;
    switch(tolower(w))//damit werden Großbuchstaben abgefangen
    {
    case 'j': // j = "ja"
    case 'y': // für die Briten: y = "yes"
        cout<<"Geben sie nun die neuen 2 zahlen ein"<<endl;
        cin>>zahl1;
        cin>>zahl2;
        break;
    case 'n': // n = "nein" / "no"
        cout<<"Okay weiter gehts"<<endl;
        break;
    default:
        cout<<"Eingabe Ungueltig"<<endl;
    }
    


  • h3h3 danke für den tipp bin ja noch anfänger 😞 😉


Anmelden zum Antworten