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





Во-первых, ваш код не может быть просто классом. Это должно быть в функции. Обычно это выглядит так
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 для выхода? Тем не менее, хорошее решение.
@ Adriani6, тогда ты мог бы просто сделать еще один случай. Как вариант, обработайте || 'q' в условии if.
@Joel Конечно, можешь, никто не говорит, что ты не можешь. Есть более простые способы сделать метод более расширяемым, чем изменение логического оператора.
@ Adriani6 И я никогда не говорил, что ты это сделал. Среди решений это явно самый общий (включая обновление 1 минуту назад).
@Joel Я думаю, вы совершенно неверно истолковали мои комментарии ... и это не место, чтобы это обсуждать. Мой комментарий был предложением Дмитрия, и он отнесся к нему как к одному (отсюда и его правка, я полагаю). Это также не самый общий, есть более простые способы реализовать такую проверку / функциональность с еще меньшим, более чистым кодом при расширении диапазонов символов, и некоторые ответы отражают именно это.
В вашем коде много ошибок, посмотрите мой и попытайтесь понять его. Это довольно просто.
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 ..
Это чушь:
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:"
@DmitryBychenko Хорошие предложения :) Отредактировал код!
Технически последний else является избыточным: можно просто поставить Console.WriteLine("Try again");. Сомневаюсь, что будет случай с допустимым символом один (зачем просить пользователя ввести его) - if (allowedChars.Length > 1) .... В (академическом) общем случае HashSet<char> - лучший выбор, чем массив для Contains (однако в этом конкретном случае с массивом небольшой разница незначительна). Приятно +1
@DmitryBychenko Вы правы насчет последнего утверждения else, я вставил его для удобства чтения, но теперь думаю, что это совершенно очевидно, и никогда не знал, что HashSet - лучший выбор ... кое-что, чтобы почитать днем. Спасибо :)
Для начала я бы выделил ввод кода проверки в отдельный метод, поскольку вам, возможно, придется вызывать его несколько раз, если проверка ввода не удалась. То же самое относится и к получению ввода.
Что касается самой проверки, то простая проверка соответствия входной строки "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");
}
}
Я должен уточнить, что цель состоит в том, чтобы пользователь вводил a, b, c или d, если ввод не является любым из них, вопрос будет повторно отображен.