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

Привет, ребята, ищите простой код проверки для моей консольной программы 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();
        }
    }

}

Любая помощь приветствуется! Ваше здоровье.

Я должен уточнить, что цель состоит в том, чтобы пользователь вводил a, b, c или d, если ввод не является любым из них, вопрос будет повторно отображен.

Kyle Russell 06.09.2018 10:31
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
141
8

Ответы 8

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

    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!");

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

// 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"); 
}

Он не очень расширяем при использовании диапазонов, что, если следующей задачей будет добавление q для выхода? Тем не менее, хорошее решение.

Adrian 06.09.2018 10:44

@ Adriani6, тогда ты мог бы просто сделать еще один случай. Как вариант, обработайте || 'q' в условии if.

Joel 06.09.2018 10:47

@Joel Конечно, можешь, никто не говорит, что ты не можешь. Есть более простые способы сделать метод более расширяемым, чем изменение логического оператора.

Adrian 06.09.2018 10:48

@ Adriani6 И я никогда не говорил, что ты это сделал. Среди решений это явно самый общий (включая обновление 1 минуту назад).

Joel 06.09.2018 10:51

@Joel Я думаю, вы совершенно неверно истолковали мои комментарии ... и это не место, чтобы это обсуждать. Мой комментарий был предложением Дмитрия, и он отнесся к нему как к одному (отсюда и его правка, я полагаю). Это также не самый общий, есть более простые способы реализовать такую ​​проверку / функциональность с еще меньшим, более чистым кодом при расширении диапазонов символов, и некоторые ответы отражают именно это.

Adrian 06.09.2018 11:00

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

 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();
    }
 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();
          }
    }
}

Почему вы используете цикл 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();

Оператор switch не будет служить этой цели ... Я думаю, вам не хватает всего смысла в цикле while ..

Adrian 06.09.2018 10:47

Это чушь:

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".

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

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

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

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 и напечатает сообщение Success.

Я предлагаю печатать "Try again" в случае только неверный ввод, а не на первый забег. Если разрешенные символы - это только a и b, я предлагаю строительство заголовок (что-то вроде "Enter a or b:") из допустимых символов, а не жесткого кодирования "Enter a, b, c or d:"

Dmitry Bychenko 06.09.2018 11:01

@DmitryBychenko Хорошие предложения :) Отредактировал код!

Adrian 06.09.2018 11:11

Технически последний else является избыточным: можно просто поставить Console.WriteLine("Try again");. Сомневаюсь, что будет случай с допустимым символом один (зачем просить пользователя ввести его) - if (allowedChars.Length > 1) .... В (академическом) общем случае HashSet<char> - лучший выбор, чем массив для Contains (однако в этом конкретном случае с массивом небольшой разница незначительна). Приятно +1

Dmitry Bychenko 06.09.2018 11:22

@DmitryBychenko Вы правы насчет последнего утверждения else, я вставил его для удобства чтения, но теперь думаю, что это совершенно очевидно, и никогда не знал, что HashSet - лучший выбор ... кое-что, чтобы почитать днем. Спасибо :)

Adrian 06.09.2018 11:25

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

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

Наконец, это просто случай вызова ValidateInput до тех пор, пока он не вернет истину, с использованием цикла 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");
    }
}

Другие вопросы по теме