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

あなたがしたいとき:

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

あなたは1文字しか読んでいないので。

于 2013-03-17T08:04:43.333 に答える
1

2回目に値を初期化しませんでした。

次のコードの後:

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

あなたはまだwhile(stayAlive)ループにいます。

したがって、合計などを初期化する必要があります。if(c =='y' || c =='Y')ステートメントの後

于 2013-03-17T08:07:06.247 に答える
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は1バイトしか格納できません。ここで、sizeof "Y"およびsizeof "y"は、これら2つの文字列に2バイトが必要であることを示しています。おそらく、 2番目のバイトstrlenが必要な理由を理解できるように、独自の標準準拠を最初から作成することをお勧めします。

または、マニュアルを注意深く読むことを検討してください。

于 2013-03-17T08:50:50.810 に答える
-1

プログラムを再開する必要がある場合は、main()関数を呼び出すことができます。

例:

if (condition) { main();)}

于 2013-03-17T08:46:07.493 に答える