0

Cでプログラミングする方法を学ぼうとしていて、簡単な修正であるはずの問題に遭遇しましたが、予想以上に多くの問題が発生しています。数字を推測するチャンスが3回ある数字推測ゲームを作成しようとしていますが、私の問題は、正しい答えが推測されたときにDoWhileループが壊れないことです。関数は次のとおりです。

void Win_Search(int lucky[],const int MAX, int user_entry, int i)
{
    int j=0;

    do {
        j++;
        printf("Please enter a number between 0 and 100\n");
        scanf("%d",&user_entry);

        for(i = 0; i < MAX; i++)
        {
            if(user_entry==lucky[i])
            {
                printf("winner\n");
            }
        }
    } while(user_entry==lucky[i]||j<3);

}

基本的には、配列lucky [i]をループして、user_entryが配列内の20個の数値のいずれかに等しいかどうかを確認することになっています。現在のところ、ループスルーし、配列から当選番号が選択されているかどうかを認識しますが、配列から外れることはありません。

に変更すると

}while(user_entry!=lucky[i]||j<3);  

カウンターを完全に無視し、永久にループします。

私が読んだすべてのことはそれが貧弱なプログラミング慣行であると話しているので、私はブレークを使いたくありません。壊す別の方法がありますか、または単にこの問題を引き起こしている間違いを犯しただけですか?

前もって感謝します。

4

4 に答える 4

3

インデックス変数「i」がどこから来るかを少し考えてください。正しいユーザー エントリを見つけた後、それはどうなりますか? 制御フローはどこに行きますか?

「break」キーワードを見てみることをお勧めします。

于 2012-10-23T22:37:49.467 に答える
2

あなたが書いたものはwhile (user_entry == lucky[i]..)に翻訳されas long as user_entry is equal to lucky[i] keep on loopingます。これは明らかにあなたが意図していることではありません。

あなたの状態をに変えれ} while (user_entry != lucky[i] && j < 3);ば、あなたは元気になるはずです。これは平易な英語で に翻訳されas long as user_entry is different of lucky[i] AND j is inferior to 3, keep loopingます。

しかし、これを使用すると、 if が何の意味もないlucky[i]場合でもの値をテストしますi( i が max に等しい場合、テストしたくありません。これは未定義の動作のドメインに入ります)。

しかし、本当にbreakキーワードを使用したくない場合、1 つの解決策はフラグを使用することです。ループを開始する前に 1 に設定し、適切な答えが見つかったら 0 に変更します。あなたのコードは

void Win_Search(int lucky[],const int MAX, int user_entry, int i)
{
    int j=0;
    char flag = 1;

    do {
        j++;
        printf("Please enter a number between 0 and 100\n");
        scanf("%d",&user_entry);

        for(i = 0; i < MAX; i++)
        {
            if(user_entry==lucky[i])
            {
                printf("winner\n");
                flag = 0;
            }
        }
    } while(flag&&j<3);

}
于 2012-10-23T22:38:38.733 に答える
0

唯一の独立した条件は、ユーザーがより多くの推測を残していることです。しばらくしてみてください」

while(j <= 3);

は明らかなはずですが、ループの前にjをインクリメントするため、equalsはそこに属します。

j =1=>最初の推測

j = 2=>2番目の推測

j = 3=>3番目の推測

その後、ユーザーはそれ以上推測する必要はありません

これが機能しないことがわかるはずです。これは、ユーザーが正しく推測した場合にループを終了するためです。これを行うには、intをboolとして使用できます(0-false、1-yes)。

void Win_Search(int lucky[],const int MAX, int user_entry, int i)
{
    int j=0;
    int exitCase = 0;
    do {
        j++;
        printf("Please enter a number between 0 and 100\n");
        scanf("%d",&user_entry);

        for(i = 0; i < MAX; i++)
        {
            if(user_entry==lucky[i])
            {
                exitCase = 1;
                printf("winner\n");
            }
        }
    } while(exitCase == 0 || j <= 3);

}
于 2012-10-23T22:55:38.497 に答える
0

}while(user_entry!=lucky[i]||j<3);

それは悪い論理です-ユーザーのエントリがラッキーナンバーではないか、jが3未満のときにループしますか?確かにあなたは実際にこれが欲しいです:

}while(user_entry!=lucky[i]&&j<3);

これは、カウンターを無視するという2番目の問題の解決策にすぎません。主な問題は他の回答で解決されます。

于 2012-10-23T22:36:32.053 に答える