Мы уже умеем писать методы, которые проверяют одиночные условия. Теперь научимся строить составные условия. Хороший пример: проверка пароля. Как вы знаете, некоторые сайты при регистрации хотят пароль от 8 до 20 символов в длину. Честно говоря, это странное ограничение, но что поделать. В математике мы бы написали 8 < x < 20
, но в C# такой трюк не пройдет. Нам придётся сделать два отдельных логических выражения и соединить их специальным оператором «И»:
Вот метод, который принимает пароль и говорит, соответствует ли он условиям (true
) или не соответствует (false
):
// Пароль длиннее 8 символов **И** пароль короче 20 символов.
public static bool IsCorrectPassword(string password)
{
var length = password.Length;
return length > 8 && length < 20;
}
App.IsCorrectPassword("qwerty"); // false
App.IsCorrectPassword("qwerty1234"); // true
&&
- означает «И». Всё выражение считается истинным, только если истинен каждый операнд — каждое из составных выражений. Другими словами, &&
означает «и то, и другое». Приоритет этого оператора ниже, чем приоритет операторов сравнения, поэтому выражение отрабатывает правильно без скобок. Кроме &&
часто используется оператор ||
— «ИЛИ». Он означает «или то, или другое, или оба». Операторы можно комбинировать в любом количестве и любой последовательности, но когда одновременно встречаются &&
и ||
, то приоритет лучше задавать скобками.
a && b || c; // Без скобок сложно понять приоритет
a && (b || c) // Приоритет очевиден
Другой пример. Мы хотим купить квартиру, которая удовлетворяет условиям: площадь от 100 кв. метров и больше на любой улице ИЛИ площадь от 80 кв. метров и больше, но на центральной улице Main Street. Напишем метод, проверяющий квартиру. Он принимает два параметра: площадь (число) и название улицы (строку):
public static bool IsGoodApartment(int area, string street)
{
return area >= 100 || (area >= 80 && "Main Street" == street);
}
App.IsGoodApartment(91, "Queens Street"); // false
App.IsGoodApartment(78, "Queens Street"); // false
App.IsGoodApartment(70, "Main Street"); // false
App.IsGoodApartment(120, "Queens Street"); // true
App.IsGoodApartment(120, "Main Street"); // true
App.IsGoodApartment(80, "Main Street"); // true
Область математики, в которой изучаются логические операторы, называется булевой алгеброй. Ниже показаны «таблицы истинности» — по ним можно определить, каким будет результат применения оператора:
&&
A | B | A && B |
---|---|---|
TRUE | TRUE | TRUE |
TRUE | FALSE | FALSE |
FALSE | TRUE | FALSE |
FALSE | FALSE | FALSE |
||
A | B | A || B |
---|---|---|
TRUE | TRUE | TRUE |
TRUE | FALSE | TRUE |
FALSE | TRUE | TRUE |
FALSE | FALSE | FALSE |
Джон поручил Сэму реализовать автоматическое распознавание солдат Ланнистеров на видео. Идея автоматизировать дозор крепости казалась ему привлекательной. В процессе работы Сэму понадобилось написать функцию, которая определяет, Ланнистер ли перед ним или нет. Немного подумав, Сэм выделил следующие правила определения Ланнистера:
Если у солдата доспехи красного цвета И нет щита
ИЛИ
если у солдата есть щит с изображением льва
то это Ланнистер.
Напишите метод IsLannisterSoldier()
, которая принимает на вход два аргумента:
"red"
.null
если щита нет. Строка "lion"
, если щит есть, и на нём изображен лев.Функция возвращает true
, если распознан Ланнистер, и false
если не распознан.
Примеры вызова:
App.IsLannisterSoldier("red", "lion"); // true
App.IsLannisterSoldier("blue", null); // false
Если вы зашли в тупик, то самое время задать вопрос в «Обсуждениях». Как правильно задать вопрос:
Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.
Это нормально 🙆, в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи.
В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.
Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в «Обсуждениях». Идеально, если вы сформулируете непонятные моменты в виде вопросов. Обычно нам нужно несколько дней для внесения правок.
Кстати, вы тоже можете участвовать в улучшении курсов: внизу есть ссылка на исходный код уроков, который можно править прямо из браузера.
Ваше упражнение проверяется по этим тестам
1#load "/src/Init.csx"
2#load "Exercise.csx"
3
4;
5using PowerAssert;
6
7var actual1 = App.IsLannisterSoldier("blue", null);
8PAssert.IsTrue(() => actual1 == false);
9
10var actual2 = App.IsLannisterSoldier("red", "man");
11PAssert.IsTrue(() => actual2 == false);
12
13var actual3 = App.IsLannisterSoldier("red", "lion");
14PAssert.IsTrue(() => actual3 == true);
15
16var actual4 = App.IsLannisterSoldier("blue", "lion");
17PAssert.IsTrue(() => actual4 == true);
18
19var actual5 = App.IsLannisterSoldier("red", null);
20PAssert.IsTrue(() => actual5 == true);
21
Решение учителя откроется через: