0

モンティ ホール問題をシミュレートするコマンド ライン C プログラムを作成していますが、コードの特定のセクションで問題が発生しています。このプログラムでは、ユーザーが開きたいドアの番号を入力するように単にプロンプ​​トが表示され、入力が取得されます。そして、それが有効であることを確認します:

printf("Please enter the door you would like to choose! (Door 1, 2 or 3)\n\nDoor ");

char init_input[255];

int selection;
int valid_input = 0;
while(valid_input == 0)
{   
    gets(init_input);
    int len = strlen(init_input);
    while(len != 1)
    {
        printf("Please choose either door 1, 2 or 3\n\n");
        printf("Door ");
        gets(init_input);
        len = strlen(init_input);
    }
    int valid_input = 0;
    char input = init_input[0];
    switch(input)
    {
        case('1'):
        {
            selection = 1;
            valid_input = 1;
            printf("Door 1\n");
            break;
        }
        case('2'):
        {
            selection = 2;
            valid_input = 1;
            printf("Door 2\n");
            break;

        }
        case('3'):
        {
            selection = 3;
            valid_input = 1;
            printf("Door 3\n");
            break;


        }
        default:
        {
            printf("\nPlease choose either door 1, 2 or 3\n\nDoor ");
            break;
        }
    }
}

printf("\nYou chose Door %d, now I will reveal one of the doors that has a goat behind it:\n\n", selection);

有効なドア番号 (1、2、または 3) のいずれかを入力するまで、プログラムは正常に動作します。クラッシュはしませんが、while ループの後に目的の出力を出力せず、プログラムを続行します。ただし、有効な番号を入力すると、選択したドアの名前が出力されます。これは、switch ステートメントとは関係がないことを示唆しています。

4

2 に答える 2

3

ループスコープvalid_input内からシャドウイングしています:while

int valid_input = 0;
while (valid_input == 0) {
    // ...
    int valid_input = 0;     // remove this
}

ループ内で書き込みまたは読み取りを行う場合valid_input、ループの外側ではなく、ループ内で宣言されたものから読み取ります。したがって、valid_inputループは実際には変更されないかどうかをチェックします。

于 2012-07-14T06:38:20.623 に答える
1

プログラミングをしたいのなら、絶対に積極的にデバッガーの使い方を学ばなければなりません。最近のほとんどのコンパイラには、かなり優れたものがあります。コードをステップ実行します。どこが間違っているかを判断できるはずです。また、コードについて他にもいくつかの予期しないことを学ぶ場合があります。

有効なドア番号を入力してもループが終了しない理由がすぐにはわかりません。しかし、繰り返しになりますが、正確にどこを見ればよいか 100% 確信があるわけではありません。

(ところで、私は「モンティ ホール問題」のテスト プログラムを作成しました。それは本当であり、その理由は次のとおりです。ドアの 1 つを明らかにすることによって、選択しなかったドアに関する追加情報が提供されます。ただし、それらは決して明らかにしないためです。最初に選択したドアを選択した場合、そのドアについて何も学習しません。切り替えることで、勝率が 1/3 ではなく 1/2 になります。)

于 2012-07-14T06:31:45.430 に答える