【问题标题】:Sentinel controlled while loops C#哨兵控制的while循环C#
【发布时间】:2013-09-27 17:47:53
【问题描述】:

不是家庭作业..所以我有一个简单的控制台程序来读取考试成绩并打印出平均成绩和成绩。到目前为止,它是以下内容:

public static void Main ()
    {
        int sum = 0;
        int count = 0;
        double average = 0;

        Console.WriteLine ("Enter all your exam scores one by one. When finished, enter -99");

        string scores = Console.ReadLine ();

        while (scores != "-99") {
            sum += int.Parse (scores);
            count++;
            scores = Console.ReadLine ();

        } 
        if (scores == "-99") {
            average = sum / count;
            if (average >= 90)
                Console.WriteLine ("Your average score is {0}. This is good for a letter grade of A", average);
                Console.WriteLine(....more scores etc...);

现在我想用 TryParse 检查无效条目。我想我会在另一个之前坚持另一个while循环并像这样改变原来的循环:

 Console.WriteLine ("Enter all your exam scores one by one. When finished, enter -99");

        string scores = Console.ReadLine ();

          while (int.TryParse(scores, out numbers) == false){
               Console.WriteLine("Please enter a valid integer")
               scores = Console.ReadLine();
               sum += int.Parse(scores);
               count++;

        } 
          while (scores != "-99" && int.TryParse(scores, out numbers) == true) {
            sum += int.Parse (scores);
            count++;
            scores = Console.ReadLine ();

        } 
          if (scores == "-99") {
            average = sum / count;
            if (average >= 90)
                Console.WriteLine ("Your average score is {0}. This is good for a letter grade of A", average); ...etc...

这里的问题是,如果用户先输入有效条目,然后输入无效条目,则编译器无法返回第一个 while 循环来检查无效条目。所以我试图交换 while 循环的位置。但这具有相同的效果;在输入无效条目后,它无法返回第一个 while 循环来检查有效条目。答案很可能很简单,但我被困住了。

【问题讨论】:

    标签: c# while-loop sentinel


    【解决方案1】:

    您遇到的问题是,当TryParse 返回true 时,您从第一个循环中断,但无法重新进入循环。相反,您应该嵌套循环。带有标记的循环应该是外循环,验证和重新提示用户的循环应该是内循环。这是一个例子:

    while(scores != "-99")
    {
        scores = Console.ReadLine();
    
         while((int.TryParse(scores, out numbers) == false)
         {
            //validation failed, re-prompt user for better number
            Console.WriteLine("Bad value, try again")
            scores = Console.ReadLine()
         }
    
         //do stuff here with the valid score value
      }  
    

    【讨论】:

    • 如果用户在第二次尝试输入 -99 时要小心,因为您需要跳出两个循环。我没有在上面的示例中包含如何做到这一点。
    猜你喜欢
    • 2011-01-11
    • 1970-01-01
    • 1970-01-01
    • 2020-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多