Сортировка элементов структуры в C и распечатка их - PullRequest
0 голосов
/ 26 сентября 2018

Я хочу отсортировать k_p в порядке убывания от наибольшего к наименьшему и s_s_s для 10 учеников таким же образом и распечатать его, но я не знаю, как это сделать ...

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

struct student {
    float k_p;
    char i_p[30];
    int s_s_s;
};

int main() {
    struct student S[10];
    int i;
    for(i=0;i<10;i++) {
        printf("Student broj %d\n", i+1);
        printf("Koeficijent place: \t"); scanf("%d", &S[i].k_p);
        printf("Ime i prezime: \t"); scanf("%s", &S[i].i_p);
        printf("Stupanj strucne spreme: \t"); scanf("%f",&S[i].s_s_s);
        system("cls");
    }
    return 0;
}

Я пробовал что-то подобное, но я не знаю, как вписать это в код

{
    for (int j = 0; j < n; j++) {     //Loop for comparing other values
        if (a[j] < a[i]) {            //Comparing other array elements
            int tmp = a[i];           //Using temporary variable for storing last value
            a[i] = a[j];              //replacing value
            a[j] = tmp;               //storing last value
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 26 сентября 2018

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

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

/* in Global area */ 
float ftemp;
char chartemp[30];
int itemp;

void swap(struct student *a, struct student *b)
{

    /* swap the float */
    ftemp  = a->k_p;
    a->k_p = b->b_p;
    b->k_p = ftemp;

    /* swap the array */
    strcpy(chartemp, a->i_p);
    strcpy(a->i_p, b->i_p);
    strcpy(b->i_p, chartemp);

    /* swap the int */
    itemp    = a->s_s_s;
    a->s_s_s = b-> s_s_s;
    b->s_s_s = itemp;

}    

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

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

0 голосов
/ 26 сентября 2018

Один подход: создать массив целых , который будет того же размера , что и ваш массив структур (массив S), и инициализируется от 0 до n-1 (где n - размер).

Сортируйте этот массив целых чисел с помощью любого алгоритма сортировки, который вам подходит, и обрабатывайте каждое целое число из массива A как индекс вашего массива S.

Сортируя массивиз индексов в соответствии с k_p или s_s_s, вы можете эффективно распечатать ваш массив S, как если бы он был отсортирован по убыванию k_p или s_s_s.

Давайте использовать пузырьковую сортировку (простой алгоритм сортировки для иллюстрации), и мы будем сортировать попо убыванию значений k_p:

    int A[] = {0,1,2,3,4,5,6,7,8,9};
    float k1,k2;
    // bubble sort for descending order
    for (int i = 0; i < n; i++) 
    {   
        k1 = &S[i].k_p;
        for (int j = 1; j < n; j++)             
        {
            k2 = &S[j].k_p;
            if (k1 < k2)               
            {
                // remember you're only switching the ints in array A
                int tmp = A[i];         
                A[i] = A[j];           
                A[j] = tmp;             
            }
        }
    }

** Отказ от ответственности: я не проверял код, но это общая идея.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...