You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: lang_c/6/2__operator_if_else/article.md
+15-13Lines changed: 15 additions & 13 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -234,13 +234,15 @@ int main(void)
234
234
}
235
235
```
236
236
237
-
Эта программа яркая иллюстрация того, когда сокращённая форма более удобна, нежели полная форма `if-else`.
237
+
Эта программа -- яркая иллюстрация того случая, когда сокращённая форма более удобна, нежели полная форма `if-else`.
238
238
239
239
Если пользователь ввёл отрицательное число, то у него надо изменить знак, что и происходит в основной ветке `if`. А вот если он ввёл нуль или положительное число, то с числом ничего делать не нужно, а значит ветвь `else` в данном конкретном случае нам вовсе не нужна. Программа же в этом случае пропускает всё, что записано в основной ветке, и переходит к выполнению следующей инструкции.
240
240
241
241
Можно было бы использовать и полную форму, но получилась бы менее изящная программа.
242
242
243
243
Например, такая:
244
+
245
+
Листинг 10.
244
246
```c
245
247
#include <stdio.h>
246
248
@@ -261,7 +263,7 @@ int main(void)
261
263
262
264
Кстати, сокращённую форму довольно часто используют для проверки корректности входных данных. Например, программу из sum2 v.1.2 (Листинг 6) можно переписать следующим образом:
263
265
264
-
Листинг 10. Программа sum2 v.2.0
266
+
Листинг 11. Программа sum2 v.2.0
265
267
```c
266
268
#include<stdio.h>
267
269
@@ -284,7 +286,7 @@ int main(void)
284
286
285
287
Здесь мы проверяем количество значений, считанных функцией `scanf`, и если оно не равно двум, то выводим сообщение об ошибке. Затем сразу вызываем инструкцию `return -1;`, чтобы завершить выполнение функции `main`, а значит и выполнение всей программы. При этом, чтобы сообщить операционной системе, что программа завершилась из-за ошибки, мы возвращаем значение `-1`, а не `0` как мы обычно делаем. Такой подход называется =ранние возраты (early returns)=. Его суть заключается в том, чтобы проверить необходимые условия сразу в начале программы/функции и если они не выполнены, то завершить программу/функцию. Здесь инструкция `if` выступает как бы в роли охранника на входе в здание. Если ему что-то не нравится (условия не выполняются), он тебя сразу выпроваживает.
286
288
287
-
В программе sum2 v.1.2 (Листинг 6) основные вычисления были спрятаны где-то внутри инструкции `if`, что не очень наглядно. Программа sum2 v.2.0 (Листинг 10) выглядит более изящно и логично. В ней сразу видны три основных блока:
289
+
В программе sum2 v.1.2 (Листинг 6) основные вычисления были спрятаны где-то внутри инструкции `if`, что не очень наглядно. Программа sum2 v.2.0 (Листинг 11) выглядит более изящно и логично. В ней сразу видны три основных блока:
288
290
289
291
- объявление переменных и ввод данных;
290
292
- проверка корректности введённых данных;
@@ -300,7 +302,7 @@ int main(void)
300
302
301
303
По координатам точки на плоскости определить, какому квадранту она принадлежит. Для определённости предполагаем, что ни одна из координат не равна нулю.
302
304
303
-
Листинг 11. Программа для определения квадранта
305
+
Листинг 12. Программа для определения квадранта
304
306
```c
305
307
#include <stdio.h>
306
308
@@ -334,18 +336,18 @@ int main(void)
334
336
% **Рекомендация!**
335
337
Старайтесь не увлекаться вложенными конструкциями `if-else`. Они делают код менее понятным. Если внутри вложенной конструкции `if-else` вы хотите добавить ещё одну конструкцию `if`/`if-else`, то вам надо подумать о том, как сделать код проще и понятнее.
336
338
337
-
Говоря о вложенных инструкция`if-else`, необходимо упомянуть про один важный нюанс.
339
+
Говоря о вложенных инструкциях`if-else`, необходимо упомянуть про один важный нюанс.
338
340
339
341
% **Важно!**
340
342
Ветка `else` всегда относится к ближайшему `if`, у которого нет своего `else`.
341
343
342
344
Разберём следующую демонстрационную программу, которая вычисляет стоимость покупки с учётом скидок по следующим правилам:
343
345
344
-
- для покупок до `10000` рублей применяются скидка, накопленная на клубной карте покупателя (значение хранится в переменной `discount`);
346
+
- для покупок до `10000` рублей применяется скидка, накопленная на клубной карте покупателя (значение хранится в переменной `discount`);
345
347
- если клубная карта отсутствует, то в переменной `discount` будет значение `0`;
346
348
- для покупок от `10000` рублей применяется фиксированная скидка в `8%`.
347
349
348
-
Листинг 12.
350
+
Листинг 13.
349
351
```c
350
352
#include<stdio.h>
351
353
@@ -376,7 +378,7 @@ int main(void)
376
378
377
379
Понятно, что для исправления этой программы нужно сделать так, чтобы `else` относилась к первой инструкции `if`, а не ко второй. Для этого мы можем с помощью фигурных скобок явно указать вложенность конструкций:
378
380
379
-
Листинг 13.
381
+
Листинг 14.
380
382
```c
381
383
#include <stdio.h>
382
384
@@ -409,7 +411,7 @@ int main(void)
409
411
410
412
## Лесенка из вложенных if-else
411
413
412
-
Давайте напишем программу для перевода отметки из `100`бальной шкалы в пятибальную. На вход программы поступает число от `0` до `100`.
414
+
Давайте напишем программу для перевода отметки из `100`балльной шкалы в пятибалльную. На вход программы поступает число от `0` до `100`.
413
415
414
416
Правила соответствия между шкалами:
415
417
@@ -420,7 +422,7 @@ int main(void)
420
422
421
423
Мы могли бы написать несколько отдельных конструкций `if`. Это самый "лобовой" способ.
422
424
423
-
Листинг 14.
425
+
Листинг 15.
424
426
```c
425
427
#include<stdio.h>
426
428
@@ -458,9 +460,9 @@ int main(void)
458
460
459
461
Аналогично, если условия и в первом `if` и втором `if` ложны, то в третьей инструкции `if` условие `score < 70` заведомо истинно. Такое же рассуждение будет верно и для оставшейся инструкций `if`.
460
462
461
-
Поэтому код из Листинга 14 можно переписать в виде следующей лесенки (каскада) из вложенных конструкций `if-else`.
463
+
Поэтому код из Листинга 15 можно переписать в виде следующей лесенки (каскада) из вложенных конструкций `if-else`.
462
464
463
-
Листинг 15.
465
+
Листинг 16.
464
466
```c
465
467
#include <stdio.h>
466
468
@@ -493,7 +495,7 @@ int main(void)
493
495
494
496
Обычно такие каскады записывают в более компактном виде:
Copy file name to clipboardExpand all lines: lang_c/6/2__operator_if_else/practice.md
+3-3Lines changed: 3 additions & 3 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -8,14 +8,14 @@
8
8
9
9
- Подумайте, всегда ли можно заменить `if (a != 0)` на `if (a)`, если `a` это какая-либо переменная типа `int`, `float`, `double` или `char`.
10
10
11
-
- Перепишите программу определения квадранта (Листинг 11) с использованием каскада вложенных инструкций `if-else`.
11
+
- Перепишите программу определения квадранта (Листинг 12) с использованием каскада вложенных инструкций `if-else`.
12
12
13
-
- Перепишите программу определения квадранта (Листинг 11) без использования вложенных инструкций `if-else`.
13
+
- Перепишите программу определения квадранта (Листинг 12) без использования вложенных инструкций `if-else`.
14
14
15
15
### Исследовательские задачи для хакеров:
16
16
17
17
- В языке Си существует ещё одна конструкция, работающая с условными выражениями -- это =тернарный условный оператор= `? : `. Самостоятельно разберитесь, как он работает.
18
18
19
-
- Мы исправили только **часть** потенциальных проблем в программе сложения двух целых чисел. Подберите примеры входных данных, на которых программа из Листинга 10 будет выдавать неправильный результат. Свои варианты напишите в комментарии к этому уроку.
19
+
- Мы исправили только **часть** потенциальных проблем в программе сложения двух целых чисел. Подберите примеры входных данных, на которых программа из Листинга 11 будет выдавать неправильный результат. Свои варианты напишите в комментарии к этому уроку.
20
20
21
21
- Подумайте, можно ли любой кусок кода с вложенными `if-else` переписать без использования вложенности?
0 commit comments