Rekursion
-
seb123 schrieb:
hm naja es stand in der aufgabenstellung, dass man die funktion in der headerdatei deklarieren sollte
naja, dann mach das so, wenn's gefordert ist. aber eigentlich ist sowas doof.
-
seb123 schrieb:
hm naja es stand in der aufgabenstellung, dass man die funktion in der headerdatei deklarieren sollte
Da gibt es einen Unterschied zwischen Deklaration und Definition.
Deklarieren wird im h-File gemacht. Definiert wird im c-File.In abc.h
void myWhatever(void); //Deklaration
In abc.c
//Definition void myWhatever(void) { printf("whatever\n"); }
-
;fricky schrieb:
seb123 schrieb:
hm naja es stand in der aufgabenstellung, dass man die funktion in der headerdatei deklarieren sollte
naja, dann mach das so, wenn's gefordert ist. aber eigentlich ist sowas doof.
Deklarieren :
void foo ( int, char*, double );
Definieren :
void foo ( int x, char* str, double pi ) { /*....*/ }
€dit: Curry, warst wohl etwas schneller (:
-
^^ich bringe das immer durcheinander, aber seine .h-datei enthält eine komplette funktion samt code und so, das ist selten gut.
-
hm wenn ich jetz den ganzen code eh in die .c datei schreiben wieso sollte ich die funktion in der .h datei noch deklarieren ?
und wie würde das in meinem beispiel konkret aussehen ?
-
Du würdest Zeile 4 bis 51 aus der .h in die .c-Datei kopieren und int myprintf(n,b,d,c,i); in der .h stehen lassen. Das hat den Sinn dass später mal irgendein Programm deine myprintf braucht und einfach mit #include "bla.h" deine myprintf benutzen kann. In der bla.h darf aber myprintf nicht definiert sondern nur deklariert sein (definiert heißt es steht da was myprintf tut. deklariert heißt es steht da dass myprintf existiert). Wenn du mehrere C-Dateien hast die myprintf benutzen und myprintf ist in bla.h deklariert wissen alle Teile dass es myprintf gibt und benutzen es. Wenn du myprintf definierst meckert der Linker dass myprintf doppelt definiert ist.
-
so hab das ganze ma kurz überarbeitet
die .c datei sieht nun wie folgt aus
#include "stdio.h" #include "myio.h" #include "assert.h" //Funktionsdefinition void myprintf(int n,int b) { int c,d,i; char a[0]; //Initialisierung assert (n >= 0); c=1; i=0; // Start der Funktion while (n != 0) { c=n%b; n=n/b; // Hexadezimalsystem implentieren if (b==16) { if (c==10) c='A'; if (c==11) c='B'; if (c==12) c='C'; if (c==13) c='D'; if (c==14) c='E'; if (c==15) c='F'; } a[i]=c; i=i+1; } i=i-1; printf ("\n"); for (i=i; i>-1;i--) { if (a[i]<10) printf("%i",a[i]); else printf ("%c",a[i]); } } // Hauptprogramm int main () { int n,b; printf (" Gib eine natuerliche Zahl und die Basis ein\n"); scanf ("%i\n", &n); scanf ("%i", &b); if ( b!=2 & b!=8 & b!=10 & b!=16) { printf ("base %i not supported", b); //exit(0); } else { myprintf(n,b); } return 0; }
ich hab wie gewünscht die funktion nun dort definiert und der .h datei nur die deklaration
das programm läuft immernoch wie gewünscht allerdingst nehm ich an, dass meine version nicht rekursiv ist ?
nach meinem verständnis ruf ich die funktion ja nur einmal auf und das wars dann aber wie müsste ich das umgestalten damit das rekursiv wird (sich selber aufruft)
vielen dank schonma soweit
-
nach meinem verständnis ruf ich die funktion ja nur einmal auf und das wars dann aber wie müsste ich das umgestalten damit das rekursiv wird (sich selber aufruft)
Da gibt es einen einfachen Trick, um aus einer Schleife eine rekursive Funktion zu machen. In C ist das zwar nicht unbedingt schlau aber usw...
Wenn du eine Schleife hast,
void f (x) { int i; for (i = 0; i < x; x++) tu_was_mit(i); }
kannst du das auch ohne Schleife, aber dafür mit Rekursion formulieren, indem du die Laufvariablen als Argumente von f() mitnimmst:
void f (x, i) { tu_was_mit(i); if (i < x) f(x, i + 1); }
Abgesehen von dem notwendigen 2. Parameter von f() tun die beiden das gleiche.
So geht's also sicher. Ob das auch das ist, was dein Lehrer sehen will, ist eine andere Frage.
if (c==10) c='A'; if (c==11) c='B'; if (c==12) c='C'; if (c==13) c='D'; if (c==14) c='E'; if (c==15) c='F';
Üblicherweise sagt man stattdessen
c += 'A' - 10;
-
naja myprintf ist ja nun schon so deklariert und darf nicht verändert werden also dürfte ich den laufindex dort nicht in die funktion packen aber trotzdem danke eventuell kann ich das dann ein anderesmal verwenden
-
seb123 schrieb:
naja myprintf ist ja nun schon so deklariert und darf nicht verändert werden also dürfte ich den laufindex dort nicht in die funktion packen aber trotzdem danke eventuell kann ich das dann ein anderesmal verwenden
Macht ja nichts. Mach dir einfach eine rekursive Hilfsfunktion mit den Laufvariablen und ruf die von myprintf auf.
Aber dein Lehrer will wahrscheinlich einen rekursiven Ansatz, den man nicht ohne weiteres als Schleife schreiben kann.