2015-04-02 2 views
0

Я работаю над проблемой, описанной ниже, и я использую цикл для ее решения. Я еще не учился на занятиях. Мне нужно перезапустить цикл, если введены неверные данные.Как вернуться в начало цикла for?

В заявлении Если,

if (isInteger == false) 

я могу использовать оператор перерыв, чтобы бежать, но остальная часть для цикла будет выполняться, и он будет перезапустить и приращение г = 1. Если тип данных неверно, мне нужно, чтобы он вернулся к началу цикла, где i = 0. Как мне это сделать?

Задача: Напишите программу, которая считывает из 5 целых чисел от пользователя и печатает их сумму. Если введен неверный номер, программа должна попросить пользователя ввести другой номер.

Console.WriteLine("This program accepts 5 integers from the user and returns their sum.\nIf an invalid integer is entered, the program notifies the user and asks for correct input."); 

     for (int i = 0; i < 5; i++) 
     { 
      Console.WriteLine("Please enter Integer {0} now.", (i + 1)); 
      string rawInput = Console.ReadLine(); 

      int integerSum = 0; 

      int integerInput; 
      bool isInteger = int.TryParse(rawInput, out integerInput); 

      if (isInteger == false) 
      { 
       Console.WriteLine("This is not a valid integer. Please enter a valid integer now:"); 
       break; 
      } 
      else 
      {     
       integerSum += integerInput;     
      } 
     } 
+0

Вы можете прочитать в 'continue'. – Matthew

+3

В дополнение к 'continue', поймите, что вы можете изменить значение' i' _within_ цикла. –

+3

Вы также можете иметь две петли, цикл 'for' для 5 значений и цикл while /' do-while', чтобы гарантировать, что каждое значение является целым числом. – Matthew

ответ

2

Посмотрите C# ключевое слово

продолжают

Также у вас есть ошибка вы объявляете

Int integerSum = 0;

В рамках вашего цикла перемещайте это из цикла, иначе вы не суммируете числа.

Console.WriteLine("This program accepts 5 integers from the user and returns their sum.\nIf an invalid integer is entered, the program notifies the user and asks for correct input."); 

    int integerSum = 0; 

    for (int i = 0; i < 5; i++) 
    { 
     Console.WriteLine("Please enter Integer {0} now.", (i + 1)); 
     string rawInput = Console.ReadLine(); 



     int integerInput; 
     bool isInteger = int.TryParse(rawInput, out integerInput); 

     if (isInteger == false) 
     { 
      Console.WriteLine("This is not a valid integer. Please enter a valid integer now:"); 
      i--;     
      continue; 
     } 
     else 
     {     
      integerSum += integerInput;     
     } 
    } 

    Console.WriteLine("Result: " + integerSum); 

Вот детали по-прежнему:

Продолжить заявление передает управление к следующей итерации вмещающего времени, делать, для, или Еогеаспа заявление, в котором он появляется.

class ContinueTest 
{ 
static void Main() 
{ 
    for (int i = 1; i <= 10; i++) 
    { 
     if (i < 9) 
     { 
      continue; 
     } 
     Console.WriteLine(i); 
    } 

    // Keep the console open in debug mode. 
    Console.WriteLine("Press any key to exit."); 
    Console.ReadKey(); 
    } 
} 
/* 
Output: 
9 
10 
*/ 

MSDN further details

+0

Не будет использовать оператор continue просто перезапустить цикл for снова при i = 1? Если бы я не принял совет Джеймса Торпа и не уменьшил его. Edit: Я вижу, как вы это сделали. –

+0

Да, у вас был разрыв, который выходит из цикла, продолжается, возвращается в цикл, который не работает. С вашим текущим подходом вам нужно уменьшить i, если вы идете с циклом for с i в качестве итератора и продолжаете использовать. Существует много решений этой проблемы. while (true) и т. д. и т. д. – kmcnamee

4

Использование продолжать как этот

if (isInteger == false) 
{ 
    Console.WriteLine("This is not a valid integer. Please enter a valid integer now:"); 
    i--; 
    continue; 
} 
2

Вы не должны просто вернуться к началу цикла с continue, потому что вы в конечном итоге сделать меньше итераций, чем это необходимо.

У вас есть несколько вариантов здесь:

  1. Decrement i и использовать continue или
  2. Удалить i++ из заголовка петли, и переместить его в конце тела цикла или
  3. Проделайте # 2, а также переключитесь на петлю while для лучшей ясности.

Первые два варианта обусловливают код в for цикл. Я думаю, что while петля будет лучше:

int i = 0; 
int integerSum = 0; 
while (i != 5) { 
    Console.WriteLine("Please enter Integer {0} now.", (i + 1)); 
    string rawInput = Console.ReadLine(); 
    int integerInput; 
    if (!int.TryParse(rawInput, out integerInput)) { 
     Console.WriteLine("This is not a valid integer. Please enter a valid integer now:"); 
     continue; 
    } 
    integerSum += integerInput;     
    i++; 
} 

Не забудьте переместить integerSum из петли!

+0

Почему существует «!» перед методом int.TryParse? –

+0

Я забыл об этом. Я не видел, чтобы это использовалось с помощью методов. –

2

ответ! скоро вы будете мега крепкого L33t Coder

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 

      int integerSum = 0; 
      int count = 0; 
      while (true) 
      { 
       Console.WriteLine("Please enter Integer {0} now.", (count + 1)); 
       string rawInput = Console.ReadLine(); 

       int integerInput; 
       bool isInteger = int.TryParse(rawInput, out integerInput); 

       if (isInteger == false) 
       { 
        Console.WriteLine("This is not a valid integer. Please enter a valid integer now:"); 
       } 
       else 
       { 
        integerSum += integerInput; 
        count ++; 
       } 
       if (count >= 5) 
       { 
        break; 
       } 
      } 
      Console.WriteLine("sum = " + integerSum); 
     } 
    } 
} 
+0

Спасибо за решение этого совершенно по-другому. Я не думал об этом так. –

3

Это должно сделать:

public class Program 
{ 
    static void Main() 
    { 
     int sum = 0, value = 0; 

     for (int i = 1; i <= 5; i++) 
     { 
      Console.WriteLine("Please enter Integer {0} now.", i); 

      while (!int.TryParse(Console.ReadLine(), out value)) 
      { 
       Console.WriteLine("This is not a valid integer. Please enter a valid integer {0} now:", i); 
      } 

      sum += value; 
     } 

     Console.WriteLine(sum); 

    } 
} 
2

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

private static int SumFiveInts() 
{ 
    Console.WriteLine("This program accepts 5 integers from the user and returns their sum.\nIf an invalid integer is entered, the program notifies the user and asks for correct input."); 

    int sum = 0; 
    for (int i = 0; i < 5; i++) 
    { 
     sum += GetIntegerFromConsole(i); 
    } 
    return sum; 
} 
public static int GetIntegerFromConsole(int attempt) 
{ 
    Console.WriteLine("Please enter Integer {0} now.", (attempt + 1)); 
    int output; 
    while (!int.TryParse(Console.ReadLine(), out output)) 
     Console.WriteLine("This is not a valid integer. Please enter a valid integer now:"); 
    return output; 
} 
+0

Я еще не знаю, как использовать методы или классы. Edit: Но спасибо за это, я хотел бы знать, как это сделать с помощью надлежащих методов и структуры. –

+0

@Code_Steel. Невозможно написать компилируемую исполняемую программу C#, не выполняя обе эти вещи, поэтому вы должны знать что-то о них. И теперь было бы так же хорошо, как и все, чтобы начать узнавать о них, если вы действительно ничего не знаете. Лично я бы сказал, что то, что вы видите в большинстве других ответов здесь, намного сложнее и сложнее понять, чем создавать новый метод. – Servy

+0

Нет, я знаю об их теории, но я не имею в главе, где я начинаю работать над ними. Я вообще не понимаю этих строк, можете ли вы их объяснить? И что это за попытка? Это входное значение? int output; while (! Int.TryParse (Console.ReadLine(), out output)) –

0

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

int integerSum = 0; 

     for (int i = 0; i < 5;) 
     { 
      Console.WriteLine("Please enter Integer {0} now.", (i + 1)); 
      string rawInput = Console.ReadLine(); 

      int integerInput; 
      bool isInteger = int.TryParse(rawInput, out integerInput); 

      if (isInteger == false) 
      { 
       Console.WriteLine("This is not a valid integer. Please enter a valid integer now:"); 

      } 
      else if (isInteger == true) 
      { 
       integerSum += integerInput; 
       i++; 
      } 

     } 
     Console.WriteLine("The sum of all number entered is:{1}{0} ", integerSum, Environment.NewLine); 
Смежные вопросы