Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 8 additions & 8 deletions lang_c/6/2__operator_if_else/article.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,11 +24,11 @@ int main(void)
}
```

Эта программа работае никак не проверяет данные, введённые пользователем. Поэтому, если ввести, например, числа `3.14 2.71`, то получим следующий результат:
Эта программа никак не проверяет данные, введённые пользователем. Поэтому, если ввести, например, числа `3.14 2.71`, то получим следующий результат:

![](./sum2_bad_input.png "Рис.1 Результат работы программы sum2 v.1.0 при вводе некорректных данных")

Проблема, как мы уже понимаем, возникает из-за того, что формат входные данные не соответствует формат-строке `"%d %d"`. Поэтому функция `scanf` запишет значение в переменую `a` и завершится. Давайте это проверим.
Проблема, как мы уже понимаем, возникает из-за того, что формат входных данных не соответствует формат-строке `"%d %d"`. Поэтому функция `scanf` запишет значение в переменную `a` и завершится. Давайте это проверим.

Надеюсь, вы помните, что функция `scanf` в результате своей работы возвращает целое число -- количество переменных, в которые она успешно записала значения из входного потока. Модифицируем наш код, чтобы программа выводила значение, возвращаемое функцией `scanf`, на экран.

Expand Down Expand Up @@ -124,10 +124,10 @@ int main(void)
}
```

Эта программа тоже выведет `TRUE!`. В этом примере управляющее выражения вычислять не требуется, т.к. оно уже записано в виде числового значения `3.14`. Т.к. это не нулевое значение (т.е. истина), то будет выполнена основная ветка конструкции `if-else`.
Эта программа тоже выведет `TRUE!`. В этом примере управляющее выражение вычислять не требуется, т.к. оно уже записано в виде числового значения `3.14`. Т.к. это не нулевое значение (т.е. истина), то будет выполнена основная ветка конструкции `if-else`.


Возвращаемся к программе `sum2`. Добавим в неё инструкцию `if-else`, которая будет проверять значение в переменной `values_read`.
Возвращаемся к программе `sum2`. Добавим в неё инструкцию `if-else`, которая будет проверять значение переменной `values_read`.

Листинг 6. Программа sum2 v.1.2
```c
Expand Down Expand Up @@ -180,7 +180,7 @@ printf("%d + %d = %d\n", a, b, res);
}
```

Чувствую, что у вас возник немой вопрос: "В ветке `else` всего одна инструкция. Зачем её оборачиваться в фигурные скобки?"
Чувствую, что у вас возник немой вопрос: "В ветке `else` всего одна инструкция. Зачем её оборачивать в фигурные скобки?"

С формальной точки зрения, конечно, скобки в этой ветке не нужны. Программа будет корректно работать и без них. Но я всё-таки рекомендую вам всегда использовать фигурные скобки в конструкции `if - else`, даже если в них нет необходимости.

Expand All @@ -203,7 +203,7 @@ if (управляющее_выражение)

Эта инструкция работает аналогично `if-else`, но с небольшим изменением, связанным с отсутствием побочной ветки `else`.

Вычисляется значение управляющего выражения. Если получается ИСТИНА, то выполняется `инструкция_1` из основной ветки, а если ложь, то инструкции из основной ветки игнорируются. А выполняется переходи к следующей инструкции, расположенная после инструкци `if`.
Вычисляется значение управляющего выражения. Если получается ИСТИНА, то выполняется `инструкция_1` из основной ветки, а если ложь, то инструкции из основной ветки игнорируются. А выполнение переходит к следующей инструкции, расположенной после инструкции `if`.

Посмотрите на рисунок.
![Блок-схема инструкции if](./if_scheme.png "Рис.5 Блок-схема инструкции if")
Expand Down Expand Up @@ -233,7 +233,7 @@ int main(void)

Эта программа яркая иллюстрация того, когда сокращённая форма более удобна, нежели полная форма `if-else`.

Если пользователь ввёл отрицательное число, то у него надо заменить знак, что и происходит в основной ветке `if`. А вот если он ввёл нуль или положительное число, то с числом ничего делать не нужно, а значит ветвь `else` в данном конкретном случае нам вовсе не нужна. Программа же в этом случае пропускает всё, что записано в основной ветке, и переходит к выполнению следующей инструкции.
Если пользователь ввёл отрицательное число, то у него надо изменить знак, что и происходит в основной ветке `if`. А вот если он ввёл нуль или положительное число, то с числом ничего делать не нужно, а значит ветвь `else` в данном конкретном случае нам вовсе не нужна. Программа же в этом случае пропускает всё, что записано в основной ветке, и переходит к выполнению следующей инструкции.

Можно было бы использовать и полную форму, но получилась бы менее изящная программа.

Expand Down Expand Up @@ -291,7 +291,7 @@ int main(void)
## Вложенные инструкции if-else

% **Важно!**
В ветках `if-else` можно использовать любые инструкции языка Си, в том числе и инструкции `if-else`.
В ветках `if-else` можно использовать любые инструкции языка Си, в том числе и `if-else`.

Для демонстрации этой возможности, давайте решим [задачу про Квадранты](https://stepik.org/lesson/57210/step/13) из прошлого урока.

Expand Down
2 changes: 1 addition & 1 deletion lang_c/6/2__operator_if_else/meta.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"title": "Инструкция if-else",
"description": "Подробный урок по условным инструкциям if и if-else в языке C. Изучаем базовый синтаксис, составные инструкции, вложенные конструкции и практические примеры обработки пользовательского ввода, проверки данных и ветвления программы.",
"description": "Подробный урок по условным инструкциям if и if-else в языке Си. Изучаем базовый синтаксис, составные инструкции, вложенные конструкции и практические примеры обработки пользовательского ввода, проверки данных и ветвления программы.",
"keywords": "условные инструкции, инструкция if-else, инструкция if, условный оператор, оператор if-else, составные инструкции, вложенные if, каскад if-else-if, обработка ввода, проверка данных, ветвление программы",
"canonical_link": "https://youngcoder.ru/lessons/6/operator_if_else"
}
Expand Down
Loading