Skip to content

Commit d1f1d39

Browse files
committed
2 parents 529a36f + 47d47c7 commit d1f1d39

File tree

2 files changed

+18
-16
lines changed

2 files changed

+18
-16
lines changed

lang_c/6/2__operator_if_else/article.md

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -234,13 +234,15 @@ int main(void)
234234
}
235235
```
236236
237-
Эта программа яркая иллюстрация того, когда сокращённая форма более удобна, нежели полная форма `if-else`.
237+
Эта программа -- яркая иллюстрация того случая, когда сокращённая форма более удобна, нежели полная форма `if-else`.
238238
239239
Если пользователь ввёл отрицательное число, то у него надо изменить знак, что и происходит в основной ветке `if`. А вот если он ввёл нуль или положительное число, то с числом ничего делать не нужно, а значит ветвь `else` в данном конкретном случае нам вовсе не нужна. Программа же в этом случае пропускает всё, что записано в основной ветке, и переходит к выполнению следующей инструкции.
240240
241241
Можно было бы использовать и полную форму, но получилась бы менее изящная программа.
242242
243243
Например, такая:
244+
245+
Листинг 10.
244246
```c
245247
#include <stdio.h>
246248
@@ -261,7 +263,7 @@ int main(void)
261263

262264
Кстати, сокращённую форму довольно часто используют для проверки корректности входных данных. Например, программу из sum2 v.1.2 (Листинг 6) можно переписать следующим образом:
263265

264-
Листинг 10. Программа sum2 v.2.0
266+
Листинг 11. Программа sum2 v.2.0
265267
```c
266268
#include <stdio.h>
267269

@@ -284,7 +286,7 @@ int main(void)
284286
285287
Здесь мы проверяем количество значений, считанных функцией `scanf`, и если оно не равно двум, то выводим сообщение об ошибке. Затем сразу вызываем инструкцию `return -1;`, чтобы завершить выполнение функции `main`, а значит и выполнение всей программы. При этом, чтобы сообщить операционной системе, что программа завершилась из-за ошибки, мы возвращаем значение `-1`, а не `0` как мы обычно делаем. Такой подход называется =ранние возраты (early returns)=. Его суть заключается в том, чтобы проверить необходимые условия сразу в начале программы/функции и если они не выполнены, то завершить программу/функцию. Здесь инструкция `if` выступает как бы в роли охранника на входе в здание. Если ему что-то не нравится (условия не выполняются), он тебя сразу выпроваживает.
286288
287-
В программе sum2 v.1.2 (Листинг 6) основные вычисления были спрятаны где-то внутри инструкции `if`, что не очень наглядно. Программа sum2 v.2.0 (Листинг 10) выглядит более изящно и логично. В ней сразу видны три основных блока:
289+
В программе sum2 v.1.2 (Листинг 6) основные вычисления были спрятаны где-то внутри инструкции `if`, что не очень наглядно. Программа sum2 v.2.0 (Листинг 11) выглядит более изящно и логично. В ней сразу видны три основных блока:
288290
289291
- объявление переменных и ввод данных;
290292
- проверка корректности введённых данных;
@@ -300,7 +302,7 @@ int main(void)
300302
301303
По координатам точки на плоскости определить, какому квадранту она принадлежит. Для определённости предполагаем, что ни одна из координат не равна нулю.
302304
303-
Листинг 11. Программа для определения квадранта
305+
Листинг 12. Программа для определения квадранта
304306
```c
305307
#include <stdio.h>
306308
@@ -334,18 +336,18 @@ int main(void)
334336
% **Рекомендация!**
335337
Старайтесь не увлекаться вложенными конструкциями `if-else`. Они делают код менее понятным. Если внутри вложенной конструкции `if-else` вы хотите добавить ещё одну конструкцию `if`/`if-else`, то вам надо подумать о том, как сделать код проще и понятнее.
336338

337-
Говоря о вложенных инструкция `if-else`, необходимо упомянуть про один важный нюанс.
339+
Говоря о вложенных инструкциях `if-else`, необходимо упомянуть про один важный нюанс.
338340

339341
% **Важно!**
340342
Ветка `else` всегда относится к ближайшему `if`, у которого нет своего `else`.
341343

342344
Разберём следующую демонстрационную программу, которая вычисляет стоимость покупки с учётом скидок по следующим правилам:
343345

344-
- для покупок до `10000` рублей применяются скидка, накопленная на клубной карте покупателя (значение хранится в переменной `discount`);
346+
- для покупок до `10000` рублей применяется скидка, накопленная на клубной карте покупателя (значение хранится в переменной `discount`);
345347
- если клубная карта отсутствует, то в переменной `discount` будет значение `0`;
346348
- для покупок от `10000` рублей применяется фиксированная скидка в `8%`.
347349

348-
Листинг 12.
350+
Листинг 13.
349351
```c
350352
#include <stdio.h>
351353

@@ -376,7 +378,7 @@ int main(void)
376378
377379
Понятно, что для исправления этой программы нужно сделать так, чтобы `else` относилась к первой инструкции `if`, а не ко второй. Для этого мы можем с помощью фигурных скобок явно указать вложенность конструкций:
378380
379-
Листинг 13.
381+
Листинг 14.
380382
```c
381383
#include <stdio.h>
382384
@@ -409,7 +411,7 @@ int main(void)
409411

410412
## Лесенка из вложенных if-else
411413

412-
Давайте напишем программу для перевода отметки из `100` бальной шкалы в пятибальную. На вход программы поступает число от `0` до `100`.
414+
Давайте напишем программу для перевода отметки из `100` балльной шкалы в пятибалльную. На вход программы поступает число от `0` до `100`.
413415

414416
Правила соответствия между шкалами:
415417

@@ -420,7 +422,7 @@ int main(void)
420422

421423
Мы могли бы написать несколько отдельных конструкций `if`. Это самый "лобовой" способ.
422424

423-
Листинг 14.
425+
Листинг 15.
424426
```c
425427
#include <stdio.h>
426428

@@ -458,9 +460,9 @@ int main(void)
458460
459461
Аналогично, если условия и в первом `if` и втором `if` ложны, то в третьей инструкции `if` условие `score < 70` заведомо истинно. Такое же рассуждение будет верно и для оставшейся инструкций `if`.
460462
461-
Поэтому код из Листинга 14 можно переписать в виде следующей лесенки (каскада) из вложенных конструкций `if-else`.
463+
Поэтому код из Листинга 15 можно переписать в виде следующей лесенки (каскада) из вложенных конструкций `if-else`.
462464
463-
Листинг 15.
465+
Листинг 16.
464466
```c
465467
#include <stdio.h>
466468
@@ -493,7 +495,7 @@ int main(void)
493495

494496
Обычно такие каскады записывают в более компактном виде:
495497

496-
Листинг 16.
498+
Листинг 17.
497499
```c
498500
#include <stdio.h>
499501

lang_c/6/2__operator_if_else/practice.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,14 @@
88

99
- Подумайте, всегда ли можно заменить `if (a != 0)` на `if (a)`, если `a` это какая-либо переменная типа `int`, `float`, `double` или `char`.
1010

11-
- Перепишите программу определения квадранта (Листинг 11) с использованием каскада вложенных инструкций `if-else`.
11+
- Перепишите программу определения квадранта (Листинг 12) с использованием каскада вложенных инструкций `if-else`.
1212

13-
- Перепишите программу определения квадранта (Листинг 11) без использования вложенных инструкций `if-else`.
13+
- Перепишите программу определения квадранта (Листинг 12) без использования вложенных инструкций `if-else`.
1414

1515
### Исследовательские задачи для хакеров:
1616

1717
- В языке Си существует ещё одна конструкция, работающая с условными выражениями -- это =тернарный условный оператор= `? : `. Самостоятельно разберитесь, как он работает.
1818

19-
- Мы исправили только **часть** потенциальных проблем в программе сложения двух целых чисел. Подберите примеры входных данных, на которых программа из Листинга 10 будет выдавать неправильный результат. Свои варианты напишите в комментарии к этому уроку.
19+
- Мы исправили только **часть** потенциальных проблем в программе сложения двух целых чисел. Подберите примеры входных данных, на которых программа из Листинга 11 будет выдавать неправильный результат. Свои варианты напишите в комментарии к этому уроку.
2020

2121
- Подумайте, можно ли любой кусок кода с вложенными `if-else` переписать без использования вложенности?

0 commit comments

Comments
 (0)