«Насколько я могу судить, лог c имеет смысл»
Вероятно потому, что вы читаете это так, как кто-то может сказать это в engli sh, но не как логическое выражение кода.
- На английском sh мы бы сказали: "Если они не ответили" да ", или «нет», затем спросите их снова. »
- В коде мы формулируем это по-другому: « Если ответ был не «да», и ответ не было «нет», затем спросите их еще раз »
Вот почему:
- Условное логическое ИЛИ (
||
) вернет true
, если один из операндов - true
(и оценка остановится на первом true
результате): false || false == false
false || true == true
true || false == true
true || true == true
- Это отличается от условного логического оператора AND (
&&
), который вернет true
только если оба операнда истинны. false && false == false
false && true == false
true && false == false
true && true == true
Теперь давайте посмотрим на ваше if
условие в ContinuePlanning
:
if (response.ToLower() != "yes" || response.ToLower() != "no")
Теперь, если кто-то вводит "yes"
, первая часть будет false
, а вторая часть - true
, поэтому условие будет оцениваться как true
. Точно так же, если они вводят "no"
(или любой другой ввод), первая часть будет true
, поэтому условие будет оцениваться как true
Вместо этого мы хотим проверить, что и первая часть И вторая часть верна, поэтому мы должны использовать оператор &&
:
if (response.ToLower() != "yes" && response.ToLower() != "no")
Теперь, если они введут "yes"
или "no"
, только из этих операндов будет true
, поэтому условие будет оцениваться как false
. Если они введут любой другой ввод, то оба условия будут true
, что мы и ищем.
Другая проблема заключается в том, что этот метод принимает аргумент bool
, изменяет его на false
, если пользователь вводит "no"
, а затем возвращает его. Проблема в том, что если переменная начинается с false
, мы возвращаем false
независимо от того, что вводит пользователь. Кроме того, этот метод не требует каких-либо аргументов от вызывающего. Вместо этого мы должны просто объявить переменную локально.
Мы также проверяем только один раз, вводят ли они "yes"
или "no"
, но мы должны сделать это в al oop на всякий случай, если они действительно неуклюжие машинисты . :)
// Question - another location?
public static bool ContinuePlanning()
{
// Start out assuming we will contiune planning
bool continuePlanning = true;
// Another location?
Console.Write("Another location? (yes/no) ");
// Get the user reponse and make it lower case
string response = Console.ReadLine().ToLower();
// Validate user input
while (response != "yes" && response != "no")
{
// Error message
Console.WriteLine("Please only enter yes or no.");
// Re-ask question
Console.Write("Another location? (yes/no) ");
response = Console.ReadLine();
}
// If the user doesn't want to continue, set our variable
if (response == "no") continuePlanning = false;
return continuePlanning;
}