2009-04-05 12 views
2

Das Problem, das ich habe, ist, dass, wenn zum Beispiel sagt, dass der Benutzer 7 eintritt, dann zeigt das Display:Printing Fibonacci mit fork()

0 11 2 3 5 8 13 21 child ends. 

Ich kann nicht scheinen, um herauszufinden, wie die 11 zu fixieren und warum Zeigt es so viele Zahlen in der Sequenz an! Kann jemand helfen?

Die Nummer der Sequenz wird in der Befehlszeile angegeben. Wenn beispielsweise 5 bereitgestellt wird, werden die ersten fünf Zahlen in der Fibonacci-Sequenz vom Kindprozess ausgegeben. Da die Eltern- und Kindprozesse eigene Kopien der Daten haben, muss das Kind die Sequenz ausgeben. Veranlassen Sie, dass der übergeordnete Benutzer den Aufruf wait() aufruft, um darauf zu warten, dass der untergeordnete Prozess beendet wird, bevor das Programm beendet wird. Führen Sie die erforderliche Fehlerprüfung durch, um sicherzustellen, dass eine nicht negative Zahl in der Befehlszeile übergeben wird.

#include <stdio.h> 
#include <sys/types.h> 
#include <unistd.h> 

int main() 
{ 
    int a=0, b=1, n=a+b,i,ii; 
    pid_t pid; 

    printf("Enter the number of a Fibonacci Sequence:\n"); 
    scanf("%d", &ii); 

    if (ii < 0) 
     printf("Please enter a non-negative integer!\n"); 
    else 
    { 
     pid = fork(); 
     if (pid == 0) 
     { 
     printf("Child is producing the Fibonacci Sequence...\n"); 
     printf("%d %d",a,b); 
     for (i=0;i<ii;i++) 
     { 
      n=a+b; 
      printf("%d ", n); 
      a=b; 
      b=n; 
     } 
     printf("Child ends\n"); 
     } 
     else 
     { 
     printf("Parent is waiting for child to complete...\n"); 
     wait(NULL); 
     printf("Parent ends\n"); 
     } 
    } 
    return 0; 
} 

Antwort

1

Es scheint mir, wie Ihr Programm ist die Fibonacci-Sequenz korrekt produziert, vielleicht die ersten beiden ‚1‘ Zeichen wie ein ‚11‘ aussehen, weil sie zusammen auf dem Bildschirm zerquetscht werden?

+0

Nein. Ellen fehlt wirklich der weiße Raum zwischen ihnen. Schauen Sie vorsichtig den ersten Druck ... – dmckee

+0

Ja, das ist, was ich dachte, aber alle anderen Elemente der Sequenz sind durch Leerzeichen getrennt, und dann habe ich immer noch das Problem von zu vielen Elementen, 9 Elemente angezeigt, wenn nur 7 angezeigt werden sollte wenn 7 vom Benutzer eingegeben wurde – Ellen

13

Die 11 ist eigentlich zwei 1s ohne Leerzeichen zwischen ihnen. Die erste stammt aus dem zweiten% d hier, weil b den Wert 1:

printf("%d %d",a,b); 

Die zweite von der ersten printf in der Schleife kommt, wo n = 1:

printf("%d ", n); 
+0

Schnelle Finger gewinnt ... – dmckee

7

ohne die Endung Raum hier

printf("%d %d",a,b); 

Sie Schwierigkeiten in das erste Mal

printf("%d ", n); 
tun

Die eleganteste, was man tun könnte, wäre die printfin der Schleife ändern den benötigten Speicherplatz wie dies vorangestellt wird:

printf(" %d", n); 

diese Weise können Sie mit einem hängenden Raum am Ende nicht verlassen sind ...


Sie erhalten "zu viele" Elemente angezeigt, weil Sie die eine in der ersten printf nicht gezählt haben geschrieben ...

0

Take off die printf("%d %d"a b); und lassen Sie die n alle Werte drucken.

Zuerst die erste Variable wie z. B. a = 1 einstellen, dann zweite: b = 0 und dritte c=a+b. Nun zuerst drucken c ohne irgendwelche Änderungen (printf("%d",c);) dann tun a=b; b=c;:

for (i=0; i<ii; i++) 
{ 
    c=a+b; 
    printf("%d ", c); 
    a=b; 
    b=c; 
} 

Auch in Ihrem Programm haben Sie n=a+b zweimal getan, was nicht benötigt wird.

1

Code einige irreführende Ausdrücke hat ......

u den Wert als Tastatureingabe bekommen, nicht als Befehlszeilenargument ... so kann u es wie folgt ändern ...

 main(int argc, char *argv[]) 

und dann kann u den Wert und speichern Sie es als Integer-Wert erhalten ...

 int num = atoi(argv[1]); 

und auch u können, dass Benutzer überprüfen kann den Wert eingeben, indem Sie ...

 if(argc < 2) 
     { 
      printf("You must enter a value to proceed this operation..\n"); 
      return;   
     } 

und wenn Sie dort keine 1 eingeben, wird 0 1 gedruckt, aber die Antwort sollte nur 0 sein; Um dies zu vermeiden, können Sie zwei Bedingungen verwenden, wenn ... if (n == 0) printf ("0"); if (n == 1) printf ("1"); durch Verwendung von zwei oben, wenn Bedingungen können Sie auch Ausgabe 11 zu vermeiden vermeiden.