2009-04-05 12 views
2

私が午前問題は、例えば言うとき、ユーザは、ディスプレイを示し、7入るということです。印刷フィボナッチ()

0 11 2 3 5 8 13 21 child ends. 

私は修正する方法を見つけ出すように見えることはできません11及び理由それはシーケンスの中に多くの数字を表示しています!誰も助けることができますか?

シーケンス番号はコマンドラインで提供されます。たとえば、5を指定すると、フィボナッチシーケンスの最初の5つの数字が子プロセスによって出力されます。親プロセスと子プロセスはそれぞれ独自のデータ・コピーを持っているため、子プロセスはシーケンスを出力する必要があります。プログラムを終了する前に子プロセスが完了するのを待つために、親プロセスにwait()呼び出しを呼び出させるようにしてください。必要なエラーチェックを実行して、非負の数値がコマンド行に確実に渡されるようにします。彼らはあなたの画面上で一緒に押しつぶされているので

#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; 
} 

答えて

1

プログラムが正しくフィボナッチ数列を生産しているようですが、私には見えますが、多分最初の2つの「1」の文字が「11」のように見えますか?

+0

いいえ。エレンは本当にそれらの間の空白を逃しています。最初のprintfを注意深く見てください... – dmckee

+0

私は考えましたが、シーケンスの他のすべての要素はスペースで区切られていますが、それでもまだ要素が多すぎるという問題があります。ユーザーによって7が入力された場合 – Ellen

13

実際には11は2つの1であり、それらの間にスペースはありません。 Bの値が1であるため、最初は、ここでは第%dから来る:

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

第二ループ内の最初のprintf、N = 1から来ている:終了スペースなし

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

速い指が勝つ... – dmckee

7

ここ

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

あなたは

printf("%d ", n); 
を行うトラブルに最初の時間を取得します

printf(" %d", n); 

あなたが最後にぶら下げスペースが残っていないその方法:あなたができる

最もエレガントな事は、このような必要なスペースを付加するループでprintfを変更することであろうあなたが最初printfで書かれたものを数えていないので...


あなたが

0

脱いで...表示されている「あまりに多くの」の要素を取得しますprintf("%d %d"a b);とnがすべての値を出力するようにします。

最初に、最初の変数をa = 1に設定してから、2番目の変数をb = 0と3番目のc=a+bに設定します。さてa=b; b=c;を行うすべての変更(printf("%d",c);)なしの最初の印刷c:、あなたのプログラムの中で、あなたが必要とされていない、二回n=a+bをまた

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

やりました。あなたのコードは、uは、キーボード入力などではなく、コマンドライン引数として値を取得している......

をいくつかの誤解を招く表現があり

1

... 次のようにuはそれを変更することができます...

 main(int argc, char *argv[]) 

、その後uが値を取得し、整数値として保存することができます...

 int num = atoi(argv[1]); 

ともuが使用して値を入力して、そのユーザーを確認することができます...

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

と入力すると、そこに1を入力しないと0が出力されますが、答えは0になります。 これを避けるために、もし条件が2つあれば... if(n == 0) printf( "0"); if(n == 1) printf( "1"); 上記の2つの条件を使用すると、出力11も同様に回避できます。