3

我遇到的问题是,例如当用户输入 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;
}
4

6 回答 6

13

11 实际上是两个 1,它们之间没有空格。第一个来自这里的第二个 %d,因为 b 的值为 1:

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

第二个来自循环中的第一个 printf,其中 n = 1:

printf("%d ", n);
于 2009-04-05T21:02:19.730 回答
7

这里没有结束空格

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

你第一次遇到麻烦

printf("%d ", n);

您可以做的最优雅的事情是更改printf 循环以预先添加所需的空间,如下所示:

printf(" %d", n);

这样你就不会在最后留下一个悬挂空间......


您会显示“太多”元素,因为您没有计算第一个写入的元素printf...

于 2009-04-05T21:05:17.537 回答
1

在我看来,您的程序正在正确生成斐波那契数列,也许前两个“1”字符看起来像“11”,因为它们在您的屏幕上被挤压在一起?

于 2009-04-05T21:00:19.890 回答
1

你的代码有一些误导性的表达......

您将值作为键盘输入,而不是作为命令行参数...所以您可以按如下方式修改它...

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

如果你在那里输入 no 1,它将打印 0 1。但答案应该只有 0;所以为了避免这种情况,你可以使用两个 if 条件...... if(n == 0) printf("0 "); if(n == 1) printf("1"); 通过使用以上两个 if 条件,您也可以避免打印输出 11....

于 2010-03-19T07:55:37.157 回答
1

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

代替

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

于 2018-10-07T07:01:29.530 回答
0

取下printf("%d %d"a b);并让 n 打印所有值。

首先将第一个变量设置为 eg a = 1,然后设置 second:b = 0和 third 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两次,这不是必需的。

于 2009-12-17T11:53:40.373 回答