Должен быть напечатан список всех элементов с термином, отсортированным в порядке возрастания ....
Хотя основная логика вашего кода верна, но она будет отсортирована впо убыванию, а не по возрастанию из-за <=
в этом операторе:
if (info[j].term <= info[k].term) {
^^
Если вы хотите отсортировать в порядке возрастания, используйте оператор >
.
В этом цикле
for (f=0; f<=i; f++){
sorter[f] = f;
}
ваша программа обращается к массиву sorter
за его пределами.Размер массива sorter
равен 50
, индексирован от 0
до 49
, и из-за условия цикла f<=i
он получает доступ к sorter[50]
, который превышает размер массива.
Посмотрите на printf(...
в последнем цикле:
for (m=0; m<i; m++)
{ printf("%lu %lu %s %2d \n", info[sorter[m]].term),
info[sorter[m]].id_num, info[sorter[m]].dept,
info[sorter[m]].crs_num}
Разве компилятор не выдает ошибку в этом выражении?)
неправильно расположен.Кроме того, нет точки с запятой в конце оператора printf
.
Это должно быть:
for (m=0; m<i; m++)
{
printf("%lu %lu %s %2d \n", info[sorter[m]].term,
info[sorter[m]].id_num,
info[sorter[m]].dept,
info[sorter[m]].crs_num);
}
Пример кода с использованием 5
жестко закодированного значения crsinfo_t
struct:
#include <stdio.h>
typedef struct {
unsigned long term;
unsigned long id_num;
char dept[5];
int crs_num;
} crsinfo_t;
void sort(int i, crsinfo_t info[5]);
int main(void) {
int i;
crsinfo_t info[5] = {{4, 2, "abc", 7}, {5, 2, "def", 9}, {8, 0, "ghi", 9}, {3, 8, "jkl", 4}, {1, 3, "mno", 4}};
i = 5;
sort(i, info);
return 0;
}
void sort(int i, crsinfo_t info[5]) {
int sorter[5];
int holder = 0;
int f, j, k, m;
for (f = 0; f < i; f++){
sorter[f] = f;
}
for (j = 0; j < i; j++) {
for (k = j + 1; k < i; k++) {
if (info[j].term > info[k].term) {
holder = sorter[j];
sorter[j] = sorter[k];
sorter[k] = holder;
}
}
}
for (m = 0; m < i; m++) {
printf("%lu %lu %s %2d \n", info[sorter[m]].term,
info[sorter[m]].id_num,
info[sorter[m]].dept,
info[sorter[m]].crs_num);
}
}
Вывод:
Сортировка по возрастанию на основе term
члена struct crsinfo_t
.
# ./a.out
1 3 mno 4
3 8 jkl 4
4 2 abc 7
5 2 def 9
8 0 ghi 9