0

我正在尝试制作一个程序,该程序允许用户发现斐波那契数列中偶数项的总和,直至任意用户定义的长度。我这样做是为了让用户有机会在他们选择时进行新的计算。我正在使用布尔逻辑和 while 循环来实现某种程序重启。

该程序第一次执行良好。但是,在每个后续用户输入中,先前的答案都会影响当前的答案。我试图在 while 循环开始时将我的变量重新初始化为它们的初始值(i = 1、j = 2、k = 0 和 sum = 0),但它仍然没有给我想要的结果。谢谢您的帮助。

#include <stdio.h>
#include <stdbool.h>
#include <string.h>

int main()
{
    bool stayAlive = true; 
    long int sum = 0; //The sum of all even Fibonacci numbers
    long int i = 1; //initial 1st value of the Fibonacci sequence
    long int j = 2; //initial 2nd value of the Fibonacci sequence
    long int k = 0; //initial 3rd value of the Fibonacci sequence
    int x = 0;
    char name[50];
    printf("Hello, may I have your name?\n\n");
    scanf("%s", &name);
    putchar('\n');
    while(stayAlive)
    {
        printf("Hello %s! This program will sum up all of the evenly valued terms from\nthe Fibonacci sequence, up until an upper limit term specified by the user.\n",name);
        printf("Set this limit: "); 
        scanf("%d",&x); 
        putchar('\n');
        char c;
        while(k < x)//WHILE the "last term" is LESS than the "max term"
        {   
                        i ==1;
                        j ==2;
                        k ==0;
                        sum ==0;
            k = i + j;
            if(k%2==0)
                sum +=k;
            i = j;
            j = k;
        }

        printf("The sum of all of the evenly valued terms of the Fibonacci sequence up until\nthe value %d is %d.",x,sum); puts("\n");
        printf("Try another calculation? (Y/N) ");
        scanf("%s", &c);
        if(c == 'y'|| c == 'Y')
            continue;
        else
            printf("\nThanks for using this program, %s!",name);//This name character is not outputting here, even though it outputs earlier
            getchar();
            break;
    }



    return 0;
}
4

4 回答 4

1

您如何从本网站吸收信息?通过阅读...如果您必须为此向我们寻求帮助,那么您当前的阅读方法显然行不通。你在看哪本书?

我认为您的程序应该看起来像这样,其他人可能会同意:

#include <assert.h>
#include <stdio.h>
#include <stdbool.h>
#include <string.h>

int main() {
    char name[50];
    int c;

    puts("Hello, may I have your name?");
    assert(scanf("%49s", &name) == 1);

    do {
        unsigned int upper_limit = 0, x = 1, y = 2, sum = 0;

        printf("Hello %s! This program will sum up all of the evenly valued terms "
               "the Fibonacci sequence, up until an upper limit term specified by "
               "the user.\n", name);
        puts("Set this limit:"); 
        assert(scanf("%u",&upper_limit) == 1);

        while (x < upper_limit) {
            if (x % 2 == 0) { sum += x; }
            x += y;

            if (y >= upper_limit) { break; }
            if (y % 2 == 0) { sum += y; }
            y += x;
        }

        printf("The sum of all of the evenly valued terms of the Fibonacci "
               "sequence up until the value %u is %u.\n", upper_limit, sum);
        puts("Try another calculation? (Y/N)");
        c = getchar();
    } while (c == 'Y' || c == 'y');

    printf("Thanks for using this program, %s!\n", name); //This name character IS outputting here, because '\n' goes at the end ;)
    getchar();
}

您会注意到许多变量位于更本地以供其使用。这是因为它们不需要在该循环之外声明;这些变量仅在该循环中使用,因此应在此处声明它们。您如何将我的循环转换为for循环?暗示:for (int c = 'Y'; c == 'Y' || c == 'y'; c = /* TODO */)

您还会注意到assert宏的使用。做一些研究,找出这个宏的用途并用更合适的东西替换它,以确保 scanf 正确读取和转换输入可能是值得的。不要只是忽略返回值当然也不要像我在这个例子中所做的那样将副作用放入断言中

在一个地方我用过getchar你用过的地方scanf。这是因为:

  1. scanf返回值被忽略,在这种情况下的失败机制没有忽略。也许从头开始编写自己的标准兼容是一个好主意fscanf,这样您就可以理解返回值代表什么以及为什么它们应该被忽略。
  2. 提供的指针scanf不适合存储包含“Y”或“y”的字符串;那char只能存储一个字节,其中sizeof "Y"sizeof "y"表示这两个字符串需要两个字节。strlen也许从头开始编写自己的标准兼容是个好主意,这样您就可以理解为什么需要第二个字节

或者,考虑仔细阅读手册

于 2013-03-17T08:50:50.810 回答
1

当您想要:

在 while 循环开始时将我的变量重新初始化为其初始值(i = 1、j = 2、k = 0 和 sum = 0)

放 :

sum = 0; 
i = 1; 
j = 2; 
k = 0;

while循环内。

同时删除这些行:

i ==1;
j ==2;
k ==0;
sum ==0;

另外,您可以使用 %c 代替:

scanf("%c", &c);

由于您只阅读一个字符。

于 2013-03-17T08:04:43.333 回答
1

您没有第二次初始化这些值。

在以下代码之后:

if(c == 'y'|| c == 'Y')
        continue;

您仍处于 while(stayAlive) 循环中。

所以你应该初始化你的总和等。在 if(c == 'y'|| c == 'Y') 语句之后

于 2013-03-17T08:07:06.247 回答
-1

当您需要重新启动程序时,您可以调用 main() 函数。

例子:

if (condition) { main();)}

于 2013-03-17T08:46:07.493 回答