2015-09-03 3 views
0

я, кажется, возникла проблема, когда мне нужно целое число от петли для условия цикла, вот код:проблемы Loop в C#

do { 
    Console.WriteLine(); 
    Console.WriteLine("What file would you like to test?"); 
    Console.WriteLine("1. Royal Flush"); 
    Console.WriteLine("2. Straight Flush"); 
    Console.WriteLine("3. Four of a Kind"); 
    Console.WriteLine("4. Full House"); 
    Console.WriteLine("5. Flush"); 
    Console.WriteLine("6. Straight"); 
    Console.WriteLine("7. Three of a Kind"); 
    Console.WriteLine("8. Two Pair"); 
    Console.WriteLine("9. Pair"); 
    Console.WriteLine("10. Exit"); 
    choiceInt = Convert.ToInt32(Console.ReadLine()); 
} while (choiceInt < 10 || choiceInt > 0); 

мне нужно choiceInt для условия цикла, чтобы получить чтобы это работало на данный момент я должен позволить ему петлю через один раз, прежде чем она получает значение,

+0

Зачем вам нужен цикл? Почему бы просто не напечатать каждый параметр, а затем прочитать и использовать 'switch', чтобы что-то сделать со значением. – Steve

+0

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

+0

Несвязанный, но также ищите int.TryParse() - он спасет вас от исключения с Convert.ToInt32() –

ответ

1

у вас есть > и < неправильно: вы хотите, условие, которое вычисляет true когда выбор неправильно (отсюда цикл должен продолжать запрашивать у пользователя ввод). Поскольку do/while выходит, когда условие переходит false, вы можете быть уверены, что после выхода из цикла choiceInt находится в допустимом диапазоне.

условие должно выглядеть следующим образом:

do { 
    ... 
} (choiceInt < 0 || choiceInt > 10); 
// ^^^^    ^^^^ 
// negative   above ten 
+0

@JasonJarrett Текущий код завершает цикл, когда вводится '10', поскольку присвоение' 10' 'ChooseInt' превращает условие продолжения * в' false'. – dasblinkenlight

-2

Вам не нужно менять многое. Просто сделайте цикл while, а не цикл do. Кроме того, ваши условия для цикла while казались немного выключенными. Разве вы не хотите продолжать цикл, если значение не находится в диапазоне 1-10?

int choiceInt = Convert.ToInt32(Console.ReadLine()); 

while (choiceInt > 10 || choiceInt < 0) { 
    Console.WriteLine("What file would you like to test?"); 
    Console.WriteLine("1. Royal Flush"); 
    Console.WriteLine("2. Straight Flush"); 
    Console.WriteLine("3. Four of a Kind"); 
    Console.WriteLine("4. Full House"); 
    Console.WriteLine("5. Flush"); 
    Console.WriteLine("6. Straight"); 
    Console.WriteLine("7. Three of a Kind"); 
    Console.WriteLine("8. Two Pair"); 
    Console.WriteLine("9. Pair"); 
    Console.WriteLine("10. Exit"); 
    choiceInt = Convert.ToInt32(Console.ReadLine()); 
} 
+1

вы просите пользователя ввести что-то перед предоставлением опций !!! –

+0

Теперь я чувствую себя глупо. Ты прав. Мои извинения! –

-1

Это будет работать для вас:

static void Main(string[] args) 
    { 
     string consoleInput; 
     ShowOptions();   

     do 
     { 
      consoleInput = Console.ReadLine(); 
      if (consoleInput == "10") 
       Environment.Exit(0); 

      DoSomething(); 
      ShowOptions(); 

     } while (consoleInput != null && consoleInput != "10"); 
    } 

    private static void ShowOptions() 
    { 
     Console.WriteLine(); 
     Console.WriteLine("What file would you like to test?"); 
     Console.WriteLine("1. Royal Flush"); 
     Console.WriteLine("2. Straight Flush"); 
     Console.WriteLine("3. Four of a Kind"); 
     Console.WriteLine("4. Full House"); 
     Console.WriteLine("5. Flush"); 
     Console.WriteLine("6. Straight"); 
     Console.WriteLine("7. Three of a Kind"); 
     Console.WriteLine("8. Two Pair"); 
     Console.WriteLine("9. Pair"); 
     Console.WriteLine("10. Exit"); 
    } 

    private static void DoSomething() { Console.WriteLine("I am doing something!"); } 
+0

вам нужно сначала показать варианты. –

-1

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

var options = new [] 
{ 
    new { option = 1, text = "Royal Flush" }, 
    new { option = 2, text = "Straight Flush" }, 
    new { option = 3, text = "Four of a Kind" }, 
    new { option = 4, text = "Full House" }, 
    new { option = 5, text = "Flush" }, 
    new { option = 6, text = "Straight" }, 
    new { option = 7, text = "Three of a Kind" }, 
    new { option = 8, text = "Two Pair" }, 
    new { option = 9, text = "Pair" }, 
    new { option = 10, text = "Exit" }, 
}; 

string choice; 
do 
{ 
    Console.WriteLine(); 
    Console.WriteLine("What file would you like to test?"); 
    Console.WriteLine(
     String.Join(
      Environment.NewLine, 
      options.Select(o => String.Format("{0}. {1}", o.option, o.text)))); 
    choice = Console.ReadLine(); 
} while (options.Take(9).Any(o => o.option.ToString() == choice)); 
+0

вы предоставляете 10 в качестве опции, поэтому даже когда пользователь выберет 10, ваш цикл продолжится. –

+0

@ Никита - Нет, когда вы вводите '10', петля выходит. Я тестировал код перед публикацией. – Enigmativity

+0

Вы также отметили от 1 до 9? Массив опций содержит от 1 до 10, когда choice = 10 (введенный пользователем) options.Any() условие возвращает true,! Options.Any() будет ложным, оно завершается. Но, с 1 по 9, он также выходит по той же причине, что и выше. Это не просто условие, которое является неправильным, также мой первый комментарий сохраняется, когда вы будете изменять. –