Habe probleme mit meinem programm



  • hallo

    kann mir bitte einer helfen. Bin noch ein anfänger

    aus langerweile oder anders gesagt um die materie besser zu verstehen habe ich ein programm geschrieben was aber nicht richtig funktioniert.

    Kleine beschreibung.
    Rechnen:
    es sollen 2 Werte eingelesen und mit einanden +, -, *, / werden.
    Die eingabe funktioniert aber die ausgabe ist falsch. Den der compiler gibt zufällige Zahlen aus. D.h von der Funktion Zahleneingabe werden die adressen nicht an die funktion zum ausrechnen übergeben. WARUM?

    Schreiben:
    Es sollen 2 Sätze eingegeben und mit einander verglichen werden.
    Aber es funktioniert nicht ganz so wie ich es will.
    Ich kann nicht den ersten Satz eingeben der wird irgendwie übersprungen es kommt die zweite eingabe.

    #include <iostream.h>
    #include <string.h>
    
    //Eingabe von Zeichen
    void Zeichen (char a[30], char b[30])
        {
        cout << "Dein erster Satz" <<endl;
        cin.getline(a,30);
        cout << "Dein zweiter Satz" <<endl;
        cin.getline(b,30);
        cout << '\n';
        }
    
    //Ermittlung der Zeichen in Zeichen
    void laenge (char a[30], char b[30])
        {
        cout << "Die laenge des ersten Satzes ist   : ";
        cout << strlen(a) <<endl;
        cout << "Die laenge des zweiten Satzes ist  : ";
        cout << strlen(b) <<endl;
    
        }
    //vergleichen von Seingabe
    void vergleich(char a[30], char b[30])
        {
        int rechnen;
        if (strlen(a)== strlen(b))
            {
            cout << "Die laenge ist gleich" <<endl;
            if (strcmp(a,b))
                cout << "aber die Zeichenfolge ist unterschiedlich";
            else
                cout << "und die Zeichen sind auch gelich";
            }
        else if (strlen(a)<strlen(b))
                {
                cout << "Die laenge ist unterschiedlich" <<endl;
                rechnen = strlen(b) - strlen(a);
                cout << "a ist: " << rechnen << " Zeichen kuerzer" <<endl;
                }
             else if (strlen(a)>strlen(b))
                    {
                    cout << "Die laenge ist unterschiedlich" <<endl;
                    rechnen = strlen(a) - strlen(b);
                    cout << "a ist: " << rechnen << "Zeichen laenger" <<endl;
                    }
    
         }
    
    //Eingabe von Zahlen
    void Zahlen (float f, float g)
        {
        cout << "Deine erste Zahl   : ";
        cin >> f;
        cout << "Deine zweite Zahl  : ";
        cin >> g;
        cout << '\n';
        }
    
    float mal(float a, float b)
            {
            return (a*b);
            }
    float durch(float c, float d)
            {
            return (c/d);
            }
    float Plus(float e, float f)
            {
            return (e+f);
            }
    float Minus(float g, float h)
            {
            return (g-h);
            }
    void alles (float r, float t)
          {
          cout << Minus (r, t)<<endl;
          cout << Plus (r, t)<<endl;
          cout << mal(r, t) <<endl;
          cout << durch(r, t);
           }
    
    void main()
    {
    char zeichen, zeichenschreiben;
    char a[30],s[30];
    float f,g;
    
    cout << "1 fuer rechnen" <<endl;
    cout << "2 fuer schreiben" <<endl;
    cout << "deine eingbe ";
    cin >> zeichen;
    cout << '\n';
    switch(zeichen)
       {
       case '1':
            Zahlen(f,g);
            alles(f,g);
            break;
    
       case '2':
            cout << "l laenge der Zeichen ausgeben" <<endl;
            cout << "a alles ausgeben 'laenge und Zeichen'" <<endl;
            cin >> zeichenschreiben;
    
            switch (zeichenschreiben)
                {
                case 'l':
                    Zeichen(a,s);
                    laenge (a,s);
                    break;
                case 'a':
                    Zeichen(a,s);
                    vergleich(a,s);
                    break;
                default:
                    cout << "kenn ich net" <<endl;
                }
       default:
            cout << "kenn ich net" <<endl;
    
        }
    
    char p[50];
    cin.getline(p,50);
    cin.getline(p,50);
    }
    


  • Also ich bin zwar selbst noch ein Anfänger, aber dein Zahlenproblem liegt an deiner Übergabe.

    void Zahlen (float f, float g)
    

    du übergibst call by Value deine noch leeren Variablen an diese Funktion, und da knackts, du liest in der Funktion neue Zahlen ein die aber leider nur die Variablen in der Funktion betreffen die aber die eigentlichen Variablen nicht verändern. Besser wäre hier meiner Meinung nach die Verwendung von Zeigern, sie Zeigen auf den Bereich der Original Variablen die dadurch auch in deiner Funktion verändert werden können.

    void Zahlen (float *pf, float *pg)
    {
        cin>>*pf;
        cin>>*pg;
    };
    .
    .
    Zahlen(&f,&g)
    

    Zum Zeichenproblem.

    in deiner Zeichenfunktion wird die erste Eingabe automatisch geschluckt, ich hab ka warum, ich kann dir nur die etwas unortodoxe Temporärlösung anbieten das

    cin.getline(a,30);
    

    2x hintereinander anzufordern, dann Funktioniert das Programm zumindest.
    Mich interessiert allerdings warum es so ist wie es ist.



  • Raven2 schrieb:

    Also ich bin zwar selbst noch ein Anfänger, aber dein Zahlenproblem liegt an deiner Übergabe.

    void Zahlen (float f, float g)
    

    du übergibst call by Value deine noch leeren Variablen an diese Funktion, und da knackts, du liest in der Funktion neue Zahlen ein die aber leider nur die Variablen in der Funktion betreffen die aber die eigentlichen Variablen nicht verändern. Besser wäre hier meiner Meinung nach die Verwendung von Zeigern, sie Zeigen auf den Bereich der Original Variablen die dadurch auch in deiner Funktion verändert werden können.

    void Zahlen (float *pf, float *pg)
    {
        cin>>*pf;
        cin>>*pg;
    };
    .
    .
    Zahlen(&f,&g)
    

    In C++ kannst du stattdessen auch Referenzparameter verwenden:

    void Zahlen(float&f,float&g)
    {
      cin>>f>>g;
    }
    

    Zum Zeichenproblem.

    in deiner Zeichenfunktion wird die erste Eingabe automatisch geschluckt, ich hab ka warum

    Aber ich: getline() liest die Eingabe bis zum nächsten Zeilenwechsel. Aber da nach der Eingabe von 'zeichenschreiben' noch ein Enter im Tastaturpuffer zurückgeblieben ist, wird als nächstes der leere String eingelesen. Die korrekte Lösung für das Problem heißt ignore() (aber ein Dummy-getline() hat die selbe Wirkung).



  • danke für die Hilfe

    es hat für RECHNEN geklapt.

    danke danke danke.

    aber für das SCHREIBEN habe ich nicht hinbekommen.
    brauche mehr input.



  • Nochmal langsam: Die Eingaben schließt du jeweils mit einem ENTER (=\n) ab. op>> lässt eventuelle Whitespaces (inklusive dem ENTER) im Eingabepuffer stehen, getline() holt alle Zeichen bis zum nächsten ENTER aus dem Eingabepuffer. Wenn du das zusammenfügst, kommst du auf das Kernproblem: Das erste getline() in der Zeichen()-Funktion erhält die Restzeile, die nach dem cin>>zeichenschreiben; aus dem Hauptprogramm übriggeblieben ist. Die Lösung ist:

    void Zeichen(char a[30],char b[30])
    {
      cin.ignore();
      //der Rest wie gehabt
    }
    

    PS: Übrigens solltest du anstelle der char-Arrays lieber std::string's verwenden. Die sind sicherer und einfacher zu handhaben.
    (und auch wenn es so aussieht - niemand überprüft, ob der Funktion wirklich ein 30-Zeichen-Array übergeben wird)



  • @ CStoll

    ich danke dir, es geht

    mann bin ich froh.


Anmelden zum Antworten