diff --git a/lang_c/6/1__otnosheniya_i_usloviya/article.md b/lang_c/6/1__otnosheniya_i_usloviya/article.md index a1b84aa..1e4ec8c 100644 --- a/lang_c/6/1__otnosheniya_i_usloviya/article.md +++ b/lang_c/6/1__otnosheniya_i_usloviya/article.md @@ -67,6 +67,7 @@ int main(void) Отдельно остановимся на проверке равенства (`==`) двух вещественных чисел. Посмотрите на следующий пример. + Листинг 3. Проверка равенства двух вещественных значений ```c #include @@ -84,7 +85,7 @@ int main(void) Здесь мы сравниваем между собой вещественное число `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` дают единицу. -Но в программировании, как я уже отмечал ранее, прописные математические истины могут давать сбой. Поэтому если мы скомпилируем и запустим это программу, то увидим следующий результат: +Но в программировании, как я уже отмечал ранее, прописные математические истины могут давать сбой. Поэтому если мы скомпилируем и запустим эту программу, то увидим следующий результат: ![Результат сравнения двух вещественных значений](./real_numbers_comparison.png "Рис.1 Результат работы программы Листинг 3. Проверка равенства вещественных значений") @@ -118,7 +119,7 @@ int main(void) ![](./real_numbers_comparison2.png) -Видите? Хотя все три числа должны быть равны `1.0`, из-за накопления погрешностей число `c` получилось чуть-чуть меньше единицы. Поэтому оператор сравнение `a == c` показывает, что значения в переменных `a` и `c` не равны между собой. +Видите? Хотя все три числа должны быть равны `1.0`, из-за накопления погрешностей число `c` получилось чуть-чуть меньше единицы. Поэтому оператор сравнения `a == c` показывает, что значения в переменных `a` и `c` не равны между собой. Как же в таком случае правильно сравнивать вещественные числа? Приближённо. Будем проверять, что разница между ними меньше некоторого очень маленького числа (например, `0.00000001`): @@ -141,7 +142,7 @@ int main(void) printf("c = %.16f\n", c); // Точное сравнение - printf("exactly: a == c? %d\n", a == b); + printf("accurately: a == c? %d\n", a == b); // Приблизительное сравнение с погрешностью @@ -220,11 +221,11 @@ int main(void) printf("%d\n", a != b * c); // выражение 2 printf("%d\n", !(a != b * c)); // отрицаине выражения 2 - printf("%d\n", !0); - printf("%d\n", !1); - printf("%d\n", !5); - printf("%d\n", !3.14); - printf("%d\n", !'a'); + printf("%d\n", !0); // 1 + printf("%d\n", !1); // 0 + printf("%d\n", !5); // 0 + printf("%d\n", !3.14); // 0 + printf("%d\n", !'a'); // 0 return 0; @@ -256,15 +257,17 @@ int main(void) int main(void) { - printf("true && true = %d\n", 1 && 1); - printf("true && false = %d\n", 1 && 0); - printf("false && true = %d\n", 0 && 1); - printf("false && false = %d\n", 0 && 0); + printf("true && true = %d\n", 1 && 1); // 1 + printf("true && false = %d\n", 1 && 0); // 0 + printf("false && true = %d\n", 0 && 1); // 0 + printf("false && false = %d\n", 0 && 0); // 0 return 0; } ``` +Запустите этот код у себя в IDE и сверьте результат. + ### Оператор `||` логическое ИЛИ `(условие1) || (условие2)` -- оператор `||`(логическое ИЛИ) возвращает `1`, если хотя бы одно из условий истинно или оба условия истинны. Иначе возвращает значение `0`. @@ -277,15 +280,17 @@ int main(void) int main(void) { - printf("true || true = %d\n", 1 || 1 ); - printf("true || false = %d\n", 1 || 0 ); - printf("false || true = %d\n", 0 || 1 ); - printf("false || false = %d\n", 0 || 0 ); + printf("true || true = %d\n", 1 || 1 ); // 1 + printf("true || false = %d\n", 1 || 0 ); // 1 + printf("false || true = %d\n", 0 || 1 ); // 1 + printf("false || false = %d\n", 0 || 0 ); // 0 return 0; } ``` +Проверьте работу и этого кода. Вопрос на повторение: что будет, если заменить `1` на `-1`? Добавьте минус к единице и убедитесь в этом. + % **Важно!** Обязательно надо использовать два значка для логических операторов И `&&` и ИЛИ `||`. Операторы `&` и `|` тоже есть, но они используются для других целей. diff --git a/lang_c/6/1__otnosheniya_i_usloviya/practice.md b/lang_c/6/1__otnosheniya_i_usloviya/practice.md index 1691d90..4f3a6c7 100644 --- a/lang_c/6/1__otnosheniya_i_usloviya/practice.md +++ b/lang_c/6/1__otnosheniya_i_usloviya/practice.md @@ -11,4 +11,4 @@ В некоторых языках программирования есть встроенный логический тип данных. В язык Си логический тип данных был добавлен в стандарте C99. Это тип данных `_Bool`, который хранит только два значения: `0` (ложь) и `1` (истина). Кроме того, этим же стандартом введён заголовочный файл `stdbool.h`, который определяет значения `true` (истина, т.е. `1`) и `false` (ложь, т.е. `0`). -Изучите самостоятельно, как работает тип `_Bool` и заголовочный файл `stdbool.h`. +Изучите самостоятельно, как работает заголовочный файл `stdbool.h` и тип `_Bool`, а также в чём его преимущества перед другими типами. Напишите в комментариях к уроку, что удалось узнать.