Всякий раз, когда есть несколько / много переменных, оканчивающихся цифрой, таких как foo1
, foo2
, foo3
и т. Д., Это указывает на то, что мы должны использовать массив [и цикл вместо репликации кода] .
Если у нас есть несколько параллельных массивов, которые проиндексированы одной и той же индексной переменной, например:
#define LAPCOUNT 4
int time_tot[LAPCOUNT];
int time_min[LAPCOUNT];
int time_sec[LAPCOUNT];
Это указывает на то, что мы должны создать struct
и иметь массив этих структур.
Вот версия вашего кода, которая использует эти идеи:
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int time_tot;
int time_min;
int time_sec;
} lap_t;
#define LAPCOUNT 4
int
main(void)
{
char SquirrelName[20];
int lapidx;
lap_t *lap;
lap_t laplist[LAPCOUNT];
lap_t laptot;
printf("What is the name of the squirrel? \n");
scanf("%s", SquirrelName);
for (lapidx = 0; lapidx < LAPCOUNT; ++lapidx) {
lap = &laplist[lapidx];
printf("How long did it take to complete lap %d in Seconds? \n",
lapidx + 1);
scanf("%d", &lap->time_tot);
lap->time_min = lap->time_tot / 60;
lap->time_sec = lap->time_tot % 60;
printf("Lap %d finished in %d minutes and %d seconds\n",
lapidx + 1,lap->time_min, lap->time_sec);
}
laptot.time_min = 0;
laptot.time_sec = 0;
laptot.time_tot = 0;
for (lapidx = 0; lapidx < LAPCOUNT; ++lapidx) {
lap = &laplist[lapidx];
laptot.time_min += lap->time_min;
laptot.time_sec += lap->time_sec;
laptot.time_tot += lap->time_tot;
}
#if 0
printf("The total time it took for the course to complete was %d minutes and %d seconds\n",
laptot.time_min,laptot.time_sec);
#else
laptot.time_min = laptot.time_tot / 60;
laptot.time_sec = laptot.time_tot / 60;
printf("The total time it took for the course to complete was %d minutes and %d seconds\n",
laptot.time_min,laptot.time_sec);
#endif
return 0;
}
UPDATE:
Спасибо, я определенно посмотрю на это
Это важная концепция для будущего.
Использование массива стало бы более очевидным, если бы количество кругов было больше, скажем, 100 вместо 4 *.
При разработке алгоритма важно задать себе следующий вопрос: Масштабируется ли моё решение [вверх]?
A struct
- это форма или запись [базы данных]. Он объединяет все связанные вещи. Форма - это отдельный лист бумаги, на котором есть вся информация по данной теме (например, налоговая форма или кадровый учет).
Рассмотрим простую кадровую запись:
typedef struct {
char person_name[100];
char person_street[100];
char person_city[100];
char person_state[2];
char person_telno[10];
int person_age;
float person_salary;
} person;
Это похоже на наличие одной страницы на человека, и файл сотрудника содержит все такие страницы.
Без идеи struct
нам потребовались бы отдельные папки с файлами для каждого из указанных выше полей записи
Имена:
Smith, John
Jones, Fred
Miller, Mary
Улица:
123 Main St
235 Elm St
63 Oak Ave
Город:
New York
Chicago
Los Angeles
Используя struct
, наша организация будет выглядеть примерно так:
Smith, John 123 Main St New York
Jones, Fred 235 Elm St Chicago
Miller, Mary 63 Oak Ave Los Angeles
В этих условиях реального мира, конечно, такая организация данных кажется очевидной. Но при кодировании, особенно для более абстрактных вещей, иногда это может быть затруднено из-за сложности проблемы.
Возможность улучшить / уменьшить код [часто я гарантирую, что используемые структуры данных минимальны и полны], может сделать код простым, чистым и надежным.
Это может случиться даже с опытными программистами. В реальном коммерческом продукте, над которым я работал, я обнаружил, что используются «параллельные массивы». Я реорганизовал код для использования массива нового struct
, который я создал. Я сделал это только для упрощения / очистки кода. В ходе этого процесса мне удалось обнаружить и исправить по крайней мере пять ошибок, которые были скрытыми и неочевидными до момента очистки.