我怎么能把这个goto转换成do while循环?

时间:2015-01-04 02:43:04

标签: c# loops while-loop

class Program
{
    static void Main(string[] args)
    {
        string choice = string.Empty;
        do
        {
        start:
            int output = 0;
            int number = 0;
            Console.WriteLine("Please input a number for it to be counted!");
            bool conversion = int.TryParse(Console.ReadLine(), out output);

            if (number < 1000)
            {
                switch (conversion)
                {
                    case true:
                        while (number <= output)
                        {
                            Console.Write(number + " ");
                            number += 2;
                        }
                        break;
                    case false:
                        Console.WriteLine("ERROR: INVALID INPUT!");
                        goto start;
                }
            }
            else
            {
                Console.WriteLine("APPLICATION ERROR: NUMBER MUST BE BELOW OR AT 1000 TO PREVENT OVERFLOW!");
                return;
            }

            do // Here is the beginning of the do code
            {
                Console.WriteLine("\n Do you want to continue - Yes or No");
                choice = Console.ReadLine();
                if (choice.ToUpper() != "YES" && choice.ToUpper() != "NO")
                {
                    Console.WriteLine("ERROR INVALID INPUT: Only input Yes or No!");
                }

            } while (choice.ToUpper() != "YES" && choice.ToUpper() != "NO");
        } while (choice.ToUpper() == "YES");
    }
}

我在这个陈述中使用了几个do while循环,但是我试着如何放入循环&#34; ERROR INVALID INPUT:&#34;当用户输入除指定整数的限制之外的任何内容(即输入小数或分数)或者如果它们放入字符串时的结果。我只是使用了goto,因为我无法找到do while循环语句的位置。如果有人可以简单地告诉我如何用do while循环替换那个goto,那么我会非常感激。 (请注意,如果你向我展示了我可以更好地优化代码的方法,因为我还是新手,我可能不会理解它,但欢迎你给它最好的镜头!)

2 个答案:

答案 0 :(得分:1)

简答:

关键字continue表示返回循环的开头。请注意,这将重新检查循环条件,如果为false则会中断。此外,大多数人发现do-while循环不太可读(并且它们确实很少需要),因此请尝试使用while循环。

还有关键字break,它只会退出循环。 (不只是用于开关盒!)

更具可读性的版本如下所示:

string userAnswer = "yes";

// while is usually more readable than do-while
while (userAnswer == "yes")
{
    Console.WriteLine("Please input a number for it to be counted!");
    int number;

    // Ask for new input until the user inputs a valid number
    while (!int.TryParse(Console.ReadLine(), out number))
    {
        Console.WriteLine("Invalid number, try again");
    }

    if (number < 1000)
    {
        // Print from 0 to number, jumping in 2's
        for (int i = 0; i <= number; i += 2)
            Console.WriteLine(i + " ");
    }
    else
    {
        Console.WriteLine("APPLICATION ERROR: NUMBER MUST BE BELOW OR AT 1000 TO PREVENT OVERFLOW!");
        continue; // Jump back to the start of this loop
    }

    Console.WriteLine("Continue? (Yes / No)");
    userAnswer = Console.ReadLine().ToLower();

    // Ask for new input until the user inputs "Yes" or "No"
    while (userAnswer != "yes" && userAnswer != "no")
    {
        Console.WriteLine("Invalid input. Continue? (Yes / No)");
        userAnswer = Console.ReadLine().ToLower();
    }
}

答案 1 :(得分:0)

嘿,我会发布一些可能有用并提供一些建议的代码。基本上声明一个名为&#39; loopCompleted&#39;这将继续执行do while循环,直到您将其设置为true。缺点是它不会像return / goto / etc那样立即退出循环,但在大多数情况下这不是问题。

你可能想要使用if / else而不是switch(转换),它看起来有点有趣,但有点超过顶部:)

如果Int.TryParse()没有为小数值返回false(例如[15.08]则返回[true]和[15])。然后你可以在使用TryParse之前存储Console.ReadLine(),然后使用stringName.Contains()来检查&#39;。&#39;基本上,如果转换成功,您还要检查它是否包含小数点。

另一种检查方法是执行float.TryParse()然后检查它是否是小数值。

bool fraction = false;
if( number % 1.0f > 0)
    fraction == true;

%称为模数,它返回A / B的余数 如果数字除以1时有余数,则必须是小数值。

    //start:
    bool loopCompleted = false;
    do
    {
        int output = 0;
        int number = 0;
        Console.WriteLine("Please input a number for it to be counted!");
        bool conversion = int.TryParse(Console.ReadLine(), out output);

        if (conversion && number < 1000)
        {
            while (number <= output)
            {
                 Console.Write(number + " ");
                 number += 2;
            }
            loopCompleted = true;
        }
        else
        {
            if(conversion == false)
            {
                 Console.WriteLine("ERROR: INVALID INPUT!");
            }
            else
            {
                 Console.WriteLine("APPLICATION ERROR: NUMBER MUST BE BELOW OR AT 1000 TO PREVENT OVERFLOW!");
            }
        }
   } while(!loopCompleted)