输入错误的值。转到开始;

时间:2016-09-13 05:56:16

标签: c#

编辑。 根据收到的答案,我意识到在我的学习的早期阶段,我的要求比我所知的要多,因此,我决定忘记这个问题,直到我学会了解并了解更多。我不想超越并迷惑自己。

只是一个寻找指导的新手。

从我在这里问过的上一个问题,我被介绍到goto Start;在switch语句中。

我开始使用它,它让我觉得我希望程序在用户输入无效输入的情况下开始。例如,在我的下面的计算器中,如果用户输入的数字不是数字,我如何让程序忽略输入并再次提示用户输入数字?甚至可能显示"无效输入。请再试一次#34;给用户。

现在,如果输入任何数字,控制台崩溃并抛出错误。

预先感谢您的协助

      int num1, num2, output;
        string  op;

        Console.Write("\n\n");
        Console.WriteLine("Calculator\n");
        Console.WriteLine("=============");
        Console.Write("\n\n");

        Start:

        Console.Write("Please enter first number:");
        num1 = Convert.ToInt32(Console.ReadLine());


        Console.Write("Please enter second number: ");
        num2 = Convert.ToInt32(Console.ReadLine());

        Operator:

        Console.WriteLine("Please select operator: ");
        Console.WriteLine("\nAddition : +");
        Console.WriteLine("Multiplication: *");
        Console.WriteLine("Division: /");
        Console.WriteLine("Subtraction: -");
        Console.Write("Enter Operator: ");
        op = Console.ReadLine();




        switch (op)
        {
            case "+":
                output = num1 + num2;
                Console.WriteLine("{0} added to {1} = {2}", num1, num2, output);
                break;

            case "*":
                output = num1 * num2;
                Console.WriteLine("{0} multiplied by {1} = {2}", num1, num2, output);
                break;

            case "/":
                if (num2 == 0)
                {
                    Console.WriteLine("Cannot divide by zero. Please try again");
                    goto Start;

                }
                else
                {
                    output = num1 / num2;
                    Console.WriteLine("{0} divided by {1} = {2}", num1, num2, output);
                    break;
                }

            case "-":
                output = num1 - num2;
                Console.WriteLine("{0} minus{1} = {2}", num1, num2, output);
                break;

            default:
                Console.WriteLine("You entered an invalid operator. Please try again\n");
                goto Operator;                     

         }

       Console.WriteLine("\nPress enter to continue....");
       Console.ReadLine();

6 个答案:

答案 0 :(得分:3)

请不管你做什么,都要使用goto。永远。可能除了在switch中落到其他case之外,但即使这样也应该非常罕见。它使您的代码难以理解,令人困惑且难以维护。请参阅spaghetti code

也就是说,如果您不确定输入是否有效,则应该Int32.TryParse而不是Convert

int num1;
do
{
    Console.Write("Please enter first number:");
} while (!Int32.TryParse(Console.ReadLine(), out num1));

并将switch更改为此类内容(以避免goto):

bool inputOk = false;
while (!inputOk)
{
    Console.WriteLine("Please select operator: ");
    //...
    op = Console.ReadLine();

    inputOk = true;
    switch (op)
    {
        //...
        default:
            Console.WriteLine("You entered an invalid operator. Please try again\n");
            inputOk = false;
            break;
     }
}

答案 1 :(得分:1)

未经测试,但这可能是您想要的:

Start:

Console.Write("Please enter first number:");
if (!int.TryParse(Console.ReadLine(), out num1))
    goto Start;
//num1 = Convert.ToInt32(Console.ReadLine());


Console.Write("Please enter second number: ");
num2 = Convert.ToInt32(Console.ReadLine());

Operator:

...

如果需要,也许对于num2也是一样。

答案 2 :(得分:1)

实现这一目标的最佳方法是使用EXCEPTION。由于您正在学习,我不会提供有关如何操作的示例代码,但希望您阅读相关内容herehere

答案 3 :(得分:1)

交换机内的

goto尝试转到已定义的案例。在你的例子中没有开始案例,所以它不知道去哪里。

更多信息here

我建议使用方法。

答案 4 :(得分:1)

我不认为goto语句适合这种情况。如果你有很多代码,你的代码可能会变得非常混乱。也不建议使用FormatException,因为抛出异常需要很长时间。

我认为你应该使用Int32.TryParse代替。

这是一段示例代码。看看你是否可以将它应用到你的程序中。

int input;
while(true) {
    Console.WriteLine("Please enter a number");
    bool succeeds = Int32.TryParse(Console.ReadLine(), out input);
    if (!succeeds) {
        Console.WriteLine("Input Invalid! Try again!");
    } else {
        break;
    }
}
// make use of input here

答案 5 :(得分:1)

insert into [REMARKS]
values((SELECT top 1 ref_no
FROM A_MASTER order by ref_no desc ), (SELECT top 1 current_dept
FROM A_MASTER order by ref_no desc ),'630590', GETDATE(),null)