Как использовать индексы сортировки для сортировки целых чисел из массива структуры в c? - PullRequest
0 голосов
/ 08 февраля 2019

Я пытаюсь написать функцию, которая спрашивает пользователя, по какому элементу структуры сортировать, а затем печатает отсортированный список.Я использую отдельный массив (индекс сортировки) для сортировки элементов без изменения самой структуры, но не могу заставить функцию фактически сортировать элементы.Я использую вложенные циклы для сортировки.

typedef struct  {
    unsigned long term;
    unsigned long id_num;
    char dept[5];
    int crs_num;
} crsinfo_t;

int main(void)
{
    int i;
    crsinfo_t info[50];
    i = 50;
    /* I read the info in from a file but just didn't include that bit*/
    sort(i, info);

    return(0);
}


void sort(int i, crsinfo_t info[50])
{
    int sorter[50];
    int holder = 0;
    int f, j, k, m, n;

    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 в порядке возрастания, но числа все равно расположены случайным образом (хотя и разныеиз исходного файла).

1 Ответ

0 голосов
/ 08 февраля 2019

Должен быть напечатан список всех элементов с термином, отсортированным в порядке возрастания ....

Хотя основная логика вашего кода верна, но она будет отсортирована впо убыванию, а не по возрастанию из-за <= в этом операторе:

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 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...