2009-06-14 3 views
1

Привет, я практикую «Переключатель» в программе. И я делаю код, в котором пользователь может вводить целое число, и после того, как пользователь вводит целое число, он также отображает то, что пользователь просто вводил. Теперь я пытаюсь реализовать там, где программа попросит пользователя ввести номер снова, выбрав Y/N. Я уже включил его здесь в свой код, но если я набираю символы, первый раз, когда программа просит меня ввести целое число, программа выполнит часть catch. Как я могу это сделать, если пользователь наберет символ, он также отобразит сообщение еще раз: «введите целое число:»инструкция switch

Спасибо за вашу помощь. Я совсем потерялся где-то здесь.

  int enterYourNumber; 
      char shortLetter; 

      try 
      { 
       Console.WriteLine("Please enter the integer: "); 
       enterYourNumber = Convert.ToInt32(Console.ReadLine()); 
       WriteNumber(enterYourNumber); 

       Console.WriteLine("Do you still want to enter a number? Y/N"); 
       shortLetter = Convert.ToChar(Console.ReadLine()); 

       while (shortLetter == 'y' || shortLetter == 'Y') 
       { 
        Console.WriteLine("Please enter the integer: "); 
        enterYourNumber = Convert.ToInt32(Console.ReadLine()); 
        WriteNumber(enterYourNumber); 

        Console.WriteLine("Do you still want to enter a number? Y/N"); 
        shortLetter = Convert.ToChar(Console.ReadLine()); 
       } 

      } 
      catch 
      {           
       Console.WriteLine("Please enter an integer not a character"); 
      } 
     } 

      public static void WriteNumber(int wordValue) 
      { 

      switch (wordValue) 
      { 
       case 1: 
        Console.WriteLine("You have entered number one"); 
        break; 
       case 2: 
        Console.WriteLine("You have entered number two"); 
        break; 
       case 3: 
        Console.WriteLine("You have entered number three"); 
        break; 
       default: 
        Console.WriteLine("You have exceeded the range of number 1-3 "); 
        break; 
      } 

======================

Это то, что я не знаю, почему я получаю сообщение об ошибке , Новый метод, похоже, не работать:

 int enterYourNumber; 
     char shortLetter; 


      do 
     { 
      enterYourNumber = GetNumber(); 
      WriteNumber(enterYourNumber);     
      Console.WriteLine("Do you still want to enter a number? Y/N"); 
      shortLetter = Convert.ToChar(Console.ReadLine()); 
     } 
     while (shortLetter == 'y' || shortLetter == 'Y') 
     { 
      Console.WriteLine("Please enter the integer: "); 
      enterYourNumber = Convert.ToInt32(Console.ReadLine()); 
      WriteNumber(enterYourNumber); 

      Console.WriteLine("Do you still want to enter a number? Y/N"); 
      shortLetter = Convert.ToChar(Console.ReadLine()); 
     } 
    } 



     public static int GetNumber() 
     { 
     bool done = false; 
     int value; 
     while (!done) 
     { 
      Console.WriteLine("Please enter the integer: "); 
     try 
     { 
      value = Convert.ToInt32(Console.ReadLine()); 
      done = true; 
     } 
     catch 
     { 
      Console.WriteLine("Please enter an integer not a character"); 
     } 
     } 
     } 

=============

Привет Билл это пример, который вы дали, и, кажется, я все еще получаю ошибку : не могли бы вы прочесть код. Большое спасибо:

public static void Main(string[] args) 
    { 
     int enterYourNumber; 
     char shortLetter; 



     do 
     { 
      enteryourNumber = GetNumber(); 
      WriteNumber(enteryourNumber); 
      Console.WriteLine("Do you still want to enter a number? Y/N"); 
      shortLetter = Convert.ToChar(Console.ReadLine()); 
     } 
     while (shortLetter == 'y' || shortLetter == 'Y'); 
    } 


    public static int GetNumber() 
    { 
     bool done = false; 
     int value; 
     while (!done) 
     { 
      Console.WriteLine("Please enter the integer: "); 
      try 
      { 
       value = Convert.ToInt32(Console.ReadLine()); 
       done = true; 
      } 
      catch 
      { 
       Console.WriteLine("Please enter an integer not a character"); 
      } 

      Console.WriteLine("Please enter the integer: "); 
      enterYourNumber = Convert.ToInt32(Console.ReadLine()); 
      WriteNumber(enterYourNumber); 
      Console.WriteLine("Do you still want to enter a number? Y/N"); 
      shortLetter = Convert.ToChar(Console.ReadLine()); 
     } 
    } 

    public static void WriteNumber(int wordValue) 
    { 

     switch (wordValue) 
     { 
      case 1: 
       Console.WriteLine("You have entered number one"); 
       break; 

      case 2: 
       Console.WriteLine("You have entered number two"); 
       break; 

      case 3: 
       Console.WriteLine("You have entered number three"); 
       break; 

      default: 
       Console.WriteLine("You have exceeded the range of number 1-3 "); 
       break; 
     } 
    } 
} 

}

=================

Привет снова этот вопрос для Роберта. Это то, что я сделал сейчас, но если я войду в «N», он не выйдет из программы. Он по-прежнему задал тот же вопрос. Любая идея: спасибо:

public static void Main(string[] args) 
    { 
     int enterYourNumber; 
     char shortLetter; 
     bool validEntry; 



     while (true) 
     { 
      do 
      { 
       Console.WriteLine("Please enter an integer: "); 
       string numberString = Console.ReadLine(); 
       validEntry = int.TryParse(numberString, out enterYourNumber); 
       WriteNumber(enterYourNumber); 
       if (!validEntry) 
       { 
        Console.WriteLine("Entry must be an integer"); 
       } 
      } while (!validEntry); 

      Console.WriteLine("Do you still want to enter a number? Y/N"); 
      shortLetter = Convert.ToChar(Console.ReadLine()); 


     } 
    } 




    public static void WriteNumber(int wordValue) 
    { 
     switch (wordValue) 
     { 
      case 1: 
       Console.WriteLine("You have entered number one"); 
       break; 
      case 2: 
       Console.WriteLine("You have entered numbered two"); 
       break; 
      case 3: 
       Console.WriteLine("You have entered numbered three"); 
       break; 
      default: 
       Console.WriteLine("You have exceeded the range of number 1-3"); 
       break; 
     } 
    } 
} 

}

================================= ===

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

 public static void Main(string[] args) 
    { 
     int intEnterYourNumber; 
     char charShortLetter; 
     string strUserInput; 

     do 
     { 
      do 
      { 
       Console.WriteLine("Please enter the integer: "); 
       strUserInput = Console.ReadLine(); 
      } while (!int.TryParse(strUserInput, out intEnterYourNumber)); 
      WriteNumber(intEnterYourNumber); 
      Console.WriteLine("Do you still want to enter a number? Y/N"); 
      charShortLetter = Convert.ToChar(Console.ReadLine().ToUpper()); 
     } while (charShortLetter == 'Y'); 
    } 



    public static void WriteNumber(int wordValue) 
    { 
     switch (wordValue) 
     { 
      case 1: 
       Console.WriteLine("You have entered number one"); 
       break; 
      case 2: 
       Console.WriteLine("You have entered numbered two"); 
       break; 
      case 3: 
       Console.WriteLine("You have entered numbered three"); 
       break; 
      default: 
       Console.WriteLine("You have exceeded the range of number 1-3"); 
       break; 
     } 
    } 

ответ

0

Переместите блок try/catch внутри цикла. Предложение Роберта Харви о том, что цикл do/while тоже хорош.

int enterYourNumber; 
char shortLetter; 

do 
{ 
     try 
     { 
      Console.WriteLine("Please enter the integer: ");     
      enterYourNumber = Convert.ToInt32(Console.ReadLine());     
      WriteNumber(enterYourNumber); 
     } 
     catch(FormatException) 
     {           
      Console.WriteLine("Please enter an integer not a character"); 
     } 

     shortLetter = '\0'; 
     do 
     { 
      try 
      { 
       Console.WriteLine("Do you still want to enter a number? Y/N");      
       shortLetter = Convert.ToChar(Console.ReadLine()); 
      } 
      catch(FormatException) 
     { 
       Console.WriteLine("Please enter a single character"); 
     } 
     }  
     while (shortLetter == '\0')  
}     
while (shortLetter == 'y' || shortLetter == 'Y') 

} 

     public static void WriteNumber(int wordValue) 
     { 

     switch (wordValue) 
     { 
      case 1: 
       Console.WriteLine("You have entered number one"); 
       break; 
      case 2: 
       Console.WriteLine("You have entered number two"); 
       break; 
      case 3: 
       Console.WriteLine("You have entered number three"); 
       break; 
      default: 
       Console.WriteLine("You have exceeded the range of number 1-3 "); 
       break; 
     } 
+0

спасибо uncleo этот хорошо работает. Я все еще не согласен с «Do-WHiLe», поэтому мне нужно снова это пересмотреть и понять логику. Потому что в моем предыдущем коде кажется, что он довольно избыточный, и я думаю, что это то, что мне нужно. – tintincutes

+0

Ключ к инструкции Do While заключается в том, что в программах, требующих ввода пользователем, помещение While внизу гарантирует, что цикл выполняется хотя бы один раз и что пользователь получает ввод хотя бы один раз. Вы не всегда будете писать свои циклы While таким образом. В большинстве случаев вам нужно только ввести цикл, если условие While выполнено. –

+0

uncleo Я попробовал снова вашу работу, первый «shortletter == null» не может быть выполнен, потому что Null не может быть преобразован в char. И второй catch (FormatException) не работает. – tintincutes

2
do 
{ 
    Console.WriteLine("Please enter the integer: ");     
    enterYourNumber = Convert.ToInt32(Console.ReadLine());     
    WriteNumber(enterYourNumber);     
    Console.WriteLine("Do you still want to enter a number? Y/N");      
    shortLetter = Convert.ToChar(Console.ReadLine()); 
}     
while (shortLetter == 'y' || shortLetter == 'Y') 
+0

благодаря Роберт, как о том, если пользователь будет вводить символ в первый раз? – tintincutes

+0

Положите это Do/While в try/catch, как в исходном коде. –

+0

К сожалению, он не позволяет пользователю вернуться в цикл после исключения, на который был поставлен вопрос. – billjamesdev

1

Роберта есть начало, но, возможно, мы все еще хотим, чтобы попытаться поймать ...

Замените основную функцию с:

do 
{ 
    enterYourNumber = GetNumber(); 
    WriteNumber(enterYourNumber);     
    Console.WriteLine("Do you still want to enter a number? Y/N"); 
    shortLetter = Convert.ToChar(Console.ReadLine()); 
} 
while (shortLetter == 'y' || shortLetter == 'Y') 

и добавить эту функцию:

public static int GetNumber() { 
    boolean done = false; 
    int value; 
    while (!done) { 
     Console.WriteLine("Please enter the integer: "); 
     try { 
      value = Convert.ToInt32(Console.ReadLine()); 
      done = true; 
     } 
     catch { 
      Console.WriteLine("Please enter an integer not a character"); 
     } 
    } 
} 

Затем удалите попытку поймать основная функция.

+0

Привет, Билл, пожалуйста, см. Мой отредактированный ответ. Кажется, у нового метода есть проблема. – tintincutes

+0

Ну, у вас есть дополнительный код после строки «while». Это в то время как строка является последней операцией начального блока (перед объявлениями функции) – billjamesdev

+0

Привет, Билл Я попробовал то, что вы предложили, но кажется, что я все еще получаю сообщение об ошибке. Я был бы рад, если бы вы могли проверить код. Спасибо – tintincutes

1

Поскольку вы изучаете, вы также можете рассмотреть возможность обработки ошибки по-разному.
Посмотрите на вопрос SO: In C# should try-catch be used for is-numeric testing? для получения дополнительных идей и обсуждения.

+0

спасибо Дугу. Я это сделаю. – tintincutes

8

Я думаю, что ваш код будет легче выучить и понять, если вы не использовать исключения, чтобы проверить свои номера. Попробуйте использовать int.TryParse() вместо этого (TryParse() на MSDN). TryParse() возвращает истинное (или ложные) в зависимости от того, был ли введенный номер действителен:

int number; 
bool validEntry = int.TryParse(enterYourNumber, out number); 
if (!validEntry) 
{ 
    Console.WriteLine("Entry must be an integer."); 
} 

Кроме того, узнать о делать ... в то время как цикл (link). цикл do..while похож на обычный цикл while, за исключением того, что цикл do-while выполняется один раз перед вычислением условного выражения.

bool validEntry; 
int enteredNumber; 
do 
{ 
    Console.Write("Please enter the integer: "); 
    string numberString = Console.ReadLine(); 
    validEntry = int.TryParse(numberString, out enteredNumber); 
    if (!validEntry) 
    { 
     Console.WriteLine("Entry must be an integer."); 
    } 
} while (!validEntry); 

Заверните все это в другом цикле While («Вы все еще хотите, чтобы ввести номер (Y/N)?»), И вы сделали.

Наслаждайтесь,

Роберт С. Cartaino

+0

Спасибо за ссылку Robert, попробуем ваш пример и узнаем цикл while. Это означает, что «попытка и улов» на C# не подходит для начинающих, таких как я? – tintincutes

+0

Вы должны всегда использовать try ... catch в исключительных случаях (извините за каламбур). Он никогда не должен использоваться для нормального (ожидаемого) потока программы. – rein

+0

Привет, Роберт У меня есть вопрос, пожалуйста, проверьте мои измененные примечания выше. Благодарю. «N» здесь не работает, если я хочу выйти из моей программы. Я не уверен, если я правильно написал другого. см. мой код. Благодарю. – tintincutes

Смежные вопросы