Программы
А что если?..

А что если?..

Условные операторы Си

Быть или не быть...
Звучит как алгоритм!

– аллюзия на Шекспира.
Изображение Изучаем язык программирования Си

Управление потоком выполнения

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

  • Управляющие конструкции
  • Циклы

Управляющие конструкции

В Си выражение типа a = 1; – оператор, а точка с запятой – обязательная завершающая часть оператора. Фигурные скобки – группировка операторов в блоки, синтаксически эквивалентные одному оператору. Мы уже выдели это на предыдущей теме – при объявлении функции main.

Оператор if-else

Оператор if-else определяет процесс принятия альтернативных решений.

if (выражение)
  оператор1
else
  оператор2

Ветка else необязательна. В случае, если выражение истинно, то выполнится оператор1, иначе – оператор2. После чего продолжится выполнение программы после блока if.

В качестве примера напишем программу для целочисленного деления одного числа на другое.

Здесь моментом принятия решения будет проверка знаменателя – операция деления на ноль не определена.

#include <stdio.h>

int main(void) {
  int a;
  int b;
  scanf("%d %d", &a, &b);  // Кладём в a и b два числа со стандартного ввода.

  if (b == 0) {
    return 1;
  }
  else {
    printf("%d\n", a / b);
  }

  return 0;
}

Истина – всего лишь ненулевое значение. 0 = ложь (ну и NULL, но об этом позже). Так что мы могли написать:

...
if (!b) {
  return 1;
}
...

Ещё лучше – инвертировать ветки условий:

...
if (b) {
  printf("%d\n", a / b);
}
else {
  return 1;
}
...

– помимо повышения читаемости, мы ещё и потенциально ускоряем работу на процессорах с конвеерной архитектурой – вероятность исполнения первого условия предполагаемо выше.

Сложный, запутанный и плохой вариант кода для получения максимума:

// ещё и вариант определения переменных (плохой)
float a = 1, b = 2;
if (a)
    if (b / a < 1)
        return 1;
else
    return 0;
return -1;

– довольно вычурный вариант вернуть 1 при a > b, -1 при b >= a, либо 0 в случае, если a == 0.

Предлагаю найти в нём ошибку.

Более корректный вариант:

float a = 1;
float b = 2;

if (a) {
    if (b / a < 1) {
      return 1;
    }
}
else {
    return 0;
}

return -1;

– фигурные скобки явно указывают, что к чему (else применяется к ближайшему if) – используйте их!

else-if

if (выражение1)
  оператор1
else if (выражение2)
  оператор2
else
  оператор3

– эта конструкция – объединение нескольких операторов if-else. Один из способов задать более 2-х вариантов развития событий (аналог elif из python).