Hilfe bei einer Funktion



  • Funktioniert immer noch nicht. Wäre über weitere Hilfe dankbar



  • anscheinend weiß keiner eine Lösung für mein Problem. Ich selbst finde keins.
    Falls doch noch einer was weiß dann schreib BITTE



  • Problem mit der Eingabe ist beseitigt. Funktioniert aber immer noch nicht
    schaut euch ihn bitte mal an und sagt mir was falsch daran is. Laut BorlandBuilder ist irgendwo einfehler in den If schleifen die geht nicht ins erste else rein

    //subtraktion
    
     void sub(void)
     {
      int z1;
      int z2;
      int summe;
      int uebertrag=0;
      int i=strlen(zeichen[1]);
    
    if(zeichen[1][0]=='-')
    {
    add();
    }
    
    else
    {
     if(zeichen[0]>=zeichen[1])
       {
         for (i-=1;i>=0;i--)
          {
    
                 z1=zeichen[0][i]-'0';
                 z2=zeichen[1][i]-'0';
    
                 summe=z1-z2+uebertrag;
    
                 uebertrag=summe/10;
                 ergebnis[i]=summe%10+'0';
    
          }
                   cout << ergebnis;
       }
    
     else
       {
         for (i-=1;i>=0;i--)
          {
    
                 z1=zeichen[0][i]-'0';
                 z2=zeichen[1][i]-'0';
    
                 summe=z2-z1+uebertrag;
    
                 uebertrag=summe/10;
                 ergebnis[i]=summe%10+'0';
    
          }
              cout << "-" << ergebnis;
        }
      }
      getchar();
     }
    


  • Da du uns nicht mehr info geben willst werde ich mal etwas raten.

    void sub(void)
     {
      int z1;
      int z2;
      int summe;
      int uebertrag=0;
      int i=strlen(zeichen[1]); // aha zeichen ist also ein array von strings
      if(zeichen[1][0]=='-') {  
        add();                  // aha ein Vorzeichen
      }
      else {                    // wirklich subtrahieren
       if(zeichen[0]>=zeichen[1])  { // da stimmt was nicht
                                     // zeichen[0] und zeichen[1] sind ja strings 
                                     // kann mann die so einfach auf >= abfragen ?
                                     // eher nicht.
                                     // vielleicht sind's aber doch std::string und das strlen() oben war falsch ?
         for (i-=1;i>=0;i--) {
    
                 z1=zeichen[0][i]-'0'; // aha aus char mach int
                 z2=zeichen[1][i]-'0';
    
                 summe=z1-z2+uebertrag;
    
                 uebertrag=summe/10;
                 ergebnis[i]=summe%10+'0'; // jetzt verstehe ich da werden 
                                           // strings subtrahiert
                                           // ich geb auf das hätte er auch gleich sagen können
                                           // der fehler liegt wahrscheinlich  sowieso am stringvergleich
        .....
     }
    


  • Ihr müsst mir nur sagen was ich machen soll. Da ja keiner geantwortet hab wusste ich nicht was ich noch machen soll.

    //subtraktion
    
     void sub(void)
     {
      int z1;                                       //int aller benötigten Sachen
      int z2;
      int summe;
      int uebertrag=0;
      int i=strlen(zeichen[1]);
    
    if(zeichen[1][0]=='-')                       //schaut ob im zweiten Array Zeichen ein Minus ist
    {
    add();                                       //wenn ja benutze die Additionsfunktion
    }
    
    else                                        //falls nicht
    {
     if(zeichen[0]>=zeichen[1])                 //sollte die 1te Zahl größer sein als die 2te
       {
         for (i-=1;i>=0;i--)
          {
    
                 z1=zeichen[0][i]-'0';          //dient zur berechnung ist eine  
                                                // additionsfunk die Funktioniert
                 z2=zeichen[1][i]-'0';          //nur umgeschrieben laut tipp eines
                                                //ehemaltigen TAI´ler
                 summe=z1-z2+uebertrag;       //dann Zahl1-Zahl2 in SUmme speichern
    
                 uebertrag=summe/10;
                 ergebnis[i]=summe%10+'0';
    
          }
                   cout << ergebnis;         //ergebnis
       }
    
     else                                    //wenn2te größer 1st
       {                                     //das funktioniert
         for (i-=1;i>=0;i--)
          {
    
                 z1=zeichen[0][i]-'0';       //Hier das gleiche wie oben
                 z2=zeichen[1][i]-'0';
    
                 summe=z2-z1+uebertrag;      //Zahl2-Zahle1
    
                 uebertrag=summe/10;
                 ergebnis[i]=summe%10+'0';
    
          }
              cout << "-" << ergebnis;        //ergebnis mit Minus davor
        }
      }
      getchar();
     }
    

    Für mehr Info´s einfach fragen. auf wunsch kann ich euch auch den ganzen code schicken



  • der ganze code wär cool :xmas1:



  • //---------------------------------------------------------------------------
    
    #include <iostream.h>
    #include <conio.h>
     char zeichen[2][21];
     char ergebnis[100];
     void auswahl(void);
     void eingabe(void);
     void add(void);
     void sub(void);
     void mult(void);
     void div(void);
     void ausgabe(void);
    int main()
    {
            auswahl();
    
            return 0;
    }
    
    //FUNKTIONEN
    
    //Auswahl
    void auswahl(void)
    {
    int i;
    cout << "1.Addition\n\n2.Subtraktion\n\n3.Multiplikation\n\n4.Division";
    cin >>i;
    switch (i)
    {
    case 1 : eingabe();
             add();
             break;
    case 2 : eingabe();
             sub();
             break;
    case 3 : eingabe();
             mult();
             break;
    case 4 : eingabe();
             div();
             break;
    default:cout << "unknown command" ;
    }
    }
    
    //Eingabe
    void eingabe (void)
    {
         cout<< "zahl1: ";
         gets(zeichen[0]);
         cout << "\nzahl2: ";
         gets(zeichen[1]);
    
         return;
    }
    
    //addition
    
     void add(void)                               //additionsfunkton
     {
      int z1;
      int z2;
      int summe;
      int uebertrag=0;
      int p=strlen(zeichen[0]);
      int q=strlen(zeichen[1]);
      p--;
      q--;
        for (int i=19;i>=0;i--)
        {
               if (p>=0)
               {
                  z1=zeichen[0][p]-'0';
               }
               else
               {
                   z1=0;
               }
               if (q>=0)
               {
                   z2=zeichen[1][q]-'0';
               }
               else
               {
                  z2=0;
               }
    
               summe=z1+z2+uebertrag;
    
               uebertrag=summe/10;
               ergebnis[i]=summe%10+'0';
               p--;
               q--;
        }
    
                 cout << ergebnis;
    
      getchar();
     }
    
     //subtraktion
    
     void sub(void)
     {
      int z1;                                       //int aller benötigten Sachen
      int z2;
      int summe;
      int uebertrag=0;
      int i=strlen(zeichen[1]);
    
    if(zeichen[1][0]=='-')                       //schaut ob im zweiten Array Zeichen ein Minus ist
    {
    add();                                       //wenn ja benutze die Additionsfunktion
    }
    
    else                                        //falls nicht
    {
     if(zeichen[0]>=zeichen[1])                 //sollte die 1te Zahl größer sein als die 2te
       {
         for (i-=1;i>=0;i--)
          {
    
                 z1=zeichen[0][i]-'0';          //dient zur berechnung ist eine additionsfunk
                 z2=zeichen[1][i]-'0';          //nur umgeschrieben
    
                 summe=z1-z2+uebertrag;       //dann Zahl1-Zahl2 in SUmme speichern
    
                 uebertrag=summe/10;
                 ergebnis[i]=summe%10+'0';
    
          }
                   cout << ergebnis;         //ergebnis
       }
    
     else                                    //wenn2te größer 1st
       {                                     //das funktioniert
         for (i-=1;i>=0;i--)
          {
    
                 z1=zeichen[0][i]-'0';       //Hier das gleiche wie oben
                 z2=zeichen[1][i]-'0';
    
                 summe=z2-z1+uebertrag;      //Zahl2-Zahle1
    
                 uebertrag=summe/10;
                 ergebnis[i]=summe%10+'0';
    
          }
              cout << "-" << ergebnis;        //ergebnis mit Minus davor
        }
      }
      getchar();
     }
    
     void mult(void)
     {
      eingabe();
    
     }
    
     void div(void)
     {
      eingabe();
    
     }
    
     void ausgabe (void)
     {
    
     }
    


  • Ok jetzt ist es klar. zeichen sind char **.
    es muss heissen

    if( strcmp(zeichen[0],zeichen[1])>= 1 ){ //sollte die 1te Zahl größer sein als die 2te
                                              // funktioniert wahrscheinlich nur wenn die strings gleich lang sind
    

    Kurt



  • gute danke funktioniert. Etz weis ich nur net wie ich des anstellen soll das man verschieden lange zahlen subrahieren kann. Hat da jemand eine Idee und kann mir da weng helfen?

    //##############################################################
     //##                Subtraktionsfunktion                      ##
     //##############################################################
    
     void sub(void)
     {
      int z1;                                     //int aller benötigten Sachen
      int z2;
      int summe;
      int uebertrag=0;
      int i=strlen(zeichen[1]);
    
    if(zeichen[1][0]=='-')                       //schaut ob im zweiten Array Zeichen ein Minus ist
    {
     add();                                      //wenn ja benutze die Additionsfunktion
    }
    
    else                                        //falls nicht
     {
     if(strcmp(zeichen[0],zeichen[1])>=1)       //sollte die 1te Zahl größer sein als die 2te
       {
         for (i-=1;i>=0;i--)
          {
    
                 z1=zeichen[0][i]-'0';          //dient zur berechnung ist eine additionsfunk
                 z2=zeichen[1][i]-'0';         //wandelt char in int variablen um
    
                 summe=z1-z2+uebertrag;        //dann Zahl1-Zahl2 in SUmme speichern
    
                 uebertrag=summe/10;
                 ergebnis[i]=summe%10+'0';
    
          }
                   cout <<"\n\nIhr Ergebnis lautet: " << ergebnis;           //ergebnis
       }
    
     else                                    //wenn2te größer 1st
       {                                     //das funktioniert
         for (i-=1;i>=0;i--)
          {
    
                 z1=zeichen[0][i]-'0';       //Hier das gleiche wie oben
                 z2=zeichen[1][i]-'0';
    
                 summe=z2-z1+uebertrag;      //Zahl2-Zahl1
    
                 uebertrag=summe/10;
                 ergebnis[i]=summe%10+'0';
    
          }
              cout <<"\n\nIhr Ergebnis lautet: " << "-" << ergebnis;        //ergebnis mit Minus davor
        }
     }
     getchar();
    }
    


  • Du kannst die zu kurzen Zahlen vor der Rechnung ans Ende des Arrays schieben und vorne mit Nullen auffüllen - danach ist wieder die feste-Länge-Version anwendbar.

    (übrigens wäre es eine gute Idee, vor dem Aufruf der add()-Funktion das Minus wegzustreichen)



  • und wie mach ich des?

    Du kannst die zu kurzen Zahlen vor der Rechnung ans Ende des Arrays schieben und vorne mit Nullen auffüllen - danach ist wieder die feste-Länge-Version anwendbar

    des mit den Minus des woll ma machen. schauen aber erstmal das wir das programm zum laufen bringen. Haben bei der additions funktion auch noch die 0´ln vorm ergebnis



  • int l=strlen(zahlen[0]);        //Länge bestimmt
    memmove(zahlen[0]+20-l,zahlen[0],l); //Verschieben
    memset(zahlen[0],'0',20-l);          //Auffüllen
    

    (Ob die Indizes alle korrekt sind, kann ich nicht garantieren)



  • memmove(zeichen[0]+20-l,zeichen[0],l); //Verschieben
      memset(zeichen[0],'0',20-l);          //Auffüllen
    

    die memmove und memset befehle hatten wir noch nicht daher verstehe ich nicht ganz wo ich die reinsetzen soll.(habe aus deinen zahlen mal zeichen gemacht weil so unsere arrays heißen

    erklärung wäre evtl hilfreich damit ich versteh wo ich das reinsetzen soll iin meine sub funktion



  • Ich würde das dort machen wo zeichen[0] und zeichen[1] ihre werte erhalten.



  • also bei der eingabe funkt des schaut etza so aus

    void eingabe (void)
    {
         cout<< "\nGeben Sie bitte Ihre erste Zahl ein: ";
         gets(zeichen[0]);
         cout << "\nGeben Sie bitte Ihre zweite Zahl ein: ";
         gets(zeichen[1]);
    int l=strlen(zeichen[0]);                //Länge bestimmt
    int k=strlen(zeichen[1]);
    memmove(zeichen[0]+20-l,zeichen[0],l);   //Verschieben
    memset(zeichen[0],'0',20-l);             //Auffüllen
    memmove(zeichen[1]+20-l,zeichen[0],l);   //Verschieben
    memset(zeichen[1],'0',20-l);             //Auffüllen
    

    muss ich ja mit beiden machen da ja auch evtl mal die zweite größer sein kann. aba das funktioniert nich so richtig.
    hier mal komplet

    //---------------------------------------------------------------------------
    
    #include <iostream.h>
    #include <conio.h>
    #include <string.h>
    #include <mem.h>
     int x;
     char zeichen[2][21];
     char ergebnis[100];
     void auswahl(void);
     void eingabe(void);
     void add(void);
     void sub(void);
     void mult(void);
     void div(void);
     void kopf(void);
    
    int main()
    {
    
    for(x=0;x==0;)
    {
            clrscr();
            kopf();
            auswahl();
    }
    
            return 0;
    }
    
    //FUNKTIONEN
    
    //Auswahl
    void auswahl(void)
    {
    int i;
    cout << "\n\n1.Addition\n\n2.Subtraktion\n\n3.Multiplikation\n\n4.Division\n\n5.Ausgang";
    cout << endl <<endl <<"Bitte waehlen Sie die gewuenschte Rechenoperation aus: ";
    cin >>i;
    switch (i)
    {
    case 1 :clrscr();
            kopf();
            cout << "\n\tSie haben sich fuer die Addition entschieden\n\n";
            eingabe();
            add();
            break;
    case 2 :clrscr();
            kopf();
            cout << "\n\tSie haben sich fuer die Subtraktion entschieden\n\n";
            eingabe();
            sub();
            break;
    case 3 :clrscr();
            kopf();
            cout << "\n\tSie haben sich fuer die Multiplikation entschieden\n\n";
            eingabe();
            mult();
            break;
    case 4 :clrscr();
            kopf();
            cout << "\n\tSie haben sich fuer die Division entschieden\n\n";
            eingabe();
            div();
            break;
    case 5 :clrscr();
            kopf();
            cout << "\n\tVielen dank das Sie unseren Grundlagen-Rechner benutzt haben."
                 << "\n\n\t\t\tAuf Wiedersehen";
            getchar();
            x=1;
            break;
    default:cout << "\nunbekannter Befehl";
            getchar();
    }
    }
    
    //Eingabe
    void eingabe (void)
    {
         cout<< "\nGeben Sie bitte Ihre erste Zahl ein: ";
         gets(zeichen[0]);
         cout << "\nGeben Sie bitte Ihre zweite Zahl ein: ";
         gets(zeichen[1]);
    int l=strlen(zeichen[0]);                //Länge bestimmt
    int k=strlen(zeichen[1]);
    memmove(zeichen[0]+20-l,zeichen[0],l);   //Verschieben
    memset(zeichen[0],'0',20-l);             //Auffüllen
    memmove(zeichen[1]+20-l,zeichen[0],l);   //Verschieben
    memset(zeichen[1],'0',20-l);             //Auffüllen
    
         return;
    }
    
    //addition
    
     void add(void)                               //additionsfunkton
     {
      int z1;
      int z2;
      int summe;
      int uebertrag=0;
      int p=strlen(zeichen[0]);
      int q=strlen(zeichen[1]);
      p--;
      q--;
        for (int i=19;i>=0;i--)
        {
               if (p>=0)
               {
                  z1=zeichen[0][p]-'0';
               }
               else
               {
                   z1=0;
               }
               if (q>=0)
               {
                   z2=zeichen[1][q]-'0';
               }
               else
               {
                  z2=0;
               }
    
               summe=z1+z2+uebertrag;
    
               uebertrag=summe/10;
               ergebnis[i]=summe%10+'0';
               p--;
               q--;
        }
    
                 cout <<"\n\nIhr Ergebnis lautet: " <<ergebnis;
    
      getchar();
     }
    
     //##############################################################
     //##                Subtraktionsfunktion                      ##
     //##############################################################
    
     void sub(void)
     {
      int z1;                                     //int aller benötigten Sachen
      int z2;
      int summe;
      int uebertrag=0;
      int i=strlen(zeichen[1]);
    //  int l=strlen(zeichen[0]);                //Länge bestimmt
    //  memmove(zeichen[0]+20-l,zeichen[0],l);   //Verschieben
    //  memset(zeichen[0],'0',20-l);             //Auffüllen
    
    if(zeichen[1][0]=='-')                       //schaut ob im zweiten Array Zeichen ein Minus ist
    {
     add();                                      //wenn ja benutze die Additionsfunktion
    }
    
    else                                        //falls nicht
     {
     if(strcmp(zeichen[0],zeichen[1])>=1)       //sollte die 1te Zahl größer sein als die 2te
       {
         for (i-=1;i>=0;i--)
          {
    
                 z1=zeichen[0][i]-'0';          //dient zur berechnung ist eine additionsfunk
                 z2=zeichen[1][i]-'0';         //wandelt char in int variablen um
    
                 summe=z1-z2+uebertrag;        //dann Zahl1-Zahl2 in SUmme speichern
    
                 uebertrag=summe/10;
                 ergebnis[i]=summe%10+'0';
    
          }
                   cout <<"\n\nIhr Ergebnis lautet: " << ergebnis;           //ergebnis
       }
    
     else                                    //wenn2te größer 1st
       {                                     //das funktioniert
         for (i-=1;i>=0;i--)
          {
    
                 z1=zeichen[0][i]-'0';       //Hier das gleiche wie oben
                 z2=zeichen[1][i]-'0';
    
                 summe=z2-z1+uebertrag;      //Zahl2-Zahl1
    
                 uebertrag=summe/10;
                 ergebnis[i]=summe%10+'0';
    
          }
              cout <<"\n\nIhr Ergebnis lautet: " << "-" << ergebnis;        //ergebnis mit Minus davor
        }
     }
     getchar();
    }
    
     void mult(void)
     {
      eingabe();
    
     }
    
     void div(void)
     {
      eingabe();
    
     }
    
     void kopf(void)
     {
     int i=79;
     cout << "\t\t Der Grundlagentaschenrechner"
          << "\n\t Copyright by xxx"<<endl;
    
         for(i; i >=0;i--)
                {
                  cout<< "_";
                }
    
     }
    


  • besser gesagt jetzt funktioniert nichts mehr



  • Für das Verschieben von zahlen[1] mußt du auch dessen Länge (k) nutzen 😉 (ansonsten bin ich wie gesagt nicht ganz sicher, ob die Indizes stimmen - jag da mal lieber durch den Debugger und beobachte, was wohin geschoben wird).



  • mit den richtigen idizes funktioniert's einwandfrei

    int l=strlen(zeichen[0]);                //Länge bestimmt
        int k=strlen(zeichen[1]);
        memmove(zeichen[0]+20-l,zeichen[0],l);   //Verschieben
        memset(zeichen[0],'0',20-l);             //Auffüllen
        memmove(zeichen[1]+20-k,zeichen[1],k);   //Verschieben
        memset(zeichen[1],'0',20-k);             //Auffüllen
    

    Naj bei neagativen zahlen dürfte es trotzdem noch probleme geben.
    Kurt

    BTW nach solchen operationen wirkt ein einfaches

    cout << zeichen[0] << endl;
    

    wunder wenn du sehen willst ob du es auch richtig gemacht hast.



  • Joa so geht die NORMALE subtraktion mit unterschiedlichen langen zahlen
    und des minus geht auch außer du hast vorher die addition mal aufgerufen dann geht sie nicht mehr
    und mit - - gehts auch noch nicht.

    Trotzdem thx die restlichen probs werd ma shco irgendwie lösen falls doch noch jemand was weiß bitte posted es


Anmelden zum Antworten