Печать Фибоначчи с вилкой () - PullRequest
2 голосов
/ 06 апреля 2009

У меня проблема в том, что когда, например, пользователь вводит 7, на дисплее отображается:

0 11 2 3 5 8 13 21 child ends.

Я не могу понять, как исправить число 11 и почему оно отображает столько чисел в последовательности! Кто-нибудь может помочь?

Номер последовательности будет указан в командной строке. Например, если указано 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;
}

Ответы [ 6 ]

13 голосов
/ 06 апреля 2009

11 - это на самом деле две единицы без пробелов между ними. Первое происходит от второго% d здесь, потому что значение b равно 1:

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

Второе происходит от первого printf в цикле, где n = 1:

printf("%d ", n);
7 голосов
/ 06 апреля 2009

Без пробела здесь

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

вы попадаете в беду в первый раз

printf("%d ", n);

Самая изящная вещь, которую вы могли бы сделать, - это изменить printf в цикле , чтобы добавить необходимое пространство следующим образом:

printf(" %d", n);

Таким образом, вы не останетесь со свободным местом в конце ...


Отображается «слишком много» элементов, поскольку вы не учли тот, который был написан в первом printf ...

1 голос
/ 07 октября 2018

запись

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

вместо

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

1 голос
/ 19 марта 2010

в вашем коде есть некоторые вводящие в заблуждение выражения ......

вы получаете значение как ввод с клавиатуры, а не как аргумент командной строки ... так что вы можете изменить его следующим образом ...

        main(int argc, char *argv[])

и тогда вы можете получить значение и сохранить его как целочисленное значение ...

        int num = atoi(argv[1]);

и вы также можете проверить, что пользователь может ввести значение, используя ...

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

и если вы введете там нет 1, он выведет 0 1. но ответ должен быть только 0; так что, чтобы избежать этого, вы можете использовать два условия ... если (n == 0) printf ("0"); если (n == 1) printf ("1"); используя вышеупомянутые два условия, если вы можете избежать вывода 11, а также ...

1 голос
/ 06 апреля 2009

Мне кажется, что ваша программа правильно генерирует последовательность Фибоначчи, может быть, первые два символа '1' выглядят как '11', потому что они сжаты вместе на вашем экране?

0 голосов
/ 17 декабря 2009

Снимите printf("%d %d"a b); и дайте n распечатать все значения.

Сначала установите первую переменную как, например, a = 1, затем установите вторую: b = 0 и третью c=a+b. Теперь сначала напечатайте c без изменений (printf("%d",c);), затем выполните a=b; b=c;:

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

Кроме того, в вашей программе вы сделали n=a+b дважды, что не требуется.

...