Простая проверка - PullRequest
       11

Простая проверка

0 голосов
/ 06 сентября 2018

Привет, ребята, ищите простой код проверки для моей консольной программы C #

В настоящее время есть:

public Class1()
{
    Console.WriteLine("Enter a, b, c or d:");
    string input = Console.ReadLine();

    while ((input != "a") && "b" && "c" && "d"))
    {
        if (input == "a" && "b" && "c" && "d")
        {
            Console.WriteLine("Success");
        }

        if (input != "a" && "b" && "c" && "d")
        {
            Console.WriteLine("Try again");

            Console.WriteLine("Enter a, b, c or d:");
            string input = Console.ReadLine();
        }
    }

}

Любая помощь приветствуется! Приветствия.

Ответы [ 8 ]

0 голосов
/ 06 сентября 2018

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

Что касается самой проверки, будет работать простая проверка, что входная строка соответствует "a" ИЛИ "b" ИЛИ "c" ИЛИ "d". Вы можете настроить метод так, чтобы он возвращал логическое значение, которое вычисляет выражение, как показано ниже.

Наконец, это просто случай вызова ValidateInput до тех пор, пока он не вернет true, используя цикл While и отрицание возвращаемого значения с помощью оператора логического отрицания !. Отрицание возвращаемого значения эффективно инвертирует результат метода ValidateInput. На английском это читается как While ValidateInput is NOT True

class Program
{
    static void Main(string[] args)
    {
        while (!ValidateInput(GetInput()))
        {
            Console.WriteLine("Try again");
        }

        Console.WriteLine("Success");
        Console.Read();
    }

    private static string GetInput()
    {
        Console.WriteLine("Enter a, b, c or d:");
        return Console.ReadLine();
    }

    private static bool ValidateInput(string input)
    {
        return (input == "a" || input == "b" || input == "c" || input == "d");
    }
}
0 голосов
/ 06 сентября 2018

Это ерунда:

while ((input != "a") && "b" && "c" && "d"))

Это можно записать так:

while (aCondition && anotherCondition && yetAnotherCondition && theLastCondition))

(input != "a") является условием, с этим проблем нет, но "b" не является условием, оно будет рассматриваться как true, поскольку оно не false или null. Я думаю, вы бы написали: while ((input != "a") && (input != "b") && (input != "c") && (input != "d")))

Точно так же, как должно было быть написано условие if (input == "a" && "b" && "c" && "d") if (input == "a" && input == "b" && input == "c" && input == "d"), возникнет проблема с алгоритмом. input не может быть одновременно равным "a", равным "b", равным "c" и равным "d".

Кроме того, ваш код не будет компилироваться, так как он находится в классе без включения в метод.

Читали ли вы сообщение об ошибке при попытке запустить его?

0 голосов
/ 06 сентября 2018

Я думаю, что самым простым подходом было бы создать массив разрешенных символов и проверить входные данные на соответствие:

char[] allowedChars = new char[] { 'a', 'b'};   

while(true){

    char inputChar = 'z';

    if (allowedChars.Length > 1)
    {
        Console.WriteLine(string.Format("Enter {0} or {1}:", string.Join(", ", allowedChars.Take(allowedChars.Length - 1)), allowedChars[allowedChars.Length - 1]));
    }
    else
    {
        Console.WriteLine(string.Format("Enter {0}", allowedChars[0]));
    }

    var result = char.TryParse(Console.ReadLine(), out inputChar);

    if (result && allowedChars.Contains(inputChar))
    {
        break;
    }

    Console.WriteLine("Try again");
}

Console.WriteLine("Success");
Console.ReadLine();

В случае успеха он автоматически выйдет из цикла while и напечатает сообщение об успехе.

0 голосов
/ 06 сентября 2018

Почему вы используете цикл while? Это кажется совершенно ненужным. Я не понимаю ваш код относительно того, каким будет правильный ответ, но простой оператор switch должен лучше служить вашей цели

        Console.WriteLine("Enter a, b, c or d:");
        string input = Console.ReadLine();

        switch (input)
        {
            case "a": Console.WriteLine("Success");
                break;
            case "b":
                Console.WriteLine("Try again");
                break;
            case "c":
                Console.WriteLine("Try again");
                break;
            case "d":
                Console.WriteLine("Try again");
                break;
            default: Console.WriteLine("Enter a, b, c or d:");
                break;
        }

        Console.ReadLine();
0 голосов
/ 06 сентября 2018
 public Class1()
{

    private static List<string> allowedChars= new List<string>(){
         "a","b","c","d"
     };
     public void Verify()
     {
          Console.WriteLine("Enter a, b, c or d:");
          string input = Console.ReadLine();
          while (!allowedChars.Contains(input))
         {
              Console.WriteLine("Try again");       
              Console.WriteLine("Enter a, b, c or d:");
              input = Console.ReadLine();
          }
    }
}
0 голосов
/ 06 сентября 2018

В вашем коде много ошибок, посмотрите на мой и попытайтесь понять это. Это довольно легко.

 Console.WriteLine("Enter a, b, c or d:\r\n");
   string input = Console.ReadLine();
   while (input != "")
   {
     if (input == "a" || input == "b" || input == "c" || input == "d")
      {
       Console.WriteLine("Success\r\n");
      }
     else
      {
       Console.WriteLine("Fail\r\n");
      }
     Console.WriteLine("Enter a, b, c or d:");
     input = Console.ReadLine();
    }
0 голосов
/ 06 сентября 2018

Предлагаю следующий код:

// char: we actually input a single character, not string
char input = '\0'; // initialize to make compiler happy

// keep on asking until success
while (true) {
  Console.WriteLine("Enter a, b, c or d:"); 

  // ReadKey: We want a single character, not a string
  input = Console.ReadKey();   

  // input is valid if it's in ['a'..'d'] range
  if (input >= 'a' && input <= 'd') {
    Console.WriteLine("Success");

    break;
  }

  Console.WriteLine("Try again"); 
}

Редактировать : в обобщенном случае (см. Комментарий Adriani6 ниже) код будет немного более сложным. Я предполагаю, что основной проблемой является своего рода вопросник , как

Compute 2 x 2 = ?
  a. 3
  b. 4
  c. 5
  d. 0  

Enter a, b, c or d:

именно поэтому я ожидаю, что действительный input должен когда-либо находиться в некотором диапазоне ('a'..'d' в приведенном выше примере), который я сохранил.

char from = 'a';
char upto = 'd';

// char: we actually input a single character, not string
char input = '\0'; // initialize to make compiler happy

// Building a title is, probably, the only complex thing (Linq)
string title = 
  $"Enter {string.Join(", ", Enumerable.Range(from, upto - from).Select(c => (char) c))} or {upto}:";

// keep on asking until success
while (true) {
  Console.WriteLine(title); 

  // ReadKey: We want a single character, not a string
  input = Console.ReadKey();   

  // Uncomment if we want a quit without choice, say, on Escape 
  //if (input == 27) { // or (input == 'q') if we want to quit on q
  //  input = '\0';
  //
  //  break;
  //}  

  // input is valid if it's in [from..upto] range
  if (input >= from && input <= upto) {
    Console.WriteLine("Success");

    break;
  }

  Console.WriteLine("Try again"); 
}
0 голосов
/ 06 сентября 2018

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

    Console.WriteLine("Enter a, b, c or d:");
    while ((input != "a") &&(input != "b") && (input != "c") &&(input != "d"))
    {
        Console.WriteLine("Try again");
        string input = Console.ReadLine();
    }
    Console.WriteLine("Success!");
...