Skip to content

Commit 6c2cae4

Browse files
authored
Merge pull request #18 from DenisKolodich/KD_6.1
Небольшие правки к уроку
2 parents a23ce57 + a96595e commit 6c2cae4

File tree

2 files changed

+22
-17
lines changed

2 files changed

+22
-17
lines changed

lang_c/6/1__otnosheniya_i_usloviya/article.md

Lines changed: 21 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ int main(void)
6767
Отдельно остановимся на проверке равенства (`==`) двух вещественных чисел.
6868
6969
Посмотрите на следующий пример.
70+
7071
Листинг 3. Проверка равенства двух вещественных значений
7172
```c
7273
#include <stdio.h>
@@ -84,7 +85,7 @@ int main(void)
8485

8586
Здесь мы сравниваем между собой вещественное число `1.0` и значения выражений `10 * 0.1` и `0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1`. В математике оба эти отношения, конечно, истинны. Т.к. умножение `10` на `0.1` также как и сложение десяти слагаемых по `0.1` дают единицу.
8687

87-
Но в программировании, как я уже отмечал ранее, прописные математические истины могут давать сбой. Поэтому если мы скомпилируем и запустим это программу, то увидим следующий результат:
88+
Но в программировании, как я уже отмечал ранее, прописные математические истины могут давать сбой. Поэтому если мы скомпилируем и запустим эту программу, то увидим следующий результат:
8889

8990
![Результат сравнения двух вещественных значений](./real_numbers_comparison.png "Рис.1 Результат работы программы Листинг 3. Проверка равенства вещественных значений")
9091

@@ -118,7 +119,7 @@ int main(void)
118119
119120
![](./real_numbers_comparison2.png)
120121
121-
Видите? Хотя все три числа должны быть равны `1.0`, из-за накопления погрешностей число `c` получилось чуть-чуть меньше единицы. Поэтому оператор сравнение `a == c` показывает, что значения в переменных `a` и `c` не равны между собой.
122+
Видите? Хотя все три числа должны быть равны `1.0`, из-за накопления погрешностей число `c` получилось чуть-чуть меньше единицы. Поэтому оператор сравнения `a == c` показывает, что значения в переменных `a` и `c` не равны между собой.
122123
123124
Как же в таком случае правильно сравнивать вещественные числа? Приближённо. Будем проверять, что разница между ними меньше некоторого очень маленького числа (например, `0.00000001`):
124125
@@ -141,7 +142,7 @@ int main(void)
141142
printf("c = %.16f\n", c);
142143
143144
// Точное сравнение
144-
printf("exactly: a == c? %d\n", a == b);
145+
printf("accurately: a == c? %d\n", a == b);
145146
146147
147148
// Приблизительное сравнение с погрешностью
@@ -220,11 +221,11 @@ int main(void)
220221
printf("%d\n", a != b * c); // выражение 2
221222
printf("%d\n", !(a != b * c)); // отрицаине выражения 2
222223

223-
printf("%d\n", !0);
224-
printf("%d\n", !1);
225-
printf("%d\n", !5);
226-
printf("%d\n", !3.14);
227-
printf("%d\n", !'a');
224+
printf("%d\n", !0); // 1
225+
printf("%d\n", !1); // 0
226+
printf("%d\n", !5); // 0
227+
printf("%d\n", !3.14); // 0
228+
printf("%d\n", !'a'); // 0
228229

229230

230231
return 0;
@@ -256,15 +257,17 @@ int main(void)
256257
257258
int main(void)
258259
{
259-
printf("true && true = %d\n", 1 && 1);
260-
printf("true && false = %d\n", 1 && 0);
261-
printf("false && true = %d\n", 0 && 1);
262-
printf("false && false = %d\n", 0 && 0);
260+
printf("true && true = %d\n", 1 && 1); // 1
261+
printf("true && false = %d\n", 1 && 0); // 0
262+
printf("false && true = %d\n", 0 && 1); // 0
263+
printf("false && false = %d\n", 0 && 0); // 0
263264
264265
return 0;
265266
}
266267
```
267268

269+
Запустите этот код у себя в IDE и сверьте результат.
270+
268271
### Оператор `||` логическое ИЛИ
269272

270273
`(условие1) || (условие2)` -- оператор `||`(логическое ИЛИ) возвращает `1`, если хотя бы одно из условий истинно или оба условия истинны. Иначе возвращает значение `0`.
@@ -277,15 +280,17 @@ int main(void)
277280

278281
int main(void)
279282
{
280-
printf("true || true = %d\n", 1 || 1 );
281-
printf("true || false = %d\n", 1 || 0 );
282-
printf("false || true = %d\n", 0 || 1 );
283-
printf("false || false = %d\n", 0 || 0 );
283+
printf("true || true = %d\n", 1 || 1 ); // 1
284+
printf("true || false = %d\n", 1 || 0 ); // 1
285+
printf("false || true = %d\n", 0 || 1 ); // 1
286+
printf("false || false = %d\n", 0 || 0 ); // 0
284287

285288
return 0;
286289
}
287290
```
288291
292+
Проверьте работу и этого кода. Вопрос на повторение: что будет, если заменить `1` на `-1`? Добавьте минус к единице и убедитесь в этом.
293+
289294
% **Важно!**
290295
Обязательно надо использовать два значка для логических операторов И `&&` и ИЛИ `||`. Операторы `&` и `|` тоже есть, но они используются для других целей.
291296

lang_c/6/1__otnosheniya_i_usloviya/practice.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,4 @@
1111
В некоторых языках программирования есть встроенный логический тип данных. В язык Си логический тип данных был добавлен в стандарте C99.
1212
Это тип данных `_Bool`, который хранит только два значения: `0` (ложь) и `1` (истина). Кроме того, этим же стандартом введён заголовочный файл `stdbool.h`, который определяет значения `true` (истина, т.е. `1`) и `false` (ложь, т.е. `0`).
1313

14-
Изучите самостоятельно, как работает тип `_Bool` и заголовочный файл `stdbool.h`.
14+
Изучите самостоятельно, как работает заголовочный файл `stdbool.h` и тип `_Bool`, а также в чём его преимущества перед другими типами. Напишите в комментариях к уроку, что удалось узнать.

0 commit comments

Comments
 (0)