Problem mit Funktion



  • Wie kann ich dieses Programm ohne die Funktion schreiben ?

    #include <iostream>
    using namespace std;
    
    void dez_bin(long int z);
    
    void main() 
    {
    long int dezimal;
    
    cout<<"Geben Sie die dezimale Zahl ein: ";
    cin>>dezimal;
    
    cout<<"Binäre Darstellung:\n";
    
    dez_bin ( dezimal);
    
    system("PAUSE");
    }
    
      void dez_bin(long int z)
      {
    
            if (z>0)
            {
                    dez_bin(z/2);
                    cout<<z%2;
            }
    
      }
    

    Ich kriegs irgenwie nicht hin ich bekomme immer 1 als Ergebniss raus -.-

    Was genau macht die Funktion da anderes ?

    #include <iostream>
    using namespace std;
    
    void dez_bin(long int z);
    
    void main() 
    {
    long int dezimal;
    long int erg;
    
    cout<<"Geben Sie die dezimale Zahl ein: ";
    cin>>dezimal;
    
    cout<<"Binäre Darstellung:\n";
    
            if (dezimal > 0 )
            {
              erg = dezimal / 2;
              cout<<"binär zahl 1: "<<dezimal%2<<endl;
    
            }
    
    system("PAUSE");
    }
    


  • die Funktion ruft sich immer wieder selbst auf (Rekursion), siehe Zeile 30
    solltest vielleicht dir n Tutorial dazu anschauen, wenn dir das nicht ganz klar ist

    um die Funktion "nachzubauen", müsstest du in deinem Programm ohne die Funktion die Berechnung in eine Schleife bauen
    z.B. so:

    while (dezimal > 0)
    {
        erg = dezimal / 2;
        cout<<"binär zahl 1: "<<dezimal%2<<endl;
    }
    

    so ungefähr muss es dann lauten !

    PS:
    es heißt int main() und nicht void main() !!
    und es fehlt ein return 0 am Ende deines Programms (um mal ganz genau zu sein 🙂 )



  • Erm R3dnexx?
    Also wenn man nun eine solche Schleife mit Abbruchbedingung schreibt, sollte man natürlich auch dafür sorgen, dass diese Bedingung irgendwann einmal auftritt 🙂
    Und da die rekursive Funktion in sich die Bitfolge schon umdreht, musst du sowas natürlich auch simulieren durch einen entsprechenden Zwischenspeicher. Ansonsten würdest du ja zuerst mod 2 machen, dann durch 2 teilen und dann wieder mod 2. Wenn du das dann ausgibst, ist die Binärfolge falschherum.
    Irgendwie so:

    unsigned int zahl = 5235235;
    unsigned int mask = 1 << 31;     // Oberstes Bit gesetzt
    
    while( mask && !(mask & zahl) ) mask >>= 1; // Führende Nullen überspringen
    do {
        std::cout << ((zahl & mask)>0);   // bool wird als 0 oder 1 ausgegeben
        mask >>= 1;
    } while( mask );   // Eine 0 soll immer ausgegeben werden
    

    Das klappt natürlich in dem Fall nur mit 32-Bit-unsigned Integern. Wahrscheinlich ist mir jetzt etwas entgangen, wie man das wesentlich einfacher machen kann 🙂

    MfG,
    Michael



  • Ok danke, ich werd mir mal diese Rekursion Sachen anschauen.



  • R3dNeXX schrieb:

    PS:
    und es fehlt ein return 0 am Ende deines Programms (um mal ganz genau zu sein 🙂 )

    Nein, das tut es nicht (um mal ganz genau zu sein) 🙄

    int main()
    {}
    

    ist völlig korrekt, da jeder standard-konforme Compiler das return 0; selbstständig ans Ende der main-Fkt (und nur dort) setzt...

    bb



  • @Decimad:
    du hast natürlich recht, sorry, bin heut sowieso etwas durcheinander 🙂

    ps: denke das nächste Mal etwas mehr nach !!



  • Ich hab das gerade einfach mal ohne Abbruchbedinung und so ausprobiert.

    Ich hab einfach mal eine 7 eingeben als Ergebniss müsste ja dann kommen 111

    Aber ich bekomme immer nur eine 1 ausgegeben.

    #include <iostream>
    using namespace std;
    
    void main() 
    {
    long int dezimal;
    long int erg;
    
    cout<<"Geben Sie die dezimale Zahl ein: ";
    cin>>dezimal;
    
    cout<<"Binäre Darstellung:\n";
    
            while (dezimal > 0)
            {
                erg = dezimal / 2;
                cout<<"binär zahl: "<<dezimal%2<<endl;
    
            }
    
    }
    


  • mit diesem algorythmus gehts. Musst halt nur die genauigkeit mit angeben. Also wieviel bits deine zahl hat.

    #include <iostream>
    
    using namespace std;
    
    int main()
    {
        int zahl=7;
        for(int i=32;i>=0;i--)
        {
            if((1<<i) & zahl)
                cout << "1";
            else
                cout << "0";
        }
        cout << endl;
        return 0;
    }
    


  • func schrieb:

    void main()
    

    Es wäre dennoch schön, wenn du dir alle Anmerkungen durchliest. "void main" ist immer noch kein gültiges C++ und war es auch noch nie, auch wenn dein Compiler es akzeptieren mag, und man es ab und zu in schlechten Büchern/Tutorials sieht.



  • Hallo func,

    in Deinem Programm (Code vom 09.12.2008, 12:56) weist du der Variablen 'erg' einmal 'dezimal' halbe zu, aber die Variable 'dezimal' änderst Du nirgends in der wile-Schleife. Damit kann die Abbruchbedingung nie erfüllt werden (wenn die dezimalzahl nicht 0 oder 1 ist) und du hast eine Endlosschleife die andauernd lediglich 'binär zahl: 0/1' ausgibt.
    Weiterhin erhälst du keine Ausgabe bei 'dezimal' = 0, weil Du dann nicht in die Schleife zur Ausgabe kommst.

    Folgender Vorschlag:
    - Du brauchst eine Schleife, in die du erstmal immer reinkommst für Verarbeitung von dezimal 0: do-while.
    - innerhalb der Schleife erfolgt nur die Umwandlung mit Zwischenspeicherung des Ergebnisses (mache ich hier mit einem std::ostringstream)
    - Die Ausgabe erfolgt nach der Schleife nach Umkehrung der Ziffernreihenfolge im string

    #include <conio.h>       // für getch() - nicht sehr schön
    
    #include <iostream>
    #include <string>
    #include <sstream>       // für Umwandlung von integer nach string 
    #include <algorithm>     // für reverse()
    
    int main()
    {
       unsigned long int dezimal;
    
       std::cout << "Geben Sie eine positive dezimale Zahl ein: ";
       std::cin >> dezimal;
    
    // Umwandlung
       std::ostringstream ss;
       do {
           ss << (dezimal%2);
           dezimal = dezimal / 2;
           }
       while (dezimal > 0);
    
    // Reihenfolge der binärziffern umdrehen
       std::string erg(ss.str());
       reverse(erg.begin(), erg.end());
    
    // Ausgabe
       std::cout << "Binäre Darstellung: " << erg << std::endl;
    
    // schließen der Konsole verhindern - quick and dirty
       std::cout << "Taste zum beenden";
       getch();
    
       return 0;
    };
    

Anmelden zum Antworten