1

Cの「do--while」ステートメントの理解に問題があります。

完全なコードは次のとおりです:http://pastebin.com/uPRvRscd

プログラムは、0から50の範囲の6つの数字を生成します。6つの数字のいずれも繰り返されません。

これはdo-whileループです:

for(c=0;c<BALLS;c++)
{
    /* See if a number has been allready been drawn */
    do
    {
        ball = rand() % RANGE; /* Generate the random ball */
    }
    while(numbers[ball]); /* How is this compare made ? */
    /* Number drawn */
    numbers[ball] = 1; /* What is this for ?!?  */
    printf("%2d ", ball+1); /* add 1 to ball so ball won't be zero */
}
  • 論理比較はどのように機能しますか?

私は、DOがWHILEが真であるか偽であるかによって異なることを知っています。

numbers[ball] = 1;これは何をすることになっていますか?(削除しても結果は同じです)

ありがとうございました

4

3 に答える 3

3

Cには、「ゼロであるものはすべて偽」であり、それ以外はすべて真であるという規則があります。したがって、あなたが書くとき、if(x)それはと同じでif (x != 0)あり、をif(!x)意味しif (x == 0)ます。

for、、whileおよびdo-の同じウィット条件while

したがって、コードは次のようになります。

do
{
    ball = rand() % RANGE; /* Generate the random ball */
}
while(numbers[ball] != 0);

これnumbersは50の配列であり、ゼロで埋められていると思います[静的ストレージ期間の場合、他に何も指定されていなければ、自動的にゼロに設定されます。]

数値が描画されるnumbers[ball] = 1;と、その数値はゼロ以外に設定されるため、同じ数値を再度描画すると、do-whileループが再びループし、別の数値を選択します[乱数ジェネレーターが本当にゴミである場合は、無限ループに変わる]

于 2013-02-12T19:04:30.050 に答える
1
for(c=0; c<50; c++) {
    do {
        ball = rand() % RANGE;
    } while(numbers[ball]);

    numbers[ball] = 1;
    printf("%2d ", ball + 1);
}

次の行を削除すると、メインループnumbers[ball] = 1;の複数の反復でボールが同じ値になる可能性があります。forこれにより、プログラムは以前と同じように50の数値を報告しますが、現在は重複している可能性があります。


whileループの条件については、これら2行は同等です。

1. do { ... } while(numbers[ball]);
2. do { ... } while(numbers[ball] != 0);

より説明的な変数名が使用された場合、これもより良いでしょう。特にnumbers、、はより正確に。としてラベル付けされalready_selected_ballsます。

于 2013-02-12T19:07:35.743 に答える
0

0から9までの数値を生成することを確認してくださいball = rand() % RANGE;(範囲は10です)。最初に数値配列はゼロに初期化され、これまでに数値が描画されていないことを示します。

ここで、ランダムステートメントが数値を選択し(ゼロの場合もあります)、while(numbers[ball])その数値がすでに描画されているかどうかを確認します(0は偽、その他はすべて真)。最初はすべてが0だったので、do-whileループが停止します。numbers[ball] = 1;ボールがすでに使用されていることを示すように設定すると、プログラムが出力されますball+1(ボールは0にすることもでき、ボール番号をゼロにしたくないため)

最初に番号5が選択された(そして6が出力された)と仮定し、今度はrand()再び5を生成すると仮定します。これはwhile(numbers [5]が1)do-whileの条件を満たすでしょう。数字[ボール]がゼロになることによって)

ball+1コードの作成者はボール番号を0にしたくないので、基本的にそのステートメントはオプションです。

于 2013-02-12T19:19:07.673 に答える