Taschenrechner spinnt



  • Hallo ich versuche gerade einen Taschenrechner zu schreiben.
    Habe jedoch ein kleines Problem. Hier erstmal der Code.

    #include <iostream>
    
    using namespace std;
    
    int Menu();
    void Addition();
    void Subtruction();
    void Division();
    void Multiplication();
    void Exponentiation();
    
    int main()
    {
    	bool exit = false;
    
    	for (;;)
     {
    	int Wahl = Menu();
    
    	switch(Wahl)
    	{
    	case 1: Addition();	
            break;			
    	case 2: Subtruction();           
    		break;
    	case 3: Division();               
            break;
    	case 4: Multiplication();        
    		break;
    	case 5: Exponentiation();         
    		break;
    	case 6: exit=true;                
    		break;
    	default: cout << "\n___PLEASE TRY AGAIN___\n\n";
    		break;
        }
    
    	if(exit)
    		break;
    	}
    	return 0;
    
     }
    	int Menu()
    
    	{
        int Wahl;
    	cout << "CALCULATOR 0.1 Beta" << endl;
    	cout << "\nNumber + Enter" << endl;
    	cout << "\n(1) - Addition" << endl;
    	cout << "(2) - Subtruction" << endl;
    	cout << "(3) - Division" << endl;
    	cout << "(4) - Multiplication" << endl;
    	cout << "(5) - Exponentiation" << endl;
    	cout << "(6) - Exit" << endl;
    	cin >> Wahl;
    	return Wahl;
    	}
    
    void Addition()
    {
    		float Sum = 0;
    		float Y;
    
    		while(cin >> Y)
    		Sum+=Y;
    		cout << Sum << endl;
    }
    
    void Subtruction()
    {
    		float X;
    		float Y;
    		float C;
    		cin >> X >> Y;
    		C=X-Y;
    		cout << C << endl;
    }
    void Division()
    {
    		float X;
    		float Y;
    		float C;
    		cin >> X >> Y;
    		C=X/Y;
    		cout << C << endl;
    }
    void Multiplication()
    	{
    	    float X;
    		float Y;
    		float C;
    		cin >> X >> Y;
    		C=X*Y;
    		cout << C << endl;
    }
    void Exponentiation()
    {
    	int N1;
    	int Po;
    	cin >> N1 >> Po;
    	int Res = 1;
    	for(int cnt = 0; cnt!=Po; ++cnt)
    	Res*=N1;
    	cout << "\n" << Res << "\n" << endl;
    }
    

    Zum Problem:
    Wenn ich jetzt zur Addtition gehe und mehrere Zahlen in einer Reihe eingebe und anschließend mit STRG+D das Ergebnis aufrufen will, wiederholt er einfach nur das Menu unendlich lange. Wo ist das Problem? Das ist nicht nur bei der Addition so, sondern bei den anderen auch.
    Ich weiß man könnte das ganze viel kürzer fassen, aber ich mache es nur zur Übung.


  • Mod

    Wenn der Eingabestream cin nicht mehr good() ist (zum Beispiel weil du mit CTRL+D das Ende des Streams markiert hast), dann schlagen alle folgenden Leseversuche aus dem stream fehl, unter anderem auch die Eingabe im Menü. Ein cin.clear() am Ende deiner Rechenfunktionen bringt das wieder in Ordnung.



  • Ich habe ein cin.clear() am ende der Rechenfunktion gesetzt, jedoch hat es leider nicht geklappt. Vielleicht hab ich es ja auch nur an der falschen Stelle eingesetzt. Könntest du es im Code reinschreiben?


  • Mod

    Zwischen Zeile 65 und 68.



  • klappt irgendwie immernoch noch 😞 der überspringt einfach beim zweiten durchlauf die zeile 56 und nimmt dann gleich in zeile 34 das default. obwohl ich nichts bestätigt habe...



  • Warum so eine spezielle Addition:

    void Addition()
    {
        float Sum = 0;
        float Y;
    
        while(cin >> Y)
            Sum+=Y;
        cout << Y << endl;
    }
    

    😕



  • f.-th. schrieb:

    Warum so eine spezielle Addition:

    void Addition()
    {
        float Sum = 0;
        float Y;
    
        while(cin >> Y)
            Sum+=Y;
        cout << Y << endl;
    }
    

    😕

    ich weiß ^^ da soll Sum ausgewertet werden und nicht Y



  • dann bau das mal um damit der Compiler versteht was du willst

    while(cin >> Y)
            Sum+=Y;
    

    😕



  • f.-th. schrieb:

    dann bau das mal um damit der Compiler versteht was du willst

    while(cin >> Y)
            Sum+=Y;
    

    😕

    was ist daran falsch? ich hatte es schon bei mir korregiert gehabt, habs nur vergessen hier im code zu ändern.
    mein problem besteht immernoch 🙄



  • Teste mal nicht deine Addition- oder deine Exponeten-Funktion zuerst, sondern eine der anderen Funktionen - hast du dann auch den Fehler?



  • f.-th. schrieb:

    Teste mal nicht deine Addition- oder deine Exponeten-Funktion zuerst, sondern eine der anderen Funktionen - hast du dann auch den Fehler?

    nein es ist nur bei der addition so, weils mehrere zahlen sind, die eingegeben werden und ich es nur mit STRG+D aufrufen kann. kenne zumindest keine andere lösung. ich will jedoch später die anderen rechenarten auch mit mehreren eingabemöglichkeiten kombinieren lassen, sodass z.b. ein 20/2/2/2 möglich ist. das wird aber nicht klappen da ich wieder STRG+D brauche und das programm wieder anfängt zu spinnen.

    edit: ich habe ein system("PAUSE") bei der addition eingesetzt. da komm ich zwar auf das ergebnis, aber nach der bestätigung mit enter spinnt der wieder rum, antatt wieder zum menu zu gehen.



  • Es gibt ja mehrere Möglichkeiten so was zu realisieren.

    z.B. ist es auch möglich die Rechenoperationen "+, -, *, /" direkt abzufragen und nicht über 1, 2, 3, 4 😉

    Hier mal ein wenig Code:

    void Addition()
    {
        float Sum = 0;
        float Y;
        cout << "Bitte 1. Summanden eingeben: ";
        cin >> Sum;
        cout << endl;
        do
        {
            cout << "Bitte weitere Summanden eingeben: ";
            cin >> Y;
            Sum=Sum+Y;
        }
        while(Y!=0);
        cout << "Das Ergebnis der Addition: " << Sum << endl;
    }
    

    Ich hoffe du schaust dir das genau an, damit du den Quelltext verstehst.

    Das ist aber nur eine von mehreren Varianten.


Anmelden zum Antworten