Unterprogramme - Rechner



  • #include <iostream>
    using namespace std;
    
    int rechentyp()
    {
    	double ergebnis = 0;
    	char eingabe;
    	do
    	{
    		cout << ergebnis;
    		cin >> eingabe;
    
    		switch(eingabe)
    		{
    		case '+': plus; break;
    		case '-': minus; break;
    		case '/': durch; break;
    		case '*': mal; break;
    		case 'c': ergebnis=0; break;
    		default: cout << "falsche eingabe"; break;
    		}
    		cout << ergebnis;
    	}while(eingabe!=e);
    }
    
    void plus()
    {
    	double zahl;
    	cin >> zahl;
    	ergebnis+=zahl;
    }
    
    void minus()
    {
    	double zahl;
    	cin >> zahl;
    	ergebnis-=zahl;
    }
    
    void durch()
    {
    	double zahl;
    	cin >> zahl;
    	ergebnis/=zahl;
    }
    
    void mal()
    {
    	double zahl;
    	cin >> zahl;
    	ergebnis*=zahl;
    }
    

    aber wie ihr sicher seht funktioniert das nicht 😃



  • sezai11 schrieb:

    aber wie ihr sicher seht funktioniert das nicht 😃

    Sehen wir nicht sofort, von daher wäre es fürs nächste Mal gut, wenn du die Fehlermeldung angeben könntest. Aber sehr gut, dass du [cpp]-Tags verwendet hast! 🙂

    Zu deinem Problem: Du verwendest Variablen, die nicht im Scope (Gültigkeits- und Sichtbarkeitsbereich) der Funktion sind. Benutze Parameter (evtl. Rückgabetyp), um mit der Aussenwelt zu kommunizieren. Hier mit einer Referenz:

    void plus(double& ergebnis)
    {
        double zahl;
        cin >> zahl;
        ergebnis+=zahl;
    }
    

    Beim Aufruf musst du dann das entsprechende Argument übergeben. Zum Beispiel so:

    int main()
    {
        double resultat = 0.0;
        plus(resultat);
        std::cout << resultat << std::endl;
    }
    

    Allerdings sind das wirklich Grundlagen. Funktionen sind etwas vom Elementarsten in C++, ohne sie kannst du keine sinnvollen Programme schreiben. Du solltest dir deshalb die Zeit nehmen, um ein gutes C++-Buch zu studieren, z.B. den C++-Primer. Ohne vollständige Theorie wirst du dauernd Wissenslücken haben, auch ein Forum hilft da nur bedingt. Glaub mir, das ist gut investierte Zeit. 😉


  • Mod

    Beschäftige dich mal mit Variablen, Sichtbarkeit und Funktionsaufrufen, dann sollte dir dein Fehler klar werden. Also genau das, was du bei dieser Aufgabe lernen sollst.



  • ja wie gesagt bin student im ersten semester und wir fangen grad erst an hatten vll 5 vorlesungen und hello world ist noch garnicht lang her. 😃

    ich habe jetzt einen anderen weg eingeschlagen, einen den ich zu 100% verstehe naja zu 99% sonst würd ich hier jetzt nicht schauen..

    #include <iostream>
    using namespace std;
    
    int main()
    {
        double zahl1;
    	double ergebnis = 0;
        char rechenzeichen; 
    	enum {start,end} state=start;
    
        cin >> rechenzeichen >> zahl1;
    
    	while(state!=end)
    	{
    	switch(rechenzeichen)
    		{                             
            case '+': ergebnis += zahl1; break;       
            case '-': ergebnis -= zahl1; break;       
            case '*': ergebnis *= zahl1; break;       
            case '/': ergebnis /= zahl1; break;
    		case 'e': ergebnis = 0; break;
    		case 'q': state=end;
            default: cout << "unbekanntes Rechenzeichen...\n"; return 1;
    		}
    	cout << "-> " << ergebnis;break;
    	}
    
    }
    

    das programm funktioniert, allerdings wird es nach der ersten eigabe berechnet und beendet, sprich es ist nur einmal möglich +1 oder *4 einzugeben dann ist schluss, wie mach ichs so das ich danach wieder etwas eingeben kann?

    @seppJ du hast recht und das werde ich auch sofort tun, denn dieser weg hier oben ist anscheinend nicht der "verlangte" allerdings juckt mich das grad 😃 kennt ihr sicher 🙂

    und @ nexus

    danke für die ansätze



  • Du hast ein 'break' zuviel -)

    Am besten immer den Debugger nehmen und dann Zeile für Zeile durchsteppen, damit kann man die meisten Programmierfehler finden.



  • ja aber wenn ich das letzte break wegnehm, führt er automatisch immer wieder die selbe funktion aus

    geb ich +5 ein

    0 5 10 15 20... bis xxxxxxxxxxxx...


  • Mod

    sezai11 schrieb:

    ja aber wenn ich das letzte break wegnehm, führt er automatisch immer wieder die selbe funktion aus

    geb ich +5 ein

    0 5 10 15 20... bis xxxxxxxxxxxx...

    Das liegt daran, dass bei dir die Eingabe außerhalb der Schleife erfolgt.



  • #include<iostream>
        using namespace std;
    
        double mul(int);
        double divi(int);
    	double add(int);
    	double sub(int);
    	int ergebnis=0;
    
        int main()
        {
            cout << "Bitte geben Sie die Rechnung ein:\n";
            char zeichen;
    		double	zahl;
    		bool eingabe=true;
    		while(eingabe)
    		{
    		cin >> zeichen >> zahl;
    		switch(zeichen)
    		{                             
    			case '+': add(ergebnis,zahl); break;       
    			case '-': sub(ergebnis,zahl); break;       
    			case '*': mul(ergebnis,zahl); break;       
    			case '/': divi(ergebnis,zahl); break;
    			case 'e': ergebnis*0; break;
    			case 'q': eingabe=false;
    			default: cout << "unbekanntes Rechenzeichen...\n"; return 0;
    		}
    		cout << "-> " << ergebnis;
    		}
        }
    
        double add(int a) //Definition einer Funktion
        {
          return a + ergebnis;
        }
    
    	double sub(int c) //Definition einer Funktion
        {
          return ergebnis-c;
        }
    
    	double mul(int e) //Definition einer Funktion
        {
          return e * ergebnis;
        }
    
    	double divi(int g) //Definition einer Funktion
        {
          return ergebnis / g;
        }
    

    so bin ich die sache nun angegangen allerdings funktioniert nun garnichtsmehr 😞


  • Mod

    sezai11 schrieb:

    so bin ich die sache nun angegangen allerdings funktioniert nun garnichtsmehr 😞

    das liegt daran, dass du nichts mit deinen Returnwerten machst. Entweder übergibst du das aktuelle Ergebnis per Referenz oder du musst das Ergebnis der Rechnung der Variable zahl zuweisen.



  • double mul(int);
    double divi(int);
    double add(int);
    double sub(int);
    int ergebnis=0;
    
    case '+': add(ergebnis,zahl); break;       
                case '-': sub(ergebnis,zahl); break;       
                case '*': mul(ergebnis,zahl); break;       
                case '/': divi(ergebnis,zahl); break;
    
    char zeichen;
            double    zahl;
            bool eingabe=true;
            while(eingabe)
            {
            cin >> zeichen >> zahl;
    

    davon passt rein gar nix zusammen...

    welchen teil davon verstehst du denn nicht?
    du musst jz auch gar nicht so tun, als ob du alle 3 bergeifen würdest, sonst würdest du es nicht so chaotisch anstellen ;o)

    bb



  • hmm ich versuche dir einfach mal zu erklären was ich mit den dingen vorhatte 😃

    unskilled schrieb:

    double mul(int); 
    double divi(int);
    double add(int);
    double sub(int);
    int ergebnis=0;
    
    // hier wollte ich halt variablen aufstellen, die von jedem der programme abgerufen werden können
    
    case '+': add(ergebnis,zahl); break;       
                case '-': sub(ergebnis,zahl); break;       
                case '*': mul(ergebnis,zahl); break;       
                case '/': divi(ergebnis,zahl); break;
    
    // hier sollte er das unterprogramm add.. auführen mit den werten ergebnis und zahl bzw den variablen
    
    char zeichen;
            double    zahl;
            bool eingabe=true;
            while(eingabe)
            {
            cin >> zeichen >> zahl;
    
    //ja und zu guter letzt wollte ich hier das man das zeichen und die zahl eingibt, die while schleife soll solang laufen bis eingabe false gesetzt wird
    

    davon passt rein gar nix zusammen...

    welchen teil davon verstehst du denn nicht?
    du musst jz auch gar nicht so tun, als ob du alle 3 bergeifen würdest, sonst würdest du es nicht so chaotisch anstellen ;o)

    bb



  • double add(int);
    add(ergebnis,zahl);
    

    du siehst aber, dass das hier vorn und hinten nicht stimmt?!

    bb



  • double add(double, double);
    add(double ergebnis, double zahl);
    

    ?!



  • #include<iostream>
        using namespace std;
    
        int mul(int, int);
        int divi(int, int);
    	int add(int, int);
    	int sub(int, int);
    	int zahl;
    	int ergebnis=0;
    
        int main()
        {
            cout << "Bitte geben Sie die Rechnung ein:\n";
            char zeichen;
    		bool eingabe=true;
    		while(eingabe)
    		{
    		cin >> zeichen >> zahl;
    		switch(zeichen)
    		{                             
    			case '+': add(ergebnis,zahl); break;       
    			case '-': sub(ergebnis,zahl); break;       
    			case '*': mul(ergebnis,zahl); break;       
    			case '/': divi(ergebnis,zahl); break;
    			case 'e': ergebnis*0; break;
    			case 'q': eingabe=false;
    			default: cout << "unbekanntes Rechenzeichen...\n"; return 0;
    		}
    		cout << "-> " << ergebnis;
    		}
        }
    
        int add(int, int) //Definition einer Funktion
        {
          return zahl + ergebnis;
        }
    
    	int sub(int, int) //Definition einer Funktion
        {
          return ergebnis-zahl;
        }
    
    	int mul(int, int) //Definition einer Funktion
        {
          return zahl * ergebnis;
        }
    
    	int divi(int, int) //Definition einer Funktion
        {
          return ergebnis / zahl;
        }
    

    so das programm startet, erhällt also keine "fehler" mehr zumindest für c++, allerdings macht er nicht das was er soll, wenn ich +5 eingebe, sagt er =0 :S



  • ergebnis = add(ergebnis,zahl);
    
    ...
    
    //Definition der Additions-Funktion
    int add(int x, int y)
    {
       return x + y;
    }
    

    Du mußt schon verstehen (wollen), was die Parameter und Rückgabewerte einer Funktion sind.

    Und entferne die globalen Variablen und packe sie in die main-Funktion:

    int main()
    {
        int zahl;
        int ergebnis=0;
    
        ...
    }
    

    Und mein Tipp mit dem Debugger gilt immer noch -)



  • int add(int, int) //Definition einer Funktion 
        { 
          return zahl + ergebnis; 
        }
    

    was soll add machen?
    richtig, sie(die funktion) soll die beiden parameter, die ihr übergeben wurden, addieren - aber deine addiert einfach 2 globale variablen(die du dazu noch nicht mal brauchst!)

    int add(int lhs, int rhs)
    {
      return lhs + rhs;
    }
    
    int main()
    {
     int a = 23;
     int b = 3;
    
     int x = add(a, b);
    }
    

    so wird eine funktion aufgerufen...

    bb



  • okay die funktionsaufrufer funktionieren nun, vielen dank dafür 🙂
    hab nun versucht eine hochrechnung einzubauen, allerdings bekomme ich folgende fehlermeldung, die ich *tadaa* natürlich nicht versteh:

    Fehler 1 error C2668: 'pow': Mehrdeutiger Aufruf einer überladenen Funktion c:\Users\sezai11\Documents\Visual Studio 2008\Projects\Uni_Prog1\testing\testing.cpp 58

    #include <iostream>
    #include <math.h>
    
    using namespace std;
    
    int plus(int, int);
    int minus(int, int);
    int mal(int, int);
    int durch(int, int);
    int hoch(int, int);
    
    int main()
    {
    	int ergebnis=0;
    	int zahl;
    	bool abfrage=true;
    	char zeichen;
    
    	while(abfrage)
    	{
    		cout << ergebnis;
    		cin >> zeichen;
    		switch(zeichen)
    		{
    		case '+':cin >> zahl;ergebnis=plus(ergebnis, zahl); break;
    		case '-':cin >> zahl;ergebnis=minus(ergebnis, zahl); break;
    		case '*':cin >> zahl;ergebnis=mal(ergebnis, zahl); break;
    		case '/':cin >> zahl;if(zahl!=0){ergebnis=durch(ergebnis, zahl);}else{cout << "nicht durch 0 teilen\n";} break;
    		case '^':cin >> zahl;ergebnis=hoch(ergebnis, zahl); break;
    		case 'c':ergebnis=0; break;
    		case 'e':abfrage=false; break;
    		default:cout << "bitte Rechenzeichen eingeben\n";break;
    		}
    	}
    }
    
    int plus(int lhs, int rhs)
    {
    	return lhs + rhs;
    }
    
    int minus(int lhs, int rhs)
    {
    	return lhs - rhs;
    }
    
    int mal(int lhs, int rhs)
    {
    	return lhs * rhs;
    }
    
    int durch(int lhs, int rhs)
    {
    	return lhs / rhs;
    }
    int hoch(int lhs, int rhs)
    {
    	return pow(lhs,rhs);
    }
    


  • sezai11 schrieb:

    okay die funktionsaufrufer funktionieren nun, vielen dank dafür 🙂

    np - ich hoffe, du hast dir das kapitel in deinem buch noch ma durchgelesen, sonst weist du es das nächste mal wieder nicht!?

    hab nun versucht eine hochrechnung einzubauen, allerdings bekomme ich folgende fehlermeldung, die ich *tadaa* natürlich nicht versteh:

    Fehler 1 error C2668: 'pow': Mehrdeutiger Aufruf einer überladenen Funktion c:\Users\sezai11\Documents\Visual Studio 2008\Projects\Uni_Prog1\testing\testing.cpp 58

    du rufst eine fkt(pow) auf und der compiler weiß nicht, welche version du meinst - es gibt mehrere, die gleich gut(schlecht^^) passen ;o)

    #include <iostream>
    #include <math.h>
    

    der header heißt cmath und nicht math.h

    int plus(int, int);
    int minus(int, int);
    int mal(int, int);
    int durch(int, int);
    int hoch(int, int);
    

    hier ists zwar noch nicht das problem, aber normalerweise solltest du auch in prototypen die parameternamen mitschreiben...

    in C++ deklariert man variablen überigens so lokal wie möglich...
    also steck das int zahl und char zeichen mal in die schleife an den anfang...
    ergebnis würde ich außerhalb lassen, weil man idR erst das ergebnis ausgibt, wenn man fertig ist, aber ist ok^^

    switch(zeichen)
    		{
    		case '+':cin >> zahl;ergebnis=plus(ergebnis, zahl); break;
    		case '-':cin >> zahl;ergebnis=minus(ergebnis, zahl); break;
    		case '*':cin >> zahl;ergebnis=mal(ergebnis, zahl); break;
    		case '/':cin >> zahl;if(zahl!=0){ergebnis=durch(ergebnis, zahl);}else{cout << "nicht durch 0 teilen\n";} break;
    		case '^':cin >> zahl;ergebnis=hoch(ergebnis, zahl); break;
    		case 'c':ergebnis=0; break;
    		case 'e':abfrage=false; break;
    		default:cout << "bitte Rechenzeichen eingeben\n";break;
    		}
    

    rück das doch mal vernünftig ein...

    int plus(int lhs, int rhs)
    {
    	return lhs + rhs;
    }
    

    dir ist klar, dass du die parameter auch anders nennen kannst?
    falls du dich fragst, was das bedeutet:
    lhs = left hand side = linker parameter
    rhs = right ........ = rechter parameter
    (sind imho sehr übliche bezeichner bei solchen fkt)
    die namen machen aber spätestens bei hoch keinen sinn mehr ;o)

    int hoch(int lhs, int rhs)
    {
    	return pow(lhs,rhs);
    }
    

    hier ist das problem: er kennt kein pow, was 2 int`s als parameter möchte, also musst du mind. einmal casten(den rest macht dann der compiler für dich und warnt dich ggf. davor, dass er das tut) oder ne eigene fkt schreiben...
    kannst dich ja mal versuchen!?

    bb



  • ja hab mich nochmal durchgegoogled hab da so 3 sources im netz mit denen ich mich befasse zum lernen. das das ergebnis übrigends am anfang ausgegeben wird war teil der aufgabe, darum stehst vorn 😃 das mit den parameternamen hab ich mir gedacht, aber bin da manchmal bissl denkfaul... 😛

    eine kurze frage was meinst du mit "casten".?
    //edit schon gefunden 😃



  • habs 😃

    int hoch(int lhs, int rhs)
    {
    	return (double) pow((double)lhs,(double)rhs);
    }
    

Anmelden zum Antworten