Оптимизация и рефакторинг функции расчёта максимального времени

Можно вычислять максимум сразу, без массива времён и второго цикла. Но сначала нужен определённый контракт ошибок: при нулевой скорости исходник читает неинициализированное t[i].

Короткий ответ

Что ответить на собеседовании

Можно вычислять максимум сразу, без массива времён и второго цикла. Но сначала нужен определённый контракт ошибок: при нулевой скорости исходник читает неинициализированное t[i].

Подробный разбор

Ответ с пояснениями

Условие

В задаче требуется улучшить структуру и читаемость уже написанного кода, отвечающего за вычисление максимального времени, необходимого набору устройств пройти заданное расстояние S. Ниже приведён исходный фрагмент на C, который необходимо проанализировать и привести к более чистому виду, сохранив его функциональность.

/*
There are several devices, connected in chain like this:

start_idx---|
            |
D - D - D - A - A - A - A - B - B - D - D
            |-------- N --------|

Task is to get speeds of N devices, and calculate max time to traverse some distance S.
*/

# define A 4
# define B 2

# define N A + B

// Get speed of device with index `idx`
double get_motor_speed(int idx);

static float counter = 0;

// Calculate the max time for the motors to traverse the distance `S`
double calc_max_time(double S, int start_idx)
{
    double t[N];
    for (int i = 0, n = start_idx; i < N; i++, n++)
    {
        double v = get_motor_speed(n);
        counter += 1;

        if (v == 0)
            printf("error, can't divide by zero\n");
        else
        {
            printf("%f\n", S / v);
            t[i] = S / v;
        }
    }

    double result = 0;

    for (int i = 0; i < N; i++)
    {
        if (t[i] > result)
            result = t[i];
    }

    return result;
}

Необходимо:

  • устранить дублирование кода,
  • вынести константы и расчёты в отдельные функции/структуры,
  • обеспечить более понятные имена переменных и комментариев,
  • минимизировать использование глобального состояния (counter).

В результате полученный код должен быть легче поддерживать и тестировать, при этом сохранять исходную бизнес‑логику.

Ответ

Можно вычислять максимум сразу, без массива времён и второго цикла. Но сначала нужен определённый контракт ошибок: при нулевой скорости исходник читает неинициализированное t[i].

Ниже для отрицательного расстояния, нечисловых значений и неположительной скорости выбран возврат NAN:

#include <math.h>

enum { GROUP_A = 4, GROUP_B = 2, DEVICE_COUNT = GROUP_A + GROUP_B };

double calc_max_time(double distance, int start_idx)
{
    if (!isfinite(distance) || distance < 0) return NAN;
    double max_time = 0;
    for (int offset = 0; offset < DEVICE_COUNT; ++offset) {
        double speed = get_motor_speed(start_idx + offset);
        if (!isfinite(speed) || speed <= 0) return NAN;
        double travel_time = distance / speed;
        if (travel_time > max_time) max_time = travel_time;
    }
    return max_time;
}

Индексы устройств должны быть валидны, сложение индекса — представимо в int. Диагностику и счётчик обращений лучше вынести наружу. При корректных входах результат прежний; поведение при ошибках теперь явно задано, поскольку в исходнике оно не было корректным.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее