Можно вычислять максимум сразу, без массива времён и второго цикла. Но сначала нужен определённый контракт ошибок: при нулевой скорости исходник читает неинициализированное 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. Диагностику и счётчик обращений лучше вынести наружу. При корректных входах результат прежний; поведение при ошибках теперь явно задано, поскольку в исходнике оно не было корректным.