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

А что если?..

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

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

– аллюзия на Шекспира.

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

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

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

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

В Си выражение типа 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).

Также может быть вам интересно:

Арифметика

Всем привычные арифметические операции в рамках Си

Читать »

Оператор switch

Читать »
Фото Как сделать свою middleware в Django (с примерами)

Как сделать свою middleware в Django (с примерами)

Middleware или "промежуточное программное обеспечение" - элегантный способ установить общие правила обработки запросов и ответов приложения. Давайте напишем парочку middleware, чтобы понять, как они работают.

Фото Как настроить отправку почты из Django

Как настроить отправку почты из Django

Письма об ошибках, отчёты на почту, восстановление паролей - всё это полезно при работе с сайтом. Django предоставляет удобный способ это сделать с минимумом настроек!

Фото Добавляем поддержку медиа-файлов в Django проект

Добавляем поддержку медиа-файлов в Django проект

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

Фото Настройка журналирования (логирования) в Python с примерами

Настройка журналирования (логирования) в Python с примерами

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

Фото Нет слов, одни... однострочники

Нет слов, одни... однострочники

На днях вышел пост со списком полезных однострочников для JavaScript программистов. Памятуя Perl-овую молодость, заглянул туда.

Фото Добавляем переменные в контекст Django шаблонов (свой контекст-процессор)

Добавляем переменные в контекст Django шаблонов (свой контекст-процессор)

В Django вы можете передавать данные в шаблоны посредством контекстов. Контекст передаётся из контроллера (view в терминах Django), однако, если одни и те же данные нужны в разных местах, лучше сделать свой контекст-процессор.

Фото Пример своей консольной команды в Django проекте

Пример своей консольной команды в Django проекте

Если вы работали с Django проектом, то, скорее всего, запускали команды из консоли (manage.py). В Django есть простой способ писать свои команды для управления проектом.

Фото Разграничение прав доступа на Django сайте

Разграничение прав доступа на Django сайте

Почти на любом веб-сайте необходимо разделять пользователей на группы и предоставлять им разные возможности. В Django есть довольно серьёзная система прав доступа для пользователей - давайте её рассмотрим!