需要帮助理解循环

时间:2011-02-15 19:39:42

标签: c#

好的我想要做的事情似乎相当简单,但它并没有按照我想要的方式工作。我知道我只是没有得到什么。本质上我试图读取控制台输入,将其分配给变量。然后我想检查该变量以查看它是否是有效数字。如果不是,我想告诉用户它无效并重新开始循环,直到我得到一个有效的数字,然后退出。这是我的代码,请你帮我理解我做错了什么?

    const int AVERAGE_IQ = 100;
    int userIQ;
    bool done = false;

    do
    {
        Console.Write("Please enter an IQ Score between 1 and 200: ");
        userIQ = Convert.ToInt32(Console.ReadLine());

        if (userIQ == 0 || userIQ >= 200)
        {
            Console.WriteLine("You have entered an invalid IQ Score, please try again.");
            done = false;
        }
        else if (userIQ >= AVERAGE_IQ)
        {
            Console.WriteLine("{0} is an above average IQ.", userIQ);
            done = true;
            break;
        }
        else if (userIQ <= AVERAGE_IQ)
        {
            Console.WriteLine("{0} is an below average IQ.", userIQ);
            done = true;
            break;
        }
        else if (userIQ == AVERAGE_IQ)
        {
            Console.WriteLine("{0} is anaverage IQ.", userIQ);
            done = true;
            break;
        }

    } while (done =! true);

8 个答案:

答案 0 :(得分:16)

=!应为!=

您正在执行任务,设置为false。从那以后:

while (done =! true);while (done = !true);相同,与while (done = false);

相同

在每次迭代中,您将done指定为false,它本身的计算结果为false,这意味着您的循环将永远不会再次迭代。

将循环表达式更改为while (done != true);或更好while (!done);

答案 1 :(得分:6)

错误在最后一行:

while (done =! true);

您正在做的是分配done !true false,因此无论done执行此语句之前的值是什么,它都将转为{{1}并且循环将退出。

你真正想要的是:

false

此外,当您使用while (!done); 突破循环时,您可以删除使用break变量的每一行,只需使用此行而不会出现任何问题:

done

答案 2 :(得分:4)

done =! true应更改为done != true

答案 3 :(得分:3)

正如xanatos所说。但是,你的休息与完成标志有一个风格问题。 break的替代方法是保持done标志 - 并删除break语句。你的时间会变成一样(!完成);

答案 4 :(得分:2)

  1. 检查IQ < 0

  2. >=更改为>,将<=更改为<

  3. 删除所有done并将while更改为while (true)

答案 5 :(得分:0)

一些注意事项:

  1. else if (userIQ >= AVERAGE_IQ)更改为else if (userIQ > AVERAGE_IQ)因为您拥有最后一个“如果他们是平等的”
  2. 由于您使用break;退出循环,因此您无需设置done=true

答案 6 :(得分:0)

“你不按我想要的方式工作”是什么意思?是不是正确地提示用户输入?是否显示错误信息?它是否会抛出异常?

乍一看,我已经看到了一个错误。您检查&gt; = AVERAGE_IQ然后&lt; = AVERAGE_IQ然后== AVERAGE_IQ。如果用户输入AVERAGE_IQ,则第一个条件会命中,并且它会说它高于平均IQ。 &gt; =和&lt; =应该是&gt;和&lt;代替。

此外,由于您正在破坏,因此完成标志是多余的。如果您打算使用休息时间,也可以使用while(true)循环。

另一方面,您没有正确处理负输入。它还应显示超出范围的错误消息。

编辑:正如许多其他人所指出的那样,“=!”和“!=”不一样。

答案 7 :(得分:0)

循环用于处理让用户输入正确的输入。评估该输入超出适当范围应该移动到其他地方。

如果您将代码重构为类似的内容,则更清楚您要执行的操作。

int minIQ = 1;
int maxIQ = 200;
do
{
    Console.Write("Please enter an IQ Score between " + minIQ + " and " + maxIQ + ": ");
    userIQ = Convert.ToInt32(Console.ReadLine());
} while (userIQ >= minIQ && userIQ <= maxIQ);

//Test userIQ and output here.