Dezimal in Binär Tabelle mit Rekursiv-funktion



  • Hallo Freunde,

    Ich bin neu hier und auch mit Programmiersprache C.

    Also ich versuche ein Tabelle zu erstellen wo ich Dezimalzahlen in Binär umwandeln kann.
    Ich brauche für die Umwandlung ein Rekursivfunction.

    Das habe ich bis jetzt gemacht.

    #include <stdio.h> 
    
    long dez2bin_rek (int n) 
    {    static long b,r,f = 1; 
          if (n != 0)   
         {   r = n % 2;       
              b = b + r * f;         f = f * 10;        
              dez2bin_rek(n / 2);    
      }          
    return b;
    }     
    
    void iterative(int n)
    {   
          int i;         
          for (i=1; i < 5; i++)  
         {      long b;            
                 n++;       
                  b = dez2bin_rek(n);    
                 printf("%d       %ld\n", n, b);      
        }
     } 
    
    int main()
     {             
                 int n = 0;  
                  iterative(n);            
                 getchar();        
                 return 0;
     }
    

    also hier bekomme ich falsche Binärwerte raus.
    Ich denke das Fehler liegt irgendwo in mein dez2bin_rek(); funktion.

    Kann mir jemand weiterhelfen?

    danke im Voraus 🙂 🙂


  • Mod

    1. static und Rekursion vertragen sich in der Regel nicht gut. Da muss man schon genau wissen, was da abgeht und ich wette, du weißt es nicht.
    2. static long foo, bar = 1; Dann startet foo mit dem Wert 0, was dir bestimmt auch nicht bekannt war.
    3. So wie du das n in interactive und main benutzt, solltest du besser noch einmal Grundlagen von Funktionen und Variablen wiederholen.

    Mit den Punkten 1 und 2 gebe ich dir mal einen Augenöffner. Deine Ausgabe

    1       1
    2       101
    3       11101
    4       10011101
    

    Richtig wäre:

    1       1
    2       10
    3       11
    4       100
    

    Und jetzt hebe ich mal etwas hervor:

    1       1
    2       [b]10[/b]1
    3       [b]11[/b]101
    4       [b]100[/b]11101
    
    1       [b]1[/b]
    2       10[b]1[/b]
    3       11[b]101[/b]
    4       100[b]11101[/b]
    

    Und fallen schon die Schuppen in die Augen? 🙂

    Kommunikation zwischen verschiedenen Ebenen der Rekursion solltest du lieber über die Rückgabewerte machen. static ist, wie du siehst, eine schlechte Idee. Eigentlich hast du es schon fast richtig, du musst nur noch den Rückgabewert auch innerhalb der Rekursionsfunktion nutzen.

    Wobei ich es allgemein sehr unelegant finde, eine Darstellung (d.h. eine Zeichenfolge) als einen Zahlenwert (ein arithmethischer Typ wie long) zu behandeln.



  • Faszinierend, static-Variablen in einer rekursiven-Funktion. 😮

    Welchen Wert hat b (aus dez2bin_rek), wenn du in Zeile 20 n=2 bist? oder gar bei n=3?



  • SeppJ schrieb:

    1. static und Rekursion vertragen sich in der Regel nicht gut. Da muss man schon genau wissen, was da abgeht und ich wette, du weißt es nicht.
    2. static long foo, bar = 1; Dann startet foo mit dem Wert 0, was dir bestimmt auch nicht bekannt war.
    3. So wie du das n in interactive und main benutzt, solltest du besser noch einmal Grundlagen von Funktionen und Variablen wiederholen.

    Mit den Punkten 1 und 2 gebe ich dir mal einen Augenöffner. Deine Ausgabe

    1       1
    2       101
    3       11101
    4       10011101
    

    Richtig wäre:

    1       1
    2       10
    3       11
    4       100
    

    Und jetzt hebe ich mal etwas hervor:

    1       1
    2       [b]10[/b]1
    3       [b]11[/b]101
    4       [b]100[/b]11101
    
    1       [b]1[/b]
    2       10[b]1[/b]
    3       11[b]101[/b]
    4       100[b]11101[/b]
    

    Und fallen schon die Schuppen in die Augen? 🙂

    Kommunikation zwischen verschiedenen Ebenen der Rekursion solltest du lieber über die Rückgabewerte machen. static ist, wie du siehst, eine schlechte Idee. Eigentlich hast du es schon fast richtig, du musst nur noch den Rückgabewert auch innerhalb der Rekursionsfunktion nutzen.

    Wobei ich es allgemein sehr unelegant finde, eine Darstellung (d.h. eine Zeichenfolge) als einen Zahlenwert (ein arithmethischer Typ wie long) zu behandeln.

    lol genau dasss genauuuu das kommt bei mir.
    Also ich habe einmal mit printf probiert und es funktioniert einwandfrei, natürlich weil ich total anfänger bin, mir hat bisschen jemand mit tips und tricks geholfen.

    Aber hier wusste ich nicht wo genau fehler liegt !
    also static in rekursive ist no go.

    Wie genau kann ich mein Rekursive noch eleganter machen?
    Sorry mein Deutsch ist halt nicht so gut, ich lerne es noch 🙂 🙂


  • Mod

    rocker1234 schrieb:

    lol genau dasss genauuuu das kommt bei mir.

    Das ist ja auch von dir! ICh wollte dir dein Problem erklären, aber du hast anscheinend nicht verstanden. Das Problem ist, dass die static-Variablen bei jedem Aufruf noch den Wert von vorher haben. Daher bekommst du jedes mal den vorherigen Wert hinten dran. Also steht bei der 2, wo eigentlich 10 rauskommen sollte, noch die 1 dran, also 101. Und bei der 3, wo eigentlich 11 rauskommen sollte steht 11101, weil noch der (falsche) Wert von der 2 da ist, usw.

    Wie genau kann ich mein Rekursive noch eleganter machen?

    Also erst einmal mach das static raus. Und nutze, wie vorgeschlagen, deine Rückgabewerte:

    #include <stdio.h>
    
    long dez2bin_rek (int n, int f)
    {   
      if (n != 0)  
        {   
          return (n % 2) * f + dez2bin_rek(n / 2, f * 10);
        }          
      else 
        return 0;
    }    
    
    long dez2bin (int n)
    {   
      return dez2bin_rek(n, 1);
    }    
    
    void iterative(int n)
    {  
      int i;
      for (i = n; i < n + 5; ++i)  
        {  
          printf("%d       %ld\n", i, dez2bin(i));      
        }
    }
    
    int main()
     {            
       iterative(1);   
       return 0;         
     }
    

    Beobachte auch, wie ich dein Programm stark verschlankt habe, indem ich viele unnötige Variablen gekürzt habe.

    Beachte auch meinen Kommentar oben, vonwegen der Trennung von Zahlenwerten und Darstellungen. Du solltest wohl eher in der Rekursionsfunktion direkt die Zeichen der binären Darstellung ausgeben, anstatt einen Zahlenwert zu berechnen, der dann in einer bestimmten anderen Darstellung (nämlich der dezimalen) wieder der Binärdarstellung des ursprünglichen Wertes entspricht. Das überlasse ich zur Übung dir. Es ist leicht, die Darstellung umgekehrt auszugeben. Das richtig herum drehen, dafür muss man ein bisschen nachdenken. (Tipp: Die Aufgabenstellung kommt hier im Forum sehr oft dran. Mal die Suchfunktion benutzen)

    Sorry mein Deutsch ist halt nicht so gut, ich lerne es noch 🙂 🙂

    Du kannst auch gerne in anderen Sprachen schreiben, wenn du glaubst, dass genügend Leute es verstehen. Bei Englisch ist das garantiert der Fall.



  • rocker1234 schrieb:

    Aber hier wusste ich nicht wo genau fehler liegt !
    also static in rekursive ist no go.

    Eine statische Variable in einer rekursiven Funktion kann schon Sinn ergeben, da für diese Variable kein Stack verbraucht wird. Eine Static-Variable verhält sich aber genauso wie eine globale Variable (außer dass sie nur für die Funktion sichtbar ist) und nicht wie eine lokale Variable.

    Wie genau kann ich mein Rekursive noch eleganter machen?

    Hier meine "Musterlösung":

    #include <stdio.h>
    #include <stdlib.h>
    
    long dez2bin_rek (int n, long b, long f)
    {
    	if (n != 0)
    	{
    		long r = n % 2;
    		b = b + r * f;
    		f = f * 10;
    		b = dez2bin_rek(n/2, b, f);
    	}
    	return b;
    }
    
    void iterative(int n)
    {
    	char bin[36];
    	int i;
    	for (i=1; i < 5; i++)
    	{
    			long bb;
    			n++;
    			bb = dez2bin_rek(n,0,1);
    			printf("n=%d\tbb=%4ld\titoa=%s\n", n, bb, itoa(n,bin,2));
    	}
    }
    
    int main()
    {
    	int n = 0;
    	iterative(n);
    	getchar();
    	return 0;
    }
    

    viele grüße
    ralph



  • SeppJ schrieb:

    #include <stdio.h>
     
    long dez2bin_rek (int n, int f)
    {   
      if (n != 0)  
        {   
          return (n % 2) * f + dez2bin_rek(n / 2, f * 10);
        }          
      else 
        return 0;
    }    
     
    long dez2bin (int n)
    {   
      return dez2bin_rek(n, 1);
    }    
     
    void iterative(int n)
    {  
      int i;
      for (i = n; i < n + 5; ++i)  
        {  
          printf("%d       %ld\n", i, dez2bin(i));      
        }
    }
     
    int main()
     {            
       iterative(1);   
       return 0;         
     }
    

    Beobachte auch, wie ich dein Programm stark verschlankt habe, indem ich viele unnötige Variablen gekürzt habe.

    Beachte auch meinen Kommentar oben, vonwegen der Trennung von Zahlenwerten und Darstellungen. Du solltest wohl eher in der Rekursionsfunktion direkt die Zeichen der binären Darstellung ausgeben, anstatt einen Zahlenwert zu berechnen, der dann in einer bestimmten anderen Darstellung (nämlich der dezimalen) wieder der Binärdarstellung des ursprünglichen Wertes entspricht. Das überlasse ich zur Übung dir. Es ist leicht, die Darstellung umgekehrt auszugeben. Das richtig herum drehen, dafür muss man ein bisschen nachdenken. (Tipp: Die Aufgabenstellung kommt hier im Forum sehr oft dran. Mal die Suchfunktion benutzen)

    also ich habe jetzt verstand warum mein rekursive so falsche war 😃

    ok ich werde versuchen, diese Funktion in wörtern anzufassen, bitte korrigiere mich wenn ichw as falsche sage,

    also

    Unser program fangt an in main wie immer
    da ruft er dann iterative mit value (1) (oder für value 1?)

    dann läuft unser iterative(int n), also n is jetzt 1 von unser main
    dann kommt variable i declaration also es ist ein int
    danach haben wir ein for loop dann unset typische for loop init, condition und implementation also i = n ( i = 1 ); i < n + 5 (1 < 6); 1++)
    dann in unser for loop gibt unser program uns ein output mit printf
    also erst print es i ( also 1) und dann haben wir wieder ein funtion aufruf für
    i. Da ruft er dez2bin(1) für i (oder 1)

    jetzt gehen wir in unsere dez2bin(int n) oder hier n = 1 wieder.
    Da gibt es als zurück wert wieder ein funktion aufruf dez2bin_rek(n,1);
    also n ist immer noch hier 1 und dazu noch haben wir noch ein wert 1 (ist diese 1 ein constant?).

    Jetzt sind wir in unsere dez2bin_rek (int n, int f) (n = 1 und f = auch 1).
    Hier haben wir ein IF statement also wnn n ist nicht gleich 0 dann dürfen wir hier rein spazieren else wird program abgebrochen.

    Also in unser IF gibt er folgendes rückgeben.

    n%2 = 1 und 1 * f ( f = 1) ist auch 1 + (recursion dez2bin_rek(1/2, 1 * 10) also 0, 10 usw.. uns es wird immer weiter gleiches machen so like n = 0.
    dan geht er wieder raus und dann sind wieder wieder in interative. so lange i < 5.

    Also ich mag deutsch, es chance für mich ich kann hier mit mein C auch mein deutsch verbessern 😉 😉



  • rkhb schrieb:

    rocker1234 schrieb:

    Aber hier wusste ich nicht wo genau fehler liegt !
    also static in rekursive ist no go.

    Eine statische Variable in einer rekursiven Funktion kann schon Sinn ergeben, da für diese Variable kein Stack verbraucht wird. Eine Static-Variable verhält sich aber genauso wie eine globale Variable (außer dass sie nur für die Funktion sichtbar ist) und nicht wie eine lokale Variable.

    Wie genau kann ich mein Rekursive noch eleganter machen?

    Hier meine "Musterlösung":

    #include <stdio.h>
    #include <stdlib.h>
    
    long dez2bin_rek (int n, long b, long f)
    {
    	if (n != 0)
    	{
    		long r = n % 2;
    		b = b + r * f;
    		f = f * 10;
    		b = dez2bin_rek(n/2, b, f);
    	}
    	return b;
    }
    
    void iterative(int n)
    {
    	char bin[36];
    	int i;
    	for (i=1; i < 5; i++)
    	{
    			long bb;
    			n++;
    			bb = dez2bin_rek(n,0,1);
    			printf("n=%d\tbb=%4ld\titoa=%s\n", n, bb, itoa(n,bin,2));
    	}
    }
    
    int main()
    {
    	int n = 0;
    	iterative(n);
    	getchar();
    	return 0;
    }
    

    viele grüße
    ralph

    superrrr danke sehr 😃 thats another way to do it 😃

    ich werde es auch in wörtern anfassen.



  • Also leute noch eine Frage;

    gibts irgendwo ein webseite wo man C richtig üben kann?
    also ich bin wirklich total anfänger, habe vor 2 wochen mit C nix zu tun gehabt und heute versuche ich es zu lernen.
    Bis jetzt mach das schon spass.

    Also so ein paar aufgaben für anfänger wären nicht schlecht.

    Und meint ihr das ich auch über debugging lernen muss?

    Ich nutze momentan neuster version von debian, welche debugger wird ihr mir empfehlen?

    DANKE NOCHMAL für hilfe. Hier werde ich bestimmt viel lernen 😃



  • rocker1234 schrieb:

    Also leute noch eine Frage;

    gibts irgendwo ein webseite wo man C richtig üben kann?
    also ich bin wirklich total anfänger, habe vor 2 wochen mit C nix zu tun gehabt und heute versuche ich es zu lernen.
    Bis jetzt mach das schon spass.

    Also so ein paar aufgaben für anfänger wären nicht schlecht.

    Und meint ihr das ich auch über debugging lernen muss?

    Ich nutze momentan neuster version von debian, welche debugger wird ihr mir empfehlen?

    DANKE NOCHMAL für hilfe. Hier werde ich bestimmt viel lernen 😃

    Ich schwoer ja hier drauf:
    ➡ http://www.c-howto.de/tutorial.html 👍

    Alle Basics, übersichtlich und gut erklärt, in logischer Reihenfolge.
    Teilweise mit Grafiken und sich aufeinander aufbauende Aufgaben mit Lösungen.
    Viel Erfolg. 😉


  • Mod

    Mein Rat: Bloß keine Tutorials. Nimm ein gutes Buch. Z.B. K&R.



  • und mein Rat ist: Wenn du wirklich noch totaler Anfänger bist, schau dir Erstmal Tutorials im Internet an, wo du wenigstens Lösungen hast, und ein wenig mit rumspielen kannst. Für den Anfang reicht das allemal und das Buch kann man sich bei Lust auf mehr dann immer noch zulegen und weiter lernen.

    Wenn du K&R liest, wirst du denke ich Grade als Anfänger erstmals Probleme haben es zu verstehen, da meiner Meinung nach zwar kompetent, aber relativ schnell hoch angefangen wird.
    Wäre schade um die 30€ wenn du nach den ersten Kapiteln keine Lust mehr hast.
    Und kostenlos ein bisschen ausprobieren schadet nie, und schlecht sind die tutorials auf keinen Fall. 😉



  • Ja ich bin anfänger, wir haben in unser Klasse noch nicht mal pointers und arrays gemacht.

    Also tutorials guck ich mir immer wieder.

    Alles klar leute 😃 danke Sehr nochmals für Tips und Hilfe 😃
    ich komm hier wieder und nervt ihr wieder bald 😃


Anmelden zum Antworten