generated from hexlet-basics/exercises-template
-
Notifications
You must be signed in to change notification settings - Fork 3
/
description.ru.yml
136 lines (99 loc) · 7.02 KB
/
description.ru.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
---
name: Логические операторы
theory: |
Логические выражения могут объединяться друг с другом, создавая все более хитрые проверки. Хороший пример: проверка пароля. Как вы знаете, некоторые сайты при регистрации хотят пароль от 8 до 20 символов в длину. Честно говоря, это странное ограничение, но что поделать. В математике мы бы написали `8 < x < 20` (где `x` это длина конкретного пароля), но в JavaScript такой трюк не пройдет. Нам придётся сделать два отдельных логических выражения и соединить их специальным оператором «И»:
```
Пароль длиннее 8 символов **И** пароль короче 20 символов.
```
Вот функция, которая принимает пароль и говорит, соответствует ли он условиям, или не соответствует:
```javascript
const isStrongPassword = (password) => {
const length = password.length;
return length > 8 && length < 20;
};
isStrongPassword('qwerty'); // false
isStrongPassword('qwerty1234'); // true
isStrongPassword('zxcvbnmasdfghjkqwertyui'); // false
```
`&&` - означает «И» (в математической логике это называют конъюнкцией). Всё выражение считается истинным только в том случае, когда истинен каждый операнд — каждое из составных выражений. Иными словами, `&&` означает «и то, и другое».
Приоритет этого оператора ниже, чем приоритет операторов сравнения, поэтому выражение отрабатывает правильно без скобок.
Кроме `&&`, часто используется оператор `||` — «ИЛИ» (дизъюнкция). Он означает «или то, или другое, или оба». Операторы можно комбинировать в любом количестве и любой последовательности, но когда одновременно встречаются `&&` и `||`, то приоритет лучше задавать скобками. Ниже пример расширенной функции определения корректности пароля:
```javascript
const hasSpecialChars = (str) => /* проверяет содержание специальных символов в строке */;
const hasCapitalChars = (str) => /* проверяет содержание заглавных букв в строке */
const isStrongPassword = (password) => {
const length = password.length;
// Скобки задают приоритет. Понятно что к чему относится.
return length > 8 && (hasSpecialChars(password) || hasCapitalChars(password));
};
```
Другой пример. Мы хотим купить квартиру, которая удовлетворяет условиям: площадь от 100 кв. метров и больше на любой улице **ИЛИ** площадь от 80 кв. метров и больше, но на центральной улице `Main Street`.
Напишем функцию, проверяющую квартиру. Она принимает два аргумента: площадь (число) и название улицы (строку):
```javascript
const isGoodApartment = (area, street) => {
// Через переменную, чтобы функция была не слишком длинной
const result = area >= 100 || (area >= 80 && street === 'Main Street');
return result;
};
isGoodApartment(91, 'Queens Street'); // false
isGoodApartment(78, 'Queens Street'); // false
isGoodApartment(70, 'Main Street'); // false
isGoodApartment(120, 'Queens Street'); // true
isGoodApartment(120, 'Main Street'); // true
isGoodApartment(80, 'Main Street'); // true
```
https://replit.com/@hexlet/js-basics-logical-operators
Область математики, в которой изучаются логические операторы, называется булевой алгеброй. Ниже показаны «таблицы истинности» — по ним можно определить, каким будет результат применения оператора:
## И `&&`
| A | B | A && B |
|-------| ------|----------|
| TRUE | TRUE | **TRUE** |
| TRUE | FALSE | FALSE |
| FALSE | TRUE | FALSE |
| FALSE | FALSE | FALSE |
Пара примеров:
```javascript
// true && true;
3 > 2 && 'wow'.startsWith('w'); // true
// true && false;
'start' === 'start' && 8 < 3; // false
```
## ИЛИ `||`
| A | B | A || B |
|-------|-------|----------|
| TRUE | TRUE | **TRUE** |
| TRUE | FALSE | **TRUE** |
| FALSE | TRUE | **TRUE** |
| FALSE | FALSE | FALSE |
Пара примеров:
```javascript
// true || true;
3 > 2 || 'wow'.startsWith('w'); // true
// false || false;
'start' === 'Start' || 3 < 3; // false
```
instructions: |
Реализуйте функцию `isLeapYear()`, которая определяет, является ли год високосным или нет. Год будет високосным, если он кратен (то есть делится без остатка) 400 или он одновременно кратен 4 и не кратен 100. Как видите, в определении уже заложена вся необходимая логика, осталось только переложить её на код:
```javascript
isLeapYear(2018); // false
isLeapYear(2017); // false
isLeapYear(2016); // true
```
Кратность можно проверять так:
```javascript
// % - возвращает остаток от деления левого операнда на правый
// Проверяем что number кратен 10
number % 10 === 0
// Проверяем что number не кратен 10
number % 10 !== 0
```
tips:
- |
[Булева алгебра](https://ru.wikipedia.org/wiki/Булева_алгебра)
- |
[Конъюнкция](https://ru.wikipedia.org/wiki/Конъюнкция)
- |
[Дизъюнкция](https://ru.wikipedia.org/wiki/Дизъюнкция)
definitions:
- name: "Логические операторы"
description: "операторы «И» (&&), «ИЛИ» (||), позволяющие создавать составные логические условия."