简单的C#程序似乎无缘无故地跳过代码

时间:2016-06-06 11:47:55

标签: c#

我今天早上参加了A-Level AQA计算考试,当我的代码因为一个未知原因而没有运行代码行时,其中一个编程问题让我很困惑。我尝试在家里重新创建它,看看它是否因某种原因是一次性错误,但它会产生同样奇怪的结果。

问题是要求使用一些给定的伪代码编写程序,这就像我记得的那样接近。该计划的目的是取一个两位数的数字; 1)添加两位数,然后添加结果的两位数字,直到只剩下一位数字 要么 2)将两位数相乘,并保持这样,直到只剩下一位数字。我不记得这个过程的名称,但你明白了。 (例如77-> 7 + 7 = 14,1 + 4 = 5.答案是5转2转/周期。)

这是代码;

class Program
{
    static void Main(string[] args)
    {
        int count = 0;
        int value;
        string mode;
        Console.WriteLine("Please enter a value: ");
        value = Console.Read();
        Console.WriteLine("Please enter the mode (a or m): ");
        mode = Console.ReadLine();
        while (value > 9)
        {
            if (mode == "a")
            {
                value = (value / 10) + (value % 10);
            }
            else
            {
                value = (value / 10) * (value % 10);
            }
            count += 1;
        }
        Console.WriteLine("After " + count + " turns, the value is " + value);
    }
}

所以看起来很好,但是当我以45的测试值运行它时,这就是输出;

Please enter a value:
45
Please enter the mode (a or m):
After 2 turns, the value is 0

这一切都在没有让用户进入模式的情况下发生。

起初看起来代码是在分配值大于9之后直接跳转到while循环。虽然这让我感到困惑,但我尝试通过将用户输入分配给不同的值(tempvalue)进行修复,并且然后在选择模式后将其分配给值。然而同样的事情发生了。

我觉得这个解决方案会变得非常简单并且是一个我没有发现的愚蠢错误,但我无法在任何地方找到任何错误或可能的原因。

这让我疯了!任何帮助表示赞赏。

谢谢:)

免责声明:这不是我试图欺骗我的考试,考试已经结束,所有工作都在进行,所以这是不可能的。我真的很好奇我为此做错了什么,并且有兴趣知道解决方案。

3 个答案:

答案 0 :(得分:6)

您使用Console.Read代替ReadLineRead仅读取单个字符,直到下一个换行符为止(ReadLine为止)。因此,在输入45↵时,您返回的内容仅为4,下一次调用ReadLine将获得5

更重要的是,value将是字符4的Unicode代码点,即52。所以您应该将该行更改为

value = int.Parse(Console.ReadLine());

然后解决这两个问题(或者根据需要添加错误处理)。

答案 1 :(得分:2)

Console.Read()读取一个字符'4'然后继续。 Console.ReadLine()读取该行的其余部分,即“5”。

因此,如果您将.Read()更改为.ReadLine(),这将有所帮助。

答案 2 :(得分:2)

您的问题是Console.Read()只能读取一个字符(如果有)。 Console.ReadLine()等待 Enter 键(或\n)。

因此,如果您输入45结束点击输入,则4会存储在value中,而5会被写入mode没有进一步等待用户。

所以也要将Console.Read()更改为Console.ReadLine()。这应该可以解决你的问题。

Console.ReadLine()会返回string。您需要将其转换为int,例如:

int value;
string input = Console.ReadLine();
if (!int.TryParse(input, out value) || value < 10 || value > 99)
{
   Console.WriteLine("This was not a two digit number!");
   return;
}