查看是否已绘制数字

时间:2013-02-12 18:58:49

标签: c arrays random compare do-while

我有一个问题是理解C中的“do - while”语句。

以下是完整的代码:http://pastebin.com/uPRvRscd

该程序生成6个数字,范围从0到50。 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;这应该是做什么的? (如果我删除它,结果是相同的)

谢谢

3 个答案:

答案 0 :(得分:3)

C有一条规则,即“零的任何东西”都是假的,其他一切都是真的。因此,当您撰写if(x)时,它与if (x != 0)相同,if(!x)表示if (x == 0)

forwhiledo - while中相同的机智条件。

所以你的代码确实如此:

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

我假设numbers是一个50的数组,它填充为零[如果它是静态存储持续时间,那么如果没有其他说明,它会自动设置为零。]

当一个数字被绘制时numbers[ball] = 1;将该数字设置为非零,所以如果我们再次绘制相同的数字,do-while循环将再次循环并选择另一个数字[我们希望 - 如果随机数字生成器真的很垃圾,它可能会变成无限循环]

答案 1 :(得分: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个数字,就像之前一样,除了现在, CAN 是重复的。


对于while循环中的条件,这两行是等价的。

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

如果使用更具描述性的变量名称,这也可能更好。特别是,numbers更准确地标记为already_selected_balls

答案 2 :(得分:0)

看到你的ball = rand() % RANGE;生成0到9之间的数字(你的范围是10) 最初数字数组初始化为零,表示到目前为止没有绘制数字。

现在随机语句选择一个数字(也可能是零)然后通过while(numbers[ball])检查是否已经绘制了该数字(0为假,其他一切都为真),最初每个都为0所以do-while循环将停止,我们设置numbers[ball] = 1;表示已经使用了数字球,现在程序打印ball+1(因为球也可以是0,我们不希望球数是零)

假设首先选择了数字5(并且打印了6),现在假设rand()再次生成5,这将满足while(数字[5]为1)do-while再次运行直到找到的条件从未使用的数字(用数字[ball]表示为零)

基本上ball+1语句是可选的,因为代码编写者不希望球号为0