斐波那契规划,只要你想在C

mbzjlibv  于 2022-12-22  发布在  其他
关注(0)|答案(2)|浏览(114)

我的要求是:
您将编写一个C文件,其中包含main函数和下面描述的附加函数。您的程序将开始按顺序调用part1和part2。对于每个部分,你将接收用户的输入并将输出打印到控制台。2各部分的细节将在下面进一步讨论。3请注意输出格式。无论执行是否正确,任何与共享格式的偏差都将受到惩罚。编写一个函数,从命令提示符中读取一个整数作为斐波那契数列的项数。如果输入的数字不是正整数值,则程序将打印一条消息,说明不合格的原因。函数将继续执行,直到获得正确的输入。打印与输入的数字一样多的斐波纳奇数列元素。让函数继续工作,直到获得'*'输入。
在这里,当你输入一个正整数到程序中,它应该显示斐波那契数列的元素,如果它输入一个字符串,浮点数,或负数,我应该给一个警告,但程序应该继续,直到 * a被按下。
我为这个程序做了一些事情,但我正在努力保持程序运行。
下面是我代码:

void calculate_fibonacci_sequence()
{
    int eleman;

    printf("Enter how many elements of the fibonacci sequence you want to see : ");

    scanf("%d", & eleman);

    if (eleman <= 0) {
        while (eleman <= 0) {
            printf("Please enter positive term(s) number: a \n");
            scanf("%d", & eleman);
            if (eleman > 0) {
                break;
            }
        }

    }

    if (eleman > 0) {
        printf("\n\n");

        int i, n, e1 = 1, e2 = 1;

        for (i = 1; i <= eleman; i++) {
            printf("        %d\n", e1);
            n = e1 + e2;
            e1 = e2;
            e2 = n;

        }
    }
}
z2acfund

z2acfund1#

最好把你的代码分成几个独立的功能块,首先编写一个函数,读取一行输入,然后解析它:

int read_int(long *number)
{
    char tmp[16];
    if (!fgets(tmp, sizeof tmp, stdin))
        return RETCODE_FAIL;
    
    if (!strcmp(tmp, "*\n"))
        return RETCODE_END;
    
    char *end;
    *number = strtol(tmp, &end, 10);
    
    if (errno == ERANGE)
        return RETCODE_RANGE;
    
    if (end == tmp)
        return RETCODE_EMPTY;
    
    if (*end && *end != '\n')
        return RETCODE_WARN;
    
    return RETCODE_SUCCESS;
}

fgets()从一个给定的文件(在这个例子中,stdin,即默认的键盘)中读取一整行,并带有一点额外的'\n'。如果失败,它返回NULL,所以测试它的返回值是一个好主意。
strtol()将一个字符串解析为long int,第二个参数给出了解析过程的详细信息,因此它用于检查错误。
返回代码按如下方式分组在enum中:

enum RETCODE {
    RETCODE_FAIL = 0,
    RETCODE_END,
    RETCODE_RANGE,
    RETCODE_EMPTY,
    RETCODE_WARN,
    RETCODE_SUCCESS
};

接下来,编写斐波那契算法:

void print_fibonacci(long n)
{
    long e0, e1 = 0, e2 = 1;
    for (long i = 0; i < n; i++) {
        e0 = e1;
        e1 = e2;
        e2 = e0 + e1;
        printf("%ld ", e2);
    }
    printf("\n");
}

现在,您的main()将非常简单:

int main(void)
{
    for (;;) {
        printf("Enter a number: ");
        long number = -1;
        
        switch (read_int(&number)) {
        case RETCODE_FAIL:
            puts("Internal error");
            break;
        case RETCODE_END:
            puts("Goodbye!");
            return 0;
        case RETCODE_RANGE:
            puts("Number is either too small or too big");
            break;
        case RETCODE_EMPTY:
            puts("<empty>");
            break;
        case RETCODE_WARN:
            puts("Invalid integer format");
            break;
        case RETCODE_SUCCESS:
            number < 0 ? puts("Number must be positive") : print_fibonacci(number);
            break;
        default:
            // This should never run
            break;
        }
    }
}

学分(&也很好看):A Beginners' Guide Away From scanf()

suzh9iv8

suzh9iv82#

正在更新您的代码!!!
你一次又一次地使用了很多的if else条件,这使得代码很糟糕。我只是通过do while loop优化了它。
关键是你在打印消息后在你的for循环中执行迭代,所以它在第二次迭代时保留值1。
这里是你的代码的修订版本.........

#include <stdio.h> 
 void calculate_fibonacci_sequence()
  {

   int eleman;

  do
   {
    printf("Enter how many elements of the fibonacci sequence you want to see : ");
    scanf("%d", &eleman);
    } while (eleman < 0);

     printf("\n");

    int i, n, e1 = 1, e2 = 1;
   for (i = 1; i <= eleman; i++)
    {
    n = e1 + e2;
    e1 = e2;
    e2 = n;
      printf("%d\n", e1);
    }
}

int main()
{
calculate_fibonacci_sequence();
return 0;
}

相关问题