Ohne Rekursion
-
Hi
Also ich hab mir gerade ein Programm für mein Tutorium überlegt. Es soll ein Binärcode zähler geschrieben werden der so eine Ausgabe hat:
(zb bei 3 bit)
000
001
010
011
100
..
111So, bei einer festgelegten bit Anzahl, kann man einfach for's verschachteln.
Nun wollte ich es aber bitzahl unabhänig programmieren:Das hab ich auch geschafft - mit rekursion:
#include <stdlib.h> #include <stdio.h> #define BITZAHL 6 int bin(int * z1, int a,int max) { for(*(z1+a)=0 ;*(z1+a)<2 ;(*(z1+a))++) { if(a==0) { for(int g=max;g>=0; g--)printf("%d ",*(z1+g)); printf("\n"); } else bin(z1,a-1,max); } } int main(int argc, char *argv[]) { int z1[BITZAHL]; int a=(BITZAHL -1); bin(z1,a,a); system("PAUSE"); return 0; }
Nunja ich bin mir aber sicher, das von den Tutoriumleuten des fast keiner checkt, weil die noch ziemlich am Anfang sind.
Hat irgendjemand ne Idee wie man das einfacher Lösen kann?ich hätte aber gern ne lösung mit ner varibale(~array) für jede Stelle.
(sonst könnt ich ja auch einfach ne int-variable duchzählen und immer in binärcode ausgeben, aber ne Binärcode Ausgabe is auch a biserl zu hoch für die Leut, glaub ich)
Gruß
Flow
-
Hallo,
also irgendwie finde ich das ja etwas merkwuerdig, du schreibst ein Program was du meinst wuerden die in deinem Tutorium nicht verstehen, meinst aber denen ein Program erklaeren zu koennen, das du nicht selber schreiben kannst.
Ich habe mir jetzt auch noch nicht die Muehe gemacht dein Program zu verstehen, aber ich finde es schon etwas merkwuerdig in einer Schleife entweder eine weitere Schleife oder einen rekrusiven Aufruf zu haben. Aber mal abgesehen davon funktioniert das Program schon deswegen nicht weil bin keinen Wert zurueck gibt, du das aber laut deiner Spezifikation machen sollte.
Ausserdem kannst du anstelle von sowas
*(z1+a)
auch ruhig
z1[a]
schreiben, das ist wesentlich besser zu lesen.
Gruß Entyl Sa
-
Entyl_Sa schrieb:
Hallo,
Aber mal abgesehen davon funktioniert das Program schon deswegen nicht weil bin keinen Wert zurueck gibt, du das aber laut deiner Spezifikation machen sollte.Also funktionieren tuts, auch so wie ich mir das vorstell. Und ich will auch kein programm schreiben, was ich selbst nicht versteh, sondern ich wollt nur fragen ob jemand ne Idee hat wie man das 'EINFACHER' Lösen kann! Und da is mir bis jetzt nix tolles eingefallen!
Und wahrscheinlich hab ich mich falsch ausgedrück, aber die funktion muss keinen Wert zurück geben!!
Gruß Flow
-
Hier eine Lösung ohne Rekursion.
#include <stdlib.h> #include <stdio.h> #define BITZAHL 6 int bin(int *z1, int a) { for(int i=0; i<=a; i++) z1[i]=0; while(1) { int i; for(i=a; z1[i]==1; i--) z1[i]=0; if(i<0) break; z1[i]=1; for(int j=0; j<=a; j++) printf("%d", z1[j]); printf("\n"); } } int main(int argc, char *argv[]) { int z1[BITZAHL]; int a=(BITZAHL -1); bin(z1, a); system("PAUSE"); return 0; }
-
Hallo,
jetzt hast du zwar schon eine Moeglichkeit gesehen wie man das ohne Rekursion loessen kann, aber da ich da einen Moment gebraucht habe um dahinter zu kommen wie das funzt hab ich mir gedacht ich zeige dir mal wie ich das geloesst haette, und gut erklaeren koennte.
Das mit dem zurueckgeben eines Wertes bezog sich darauf das du
int bin(...)
schreibst, das schluckt mein Compiler nicht, ich weis ja nicht ob das in C erlaubt ist, aber mein VC++ Compiler mag das halt nicht.
#include <stdlib.h> #include <stdio.h> #include <math.h> #define BITZAHL 6 void inc(int z1[], int a){ for(int i=a; i>=0;i--){ if(z1[i]==0){ z1[i]=1; break; } else z1[i]=0; } } void show(int z1[], int a){ for(int j=0; j<=a; j++) printf("%d", z1[j]); printf("\n"); } void bin(int z1[], int a) { int i; for(i=0; i<=a; i++) z1[i]=0; for(i=0; i<pow(2,a+1);i++){ show(z1,a); inc(z1, a); } } int main(int argc, char *argv[]) { int z1[BITZAHL]; int a=(BITZAHL -1); bin(z1, a); system("PAUSE"); return 0; }
Das entspricht auch etwas mehr meiner Vorstellung von einem Zaehler, da es nicht nur eine Funktion ist die die Werte hochzaehlt und ausgibt.
Gruß Entyl Sa
-
Entyl_Sa schrieb:
Hallo,
jetzt hast du zwar schon eine Moeglichkeit gesehen wie man das ohne Rekursion loessen kann, aber da ich da einen Moment gebraucht habe um dahinter zu kommen wie das funzt hab ich mir gedacht ich zeige dir mal wie ich das geloesst haette, und gut erklaeren koennte.
Dir ist aber schon klar dein Algorithmus ziemlich identisch ist mit meinem?
Vor allem der Teil:Entyl_Sa schrieb:
for(int i=a; i>=0;i--){ if(z1[i]==0){ z1[i]=1; break; } else z1[i]=0; }
DrZoidberg schrieb:
for(i=a; z1[i]==1; i--) z1[i]=0; z1[i]=1;
-
warum verwendet ihr kein memset() und keine vernünftigen variablen namen?
die letzte Version ist schon ganz OK, aber immer noch schwer lesbar.
-
@DrZoidberg:
natuerlich ist der Code den ich geschrieben habe aehnlich zu deinem, aber da ich den nicht selber geschrieben habe brauchte ich halt einen moment, und die Ausgabefunktion ist sogar komplett von dir uebernommen. Mir passte das nur nicht das so alles in einem Aufwasch zu machen, so kann ich das einfach nicht als Zaehler bezeichnen sondern nur als eine Funktion die Binaerzahlen ausgibt.@Shade Of Mine:
Also das mit dem memset() gehoert leider nicht su meinem aktiven Sprachschatz, weis nur was man damit macht, aber halt nicht wie genau.Was die Variablen Namen angeht, so hast du sicher recht, aber die habe ich einfach aus dem Ursprungsprogram uebernommen.
-
So könnte memset aussehen
void *memset(void *dest, int c, size_t count) { char *my_dest = dest; while(count--) my_dest[count] = c; return dest; }
'ne Riesenfunktion