2013-09-27 4 views
0

Не домашнее задание .. Так что у меня есть простая консольная программа для чтения экзаменов и распечатки среднего и класса. До сих пор это:Sentinel контролируется в то время как петли C#

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. Я думал, что я бы придерживаться в другом цикле в то время как раньше другого и изменить оригинал так:

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 для проверки допустимых записей после ввода недопустимого значения. Ответ, скорее всего, простой, но я застрял.

ответ

2

Проблема, с которой вы сталкиваетесь, заключается в том, что вы прерываете первый цикл, когда 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 
    } 
+0

Просто будьте осторожны, если пользователь вводит -99 во вторую попытку, так как вам нужно будет вырваться из обеих петель. Я не включил, как это сделать в моем примере выше. – JNYRanger