Unterprogramme - Rechner



  • 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);
    }
    


  • Gut! 👍

    Ich würde allerdings statt

    (double)lhs
    
    static_cast<double>(lhs)
    

    schreiben. Ist "moderner" und dank Klammern besser zu überblicken, was gecastet wird...



  • Mr X schrieb:

    Gut! 👍

    Ich würde allerdings statt

    (double)lhs
    
    static_cast<double>(lhs)
    

    schreiben. Ist "moderner" und dank Klammern besser zu überblicken, was gecastet wird...

    Oder

    double(lhs)
    

    Ist "auch moderner" und dank der Klammern und wenig Drumherumfug auch noch besser zu überblicken, was gecastet wird...



  • sezai11 schrieb:

    habs 😃

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

    ja - klar fangt wieder an, zu erzählen, wie er casten soll, bevor ihr den code anguckt...
    ein cast ist komplett dumm, einer ist nicht notwendig und der andere ist zumindest fragwürdig 😉
    wieso willst du das ergebnis von pow noch nach double casten? (was es ohnehin schon ist, obwohl du nen int zurückgibst)
    wieso reicht nicht auch float sondern muss es double sein?
    die richtige pow überladung wäre float pow(float, int) ;P

    ich bevorzuge auch den ctor-cast, also:

    int hoch(int basis, int exponent)
    {
      float r = pow(float(basis), exponent);
      return int(r);
    }
    

    das kann man natürlich auch in eine zeile schreiben, aber das sind mir persönlich zu viele klammern^^

    ich wäre noch immer dafür, die fkt selbst zu schreiben - wieso sollte man sich die beiden casts und deren nachteile einhandeln, wenn es auch ohne geht? Oo
    schneller wird es so auch nicht unbedingt sein...

    bb


  • Mod

    Vor allem wird int(r) des öfteren mal nicht das liefern was man erwartet, weil konsequent abgerundet wird. Wenn man Integerpotenzen haben will, ist es doch leicht die eben selbst zu programmieren.


Anmelden zum Antworten