• Флаги в аргументах функций

    • Translation
    Вы когда-нибудь сталкивались с таким кодом?

    process(true, false);

    Эта функция, судя по названию, что-то обрабатывает (process). Но что означают параметры? Какой параметр здесь true, а какой false? По вызывающему коду об этом нельзя судить.

    Нам придется заглянуть в объявление функции, которое дает подсказку:

    void process(bool withValidation,
                 bool withNewEngine);

    Очевидно, автор использует два параметра типа bool как флаги (toggles). Реализация функции может быть похожа на это:

    void process(bool withValidation,
                 bool withNewEngine)
    {
      if (withValidation)  // используется 1-й флаг
        validate(); // % подтвердить
     
      do_something_toggle_independent_1
     
      if (withNewEngine)   // используется 2-й флаг
        do_something_new();
      else
        do_something_old();
     
      do_something_toggle_independent_2();
    }

    Назначение флагов очевидно, поскольку каждый из них имеет осмысленное название. Проблема возникает в вызывающем коде.
    Читать дальше →
  • Сумма сумм арифметических прогрессий

    Пускай у нас есть некий ряд ячеек, часть которых можно пометить как «занятые»:

    01

    Нам нужно узнать, сколько всего существует вариантов расположения занятых ячеек.

    К этой схеме сводится множество задач. Например, разбиение периода из N + 1 календарных дней на l + 1 следующих друг за другом меньших периодов. Допустим, мы хотим провести оптимизационный расчет методом «грубой силы», рассчитав целевую функцию для каждого возможного варианта разбиения периода, чтобы выбрать наилучший вариант. Чтобы заранее оценить время расчета, нужно определить количество вариантов. Это поможет принять решение, стоит ли вообще начинать расчет. Согласитесь — полезно будет заранее предупредить пользователя вашей программы, что с теми параметрами, которые он задал, расчет займет 10000 лет.

    Читать дальше →