2016-09-13 2 views
2

Редактировать. Основываясь на полученных ответах, я понял, что я задаю больше, чем я знаю на этом раннем этапе моего обучения, и поэтому я решил забыть этот вопрос, пока не узнаю и не пойму больше. Я не хочу переступать и смущать себя.Введено неправильное значение. goto Start;

Просто новичок ищет руководство.

Из предыдущего вопроса, который я задал здесь, я познакомился с goto Start; в инструкции переключателя.

Я начал использовать его, и мне подумалось, что я хочу, чтобы программа перешла к началу в случае, если пользователь ввел недопустимый ввод. Например, в моем калькуляторе ниже, если пользователь вводит нечто, отличное от числа, как мне заставить программу игнорировать ввод и снова запрашивать пользователя, чтобы ввести номер? Возможно, даже отобразите «неверный вход. Попробуйте еще раз» для пользователя.

Прямо сейчас, если ничего, кроме числа, вводится, консоль вылетает и выдает мне ошибку.

Заранее спасибо за помощь

 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(); 

ответ

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; 
    } 
} 
+0

Я еще не знаком с инструкциями do/while :( –

+0

@Jude Я не знаю, с какими конструктами вы знакомы, но он может быть переписан с любым циклом.Если у вас возникли проблемы, сообщите мне, какой из них вы выберете, и я реорганизую его для выбранного вами цикла. – slawekwin

+0

Честно говоря, я не знаком с тем, что я только начал с двух/три недели назад. Я думаю, что я должен просто забыть свой вопрос сейчас, пока я не начну учить больше и я в состоянии понять больше. я, возможно, более ступенчатые. Спасибо за вашу помощь, хотя. –

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, если вам нужно.

+0

Благодарим за отзыв. –

1

Лучший способ достичь этого - использовать ИСКЛЮЧЕНИЕ. Так как вы учитесь, я бы не предоставить образец кода о том, как это сделать, но хотел бы, чтобы вы читали об этом here и here

1

goto внутри коммутатор пытается перейти к определенному случаю. В вашем примере нет начального примера, поэтому он не знает, куда идти.

Дополнительная информация here.

Я бы предложил использовать методы.

1

Я не думаю, что утверждения в этом случае подходят. Ваш код может стать очень грязным, если у вас их много. Использование 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 
+0

Это немного сбивает меня с толку, верьте или нет. –

+0

Я думаю, что сейчас я просто забуду об этом, пока не узнаю еще :) –

1
 int num1, num2, output; 
    string op; 

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

Start: 

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


    do 
    { 
     Console.Write("Please enter valid second number:"); 
    } while (!int.TryParse(Console.ReadLine(), out num2)); 

    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(); 
Смежные вопросы