Hilfe bei Rechner (C++) x.x [Funktionen]



  • Nunja die cpp lässt sich ned complimieren x.x

    Ich erkläre mal :

    Das Programm soll "!immer!" in den Funktionen das Ergebnis ausgeben x.x

    Leider funktioniert das "a" bei den "scanf" Befehl nicht da es als undeklariert ausgegeben wird x.x

    Und zwar das in ZEILE 33 das ",&a); !

    Wenn man die Zahlen eingibt sollen sie durch die funktion das Ergebnis ausgegeben werden x.x



  • Kann mir mal einer erklären, was zum Teufel "x.x" heißen soll?! Ist das ein neues Satzendezeichen? 😃

    Btw, wenn keine Variable a existiert, kannst du nunmal keine Variable a mit einem Wert füllen!



  • das x.x heißt bei mir verzeifelt

    und dann muss doch was falsch sein wenn cih den wert a nich füllen kann !

    Kann mir vllt wer meinen Code editieren ?


  • Administrator

    @_matze,
    Tz, Banause, kennst nicht mal dieses Smiley. Das sind durchgekreuzte Augen. Verzweifelt, tot, ohnmächtig oder ähnliches 🙂

    DarkDagon schrieb:

    und dann muss doch was falsch sein wenn cih den wert a nich füllen kann !

    Es existiert gar keine Variable a in diesem Scope. Du hast nirgends eine Variable a deklariert, welche benutzt werden könnte.
    Ich glaube du solltest nochmals die Grundlagen durcharbeiten, welche dir der Lehrer sicher irgendwo gegeben hat.

    Grüssli



  • Dravere schrieb:

    @_matze,
    Tz, Banause, kennst nicht mal dieses Smiley.

    Nee, kenn ich nicht. Muss ich mich jetzt schämen? 😉



  • Könnt iht mit mir ned einfach den Fehler sagen x.x ?

    Und Rechnungen wie Formeln haben wir nicht gemacht mit Funktionen .

    P.S : Vllt ne Seite worauf ich dann auf den Fehler komme oder so bitttttteeee

    P.S.S : Vielen DANK auch allen und besonders (helferlein).



  • Normalerweise verlagert man das berechnen in die entsprechenden funktionen.
    das ausgeben kommt aber grade _nicht_ in die funktion. diese ist _nur_ für
    das berechnen zuständig. natürlich kennt er nicht die variablen die du in der
    funktion deklarierst, dafür brauchst du temporäre variablen als zwischenspeicher.
    die variable "ergebnis" brauchst du nicht

    ich geb dir mal ein beispiel an der "addi" funktion:

    else if(auswahl == 2)
    {
        float zahl1, zahl2;
        printf("\n\n\t                   Sie haben Addieren gew\x84hlt !                       ");
        printf("\n\n\n\t\t1.Zahl eingeben : ");
        scanf("%d",&zahl1);
        printf("\n\n\t\t2.Zahl eingeben : ");
        scanf("%d",&zahl2);
        printf("Das Ergebnis ist : &d", addi(zahl1, zahl2)); // keine addresse verwenden! (&)
        addi();
    }
    float addi(float a, float b)
    {
         return a + b;
    }
    

    gewöhn dir bitte das x.x in jedem post ab. einmal ist ok aber andauernt? 😉

    und in C++ nutzt man std::cin und std::cout!



  • Wie du eine Variable deklarierst, siehst du bitte selber irgendwo nach. Soviel Eigeninitiative kann man verlangen. Ansonsten...

    ...musst du nicht für jede Auswahl des Nutzers eigene Variablen erschaffen (a,b,c,d,e,f...). Du kannst ruhig 2 Variablen für alle Operationen nehmen und dio quasi recyclen.

    Außerdem solltest du wohl die Berechnung besser in deine Funktionen packen. Die geben dann das Ergebnis zurück. Und das gibst du dann an zentraler Stelle aus. Was du machst (Berechnung in den if-Anweisungen und nur Ergebnisausgabe in den Funktionen) ist recht unsinnig.

    EDIT: helferlein, den zweiten addi-Aufruf sparen wir uns aber, oder? 😉
    EDIT2: Und die printf-Ausgabe könnte man ja aus den if-Anweisungen rausziehen und einmal unten drunter packen.


  • Administrator

    _matze schrieb:

    Nee, kenn ich nicht. Muss ich mich jetzt schämen? 😉

    JA! :p 🤡

    @DarkDagon,
    Das Problem ist, dies sind ABSOLUTE GRUNDLAGEN. Wenn man dir diesen Code korrigiert, dann muss man befürchten, dass du einfach nur Copy&Paste durchführst. Dies sind so grundlegende und einfache Probleme, wer diese nicht verstanden hat, sollte gleich wieder zurück zum Anfang gehen. Etwas anderes kann man da fast nicht empfehlen. Zumindest ist das meine Meinung.

    Grüssli



  • Irgendwie hab ichs dennoch ned geschafft x.x

    else if(auswahl == 2)
    {
        float zahl1, zahl2;
        printf("\n\n\t                   Sie haben Addieren gew\x84hlt !                       ");
        printf("\n\n\n\t\t1.Zahl eingeben : ");
        scanf("%d",&zahl1);
        printf("\n\n\t\t2.Zahl eingeben : ");
        scanf("%d",&zahl2);
        printf("Das Ergebnis ist : &d", addi(zahl1, zahl2)); // keine addresse verwenden! (&)
        addi();
    }
    float addi(float a, float b)
    {
         return a + b;
    }
    

    Hab das probiert auch in ner anderen Form aber es klappt ned x.x



  • DarkDagon schrieb:

    Irgendwie hab ichs dennoch ned geschafft x.x

    Was genau soll das heißen? x.x

    Eine etwas detailliertere Fehlerbeschreibung wäre wirklich hilfreich, wie du dir sicher denken kannst. x.x

    Also, was genau klappt nicht? Gibt's eine Fehlermeldung? Ein Fehlverhalten? Wenn ja, wie sieht das aus? x.x

    x.x 😃



  • Also habs mal so geschafft das das Programm sich complimiert .

    Das Problem was ich jetzt habe überall kommt 0 !!! heraus .

    #include <math.h>
    #include <cstdlib>
    #include <iostream>
    
    using namespace std;
    
    char auswahl;
    float ergebnis;
    void wurz(float a);
    void addi(float b,float c);
    void divi(float d,float e);
    void subt(float f,float g);
    void mult(float h,float i);
    
    int main(int argc, char *argv[])
    {
         printf("*------------------------------------------------------------------------------*\n\n"); 
         printf("                               *Taschenrechner*                                 \n\n");
         printf("\t(1) Wurzel\n\n");
         printf("\t(2) Addieren\n\n");
         printf("\t(3) Dividieren\n\n");
         printf("\t(4) Subtrahieren\n\n");
         printf("\t(5) Multiplizieren\n");
         printf("\n\n*------------------------------------------------------------------------------*");
         printf("\n\n\t        Geben sie eine Zahl zum jeweiligen Operator ein !                     ");
         printf("\n\n\t -> ");
         scanf("%d",&auswahl);
         printf("\n\n*------------------------------------------------------------------------------*");
         if(auswahl == 1)
         {
              float a;
              printf("\n\n\t                   Sie haben Wurzel gew\x84hlt !                        ");
              printf("\n\n\n\t\tZahl eingeben : ");
              scanf("%d",&a);
              printf("\n\n\t\tDas Ergebnis ist : %d",a,ergebnis);
              wurz(a);
              printf("\n\n\n");
         }
         else if(auswahl == 2)
         {
              float b,c;
              printf("\n\n\t                   Sie haben Addieren gew\x84hlt !                       ");
              printf("\n\n\n\t\t1.Zahl eingeben : ");
              scanf("%d",&b);
              printf("\n\n\t\t2.Zahl eingeben : ");
              scanf("%d",&c);
              printf("\n\n\t\tDas Ergebnis ist : %d",b,c,ergebnis);
              addi(b,c);
              printf("\n\n\n");
         }
         else if(auswahl == 3)
         {
              float d,e;
              printf("\n\n\t                 Sie haben Dividieren gew\x84hlt !                       ");
              printf("\n\n\n\t\t1.Zahl eingeben : ");
              scanf("%d",&d);
              printf("\n\n\t\t2.Zahl eingeben : ");
              scanf("%d",&e);
              printf("\n\n\t\tDas Ergebnis ist : %d",d,e,ergebnis);
              divi(d,e);
              printf("\n\n\n");
         }
         else if(auswahl == 4)
         {
              float f,g;
              printf("\n\n\t                Sie haben Subtrahieren gew\x84hlt !                      ");
              printf("\n\n\n\t\t1.Zahl eingeben : ");
              scanf("%d",&f);
              printf("\n\n\t\t2.Zahl eingeben : ");
              scanf("%d",&g);
              printf("\n\n\t\tDas Ergebnis ist : %d",f,g,ergebnis);
              subt(f,g);
              printf("\n\n\n");
         }
         else if(auswahl == 5)
         {
              float h,i;
              printf("\n\n\t               Sie haben Multiplizieren gew\x84hlt !                     ");
              printf("\n\n\n\t\t1.Zahl eingeben : ");
              scanf("%d",&h);
              printf("\n\n\t\t2.Zahl eingeben : ");
              scanf("%d",&i);
              printf("\n\n\t\tDas Ergebnis ist : %d",h,i,ergebnis);
              mult(h,i);
              printf("\n\n\n"); 
         }
         system("PAUSE");
         return EXIT_SUCCESS;
    }
    
    void wurz(float a)
    {
         ergebnis = sqrt(a);
    }
    
    void addi(float b,float c)
    {
         ergebnis = b + c;
    }
    
    void divi(float d,float e)
    {
         ergebnis = d / e;
    }
    
    void subt(float f,float g)
    {
         ergebnis = f - g;
    }
    
    void mult(float h,float i)
    {
         ergebnis = h * i;
    }
    

    Wo ist da das Problem 😣



  • Das Problem ist, dass du keine Ahnung hast, was du da eigentlich machst, sorry... 🙂

    Du gibst ergebnis aus, bevor du überhaupt einen Wert zugewiesen hast. Und im Anschluss führst du dann die jeweilige Funktion aus, die ergebnis einen Wert zuweist.

    1. Warum orientierst du dich nicht an dem Beispiel, dass du bekommen hast? Da wurden die Funktionen direkt in die printf-Anweisungen gepackt. Das macht Sinn! So wäre übrigens die Variable ergebnis komplett überflüssig.

    2. Kannst du gerne auch über eine Variable ergebnis gehen. Dann weise ihr aber vor der Ausgabe den Ergebniswert zu. Und das am besten nicht über eine Globale, wie du es im Moment machst, sondern über den Rückgabewert der jeweiligen Funktion und eine lokale Variable ergebnis (in main deklarieren).



  • Ich probier ganze Zeit schon rum und ich versteh das mit den Funktionen ned so gut x.x

    Gibts ne Hilfe Seite oder so weil das Beispiel naja 😣

    P.S : Benütze Blood. Dev C++



  • #include <cmath>		// wenn dann schon C++ Header
    #include <conio.h>		// _getch() - nur fuer Windows
    #include <iostream> 
    
    using namespace std;  
    
    // Funktionen deklarieren
    float wurz(float);
    float addi(float, float);
    float divi(float, float);
    float subt(float, float);
    float mult(float, float);
    
    // Die C-I/O-Anweisungen habe ich durch die C++-Version ersetzt
    
    int main(int argc, char *argv[]) 
    { 
    	 char auswahl;
    	 float zahl1, zahl2;
    	 do
    	 {
    		 cout << "*------------------------------------------------------------------------------*\n\n"; 
    		 cout << "                               *Taschenrechner*                                 \n\n"; 
    		 cout << "\t(1) Wurzel\n\n"; 
    		 cout << "\t(2) Addieren\n\n"; 
    		 cout << "\t(3) Dividieren\n\n"; 
    		 cout << "\t(4) Subtrahieren\n\n"; 
    		 cout << "\t(5) Multiplizieren\n"; 
    		 cout << "\t(6) Beenden\n";
    		 cout << "\n\n*------------------------------------------------------------------------------*"; 
    		 cout << "\n\n\t        Geben sie eine Zahl zum jeweiligen Operator ein !                     "; 
    		 cout << "\n\n\t -> "; 
    		 cin >> auswahl;
    
    		 cout << "\n\n*------------------------------------------------------------------------------*"; 
    
     		 if (auswahl < '1' || auswahl > '6') {	// wenn eine nichtexistierender Menuepunkt eingegeben wurde...
    			 cout << "Falsche Eingabe!" << endl;
    		 }
    		 else if(auswahl == '1') 
    		 { 
    			  cout << "\n\n\t                   Sie haben Wurzel gew\x84hlt !                        "; 
    			  cout << "\n\n\n\t\tZahl eingeben : "; 
    			  cin >> zahl1;
    			  cout << "\n\n\t\tDas Ergebnis ist : " << wurz(zahl1); 
    			  cout << "\n\n\n"; 
    		 } 
    		 else if(auswahl == '2') 
    		 {  
    			  cout << "\n\n\t                   Sie haben Addieren gew\x84hlt !                       "; 
    			  cout << "\n\n\n\t\t1.Zahl eingeben : "; 
    			  cin >> zahl1;
    			  cout << "\n\n\t\t2.Zahl eingeben : "; 
    			  cin >> zahl2; 
    			  cout << "\n\n\t\tDas Ergebnis ist : " << addi(zahl1, zahl2);
    			  cout << "\n\n\n"; 
    		 } 
    		 else if(auswahl == '3') 
    		 { 
    			  cout << "\n\n\t                 Sie haben Dividieren gew\x84hlt !                       "; 
    			  cout << "\n\n\n\t\t1.Zahl eingeben : "; 
    			  cin >> zahl1;
    			  cout << "\n\n\t\t2.Zahl eingeben : "; 
    			  cin >> zahl2;
    			  cout << "\n\n\t\tDas Ergebnis ist : " << divi(zahl1, zahl2);
    			  cout << "\n\n\n"; 
    		 } 
    		 else if(auswahl == '4') 
    		 { 
    			  cout << "\n\n\t                Sie haben Subtrahieren gew\x84hlt !                      "; 
    			  cout << "\n\n\n\t\t1.Zahl eingeben : "; 
    			  cin >> zahl1;
    			  cout << "\n\n\t\t2.Zahl eingeben : "; 
    			  cin >> zahl2;
    			  cout << "\n\n\t\tDas Ergebnis ist : " << subt(zahl1, zahl2);
    			  cout << "\n\n\n"; 
    		 } 
    		 else if(auswahl == '5') 
    		 { 
    			  cout << "\n\n\t               Sie haben Multiplizieren gew\x84hlt !                     "; 
    			  cout << "\n\n\n\t\t1.Zahl eingeben : "; 
    			  cin >> zahl1;
    			  cout << "\n\n\t\t2.Zahl eingeben : "; 
    			  cin >> zahl2;
    			  cout << "\n\n\t\tDas Ergebnis ist : " << mult(zahl1, zahl2); 
    			  cout << "\n\n\n"; 
    		 } 
    		 cout << "Bitte eine beliebige Taste druecken ...";
    		 _getch();		// schnellere Alternative zu system("pause")
    	 } while (auswahl != '6');
         return 0;
    } 
    
    float wurz(float a) 
    { 
         return sqrt(a); 
    } 
    
    float addi(float b,float c) 
    { 
         return b + c; 
    } 
    
    float divi(float d,float e) 
    { 
         return d / e; 
    } 
    
    float subt(float f,float g) 
    { 
         return f - g; 
    } 
    
    float mult(float h,float i) 
    { 
         return h * i; 
    }
    

    Gruss
    Cartman



  • DarkDagon schrieb:

    Ich probier ganze Zeit schon rum und ich versteh das mit den Funktionen ned so gut x.x

    Gibts ne Hilfe Seite oder so weil das Beispiel naja 😣

    P.S : Benütze Blood. Dev C++

    Ähm, du kriegst hier doch eine Menge Hilfe! Was nur keiner machen will ist, dir deine Ausgabe komplett vorzukauen. Dafür musst du Verständnis haben. Hier sind ständig Leute, die ihre Hausaufgaben posten und eine Komplettlösung verlangen. Das hilft dir langfristig nicht.

    Und zum Beispiel: Das Beispiel ist eigentlich sehr gut und alles, was du brauchst (bis auf den letzten addi-Aufruf, der ist überflüssig, und bei printf muss "%d" stehen, nicht "&d"!). Übernimm den Code mal genauso, wie er da steht (denn das hast du nicht getan, du hast den Code dann noch abgeändert und ihn funktionsuntüchtig gemacht) und ändere die 2 Dinge, die ich gerade angemerkt habe. Dann sollte deine Addition schon mal reibungslos funktionieren. Bist du erstmal soweit, übernimmst du dieses Prinzip für alle anderen Operationen. Da brauchst du ja nur Details zu ändern.



  • Ich weiß das ich von auch ne Menge Hilfe bekomme

    Und ich kann ma vorstellen das die meisten Hüs posten und das auch nerven oder ziemlich sauer macht x.x

    Aber vielen dank das ihr auch dennoch die Zeit nehmt und sry

    Das Blöde ist ich mache genrell nie was mit cout weil wir das ned gelernt haben ich weiß ned für was das steht genauso wie cin



  • Eric Cartman schrieb:

    // Die C-I/O-Anweisungen habe ich durch die C++-Version ersetzt

    Hm, weiß nicht ob das so gut war. Jetzt wird er gar nix mehr verstehen. Na ja, außerdem wird er den Code jetzt sowieso einfach übernehmen und nicht mehr drüber nachdenken. In meinen Augen war die ganze Mühe, ihm die Funktionalität näher zu bringen, jetzt umsonst. Mir soll's egal sein, ich schau mir noch 'ne Folge Family Guy an und geh dann schlafen... 🙄

    P.S.: Dann hättest du direkt ne switch-Anweisung machen können. Und über using namespace std lässt sich auch streiten...



  • DarkDagon schrieb:

    Das Blöde ist ich mache genrell nie was mit cout weil wir das ned gelernt haben ich weiß ned für was das steht genauso wie cin

    Ganz kurz: cout ist für die Ausgabe, cin für die Eingabe. Meine Empfehlung: bring lieber deinen bestehenden Code in Ordnung, das sollte mir den Tipps hier locker zu schaffen sein. Und dann verstehst du auch, was du vermutlich morgen deinem Lehrer zeigst.

    Guta Nacht! 🙂



  • _matze schrieb:

    Eric Cartman schrieb:

    // Die C-I/O-Anweisungen habe ich durch die C++-Version ersetzt

    Hm, weiß nicht ob das so gut war. Jetzt wird er gar nix mehr verstehen. Na ja, außerdem wird er den Code jetzt sowieso einfach übernehmen und nicht mehr drüber nachdenken. In meinen Augen war die ganze Mühe, ihm die Funktionalität näher zu bringen, jetzt umsonst. Mir soll's egal sein, ich schau mir noch 'ne Folge Family Guy an und geh dann schlafen... 🙄

    P.S.: Dann hättest du direkt ne switch-Anweisung machen können. Und über using namespace std lässt sich auch streiten...

    Hm, ja - haette ich mir sparen koennen. Was bringt ihm Code, den er nicht versteht...

    Sorry...

    Gruss
    Cartman


Anmelden zum Antworten