сортировка массива структур по возрастанию

Задал массив структур, необходимо выполнить сортировку samolet.kolvo_mest !!по возрастанию!!. Для моего понимания проще всего сделать методом "пузырьковой" сортировки, но не получается это сделать правильно, выходит совсем не в том порядке, что нужно. Помогите пожалуйста написать отсортировать поле с количеством мест. Буду очень благодарен!

#include<stdio.h>
#include<conio.h>
#include<limits.h>
#include<string.h>

struct cena {
    float price;
    char classs[10];
};
struct tip {
    char name[50];
    int kolvo_mest;
};
struct aeroport {
    struct tip samolet; struct cena bilet;
    char vzlet[80];
    char posadka[80];
};
// VVOD DANNIH
void intr(struct aeroport a[], int n)
{
    int i; for (i = 0; i < n; i++) {
        puts("\nMESTO VZLETA: \n"); scanf("%s", &a[i].vzlet);
        puts("\nMESTO POSADKI: \n"); scanf("%s", &a[i].posadka);
        puts("\nNAME SAMOLETA: \n"); scanf("%s", &a[i].samolet.name);
        do {
            puts("\nKOL-VO MEST: \n"); scanf("%d", &a[i].samolet.kolvo_mest);
        } while (a[i].samolet.kolvo_mest < 1);
        do {
            puts("\nPRICE BILETA: \n"); scanf("%f", &a[i].bilet.price);
        } while (a[i].bilet.price < 1);
        puts("\nCLASS: \n"); scanf("%s", &a[i].bilet.classs);
    }
}

void PrintAndSort(struct aeroport a[], int n)
{
    //sortirovka puzirikom
    int tmp;
    for (int i = n - 1; i >= 0; --i)
    {
        for (int j = 0; j < i; ++j)
        {
            //sravnivaem elementi massiva structur po kol-vu mest
            if (a[j].bilet.price > a[j + 1].bilet.price)
            {
                struct aeroport tmp = a[j];
                a[j] = a[j + 1];
                a[j + 1] = tmp;
            }
        }
    }
    for (int i = 0; i < n; i++)
    {
        printf("%i) MESTO VZLETA -- %s -- MESTO POSADKI -- %s -- NAME SAMOLETA -- %s -- KOL-VO MEST -- %d -- PRICE BILTA -- %.2f -- CLASS -- %s --\n", i + 1, a[i].vzlet, a[i].posadka, a[i].samolet.name, a[i].samolet.kolvo_mest, a[i].bilet.price, a[i].bilet.classs);
    }
}


// MAIN FUNCTION
main()
{
    int n, i, j, m;
    printf("Vvedite n:"); scanf("%i", &n);
    struct aeroport a[100];
    intr(a, n);

    // VIVOD STRUCTURI PO CISLU
    PrintAndSort(a, n);
    printf("\n");
    // VIVOD STRUCTURI PO SIMVOLU
    for (char c = 'a'; c <= 'z'; c++)
        for (i = 0; i < n; i++)
            if (strchr(strlwr(a[i].vzlet), c) - a[i].vzlet == 0)
                printf("%i) MESTO VZLETA -- %s -- MESTO POSADKI -- %s -- NAME SAMOLETA -- %s -- KOL-VO MEST -- %d -- PRICE BILTA -- %.2f -- CLASS -- %s --\n", i + 1, a[i].vzlet, a[i].posadka, a[i].samolet.name, a[i].samolet.kolvo_mest, a[i].bilet.price, a[i].bilet.classs);
}

Ответы (1 шт):

Автор решения: Igor

Как-то так..

#include<stdio.h>
#include<conio.h>
#include<limits.h>
#include<string.h>

struct cena {
    float price;
    char classs[10];
};
struct tip {
    char name[50];
    int kolvo_mest;
};
struct aeroport {
    struct tip samolet; struct cena bilet;
    char vzlet[80];
    char posadka[80];
};
// VVOD DANNIH
void intr(struct aeroport a[], int n)
{
    int i; for (i = 0; i < n; i++) {
        puts("\nMESTO VZLETA: \n"); scanf("%s", &a[i].vzlet);
        puts("\nMESTO POSADKI: \n"); scanf("%s", &a[i].posadka);
        puts("\nNAME SAMOLETA: \n"); scanf("%s", &a[i].samolet.name);
        do {
            puts("\nKOL-VO MEST: \n"); scanf("%d", &a[i].samolet.kolvo_mest);
        } while (a[i].samolet.kolvo_mest < 1);
        do {
            puts("\nPRICE BILETA: \n"); scanf("%f", &a[i].bilet.price);
        } while (a[i].bilet.price < 1);
        puts("\nCLASS: \n"); scanf("%s", &a[i].bilet.classs);
    }
}

void PrintAndSort(struct aeroport a[], int n)
{
    //sortirovka puzirikom
    int tmp;
    for (int i = n - 1; i >= 0; --i)
    {
        for (int j = 0; j < i; ++j)
        {
            //sravnivaem elementi massiva structur po kol-vu mest
            if (a[j].samolet.kolvo_mest > a[j + 1].samolet.kolvo_mest)
            {
                struct aeroport tmp = a[j];
                a[j] = a[j + 1];
                a[j + 1] = tmp;
            }
        }
    }
    for (int i = 0; i < n; i++)
    {
        printf("%i) MESTO VZLETA -- %s -- MESTO POSADKI -- %s -- NAME SAMOLETA -- %s -- KOL-VO MEST -- %d -- PRICE BILTA -- %.2f -- CLASS -- %s --\n", i + 1, a[i].vzlet, a[i].posadka, a[i].samolet.name, a[i].samolet.kolvo_mest, a[i].bilet.price, a[i].bilet.classs);
    }
}


// MAIN FUNCTION
main()
{
    int n, i, j, m;
    printf("Vvedite n:"); scanf("%i", &n);
    struct aeroport a[100];
    intr(a, n);

    // VIVOD STRUCTURI PO CISLU
    PrintAndSort(a, n);
    printf("\n");
    // VIVOD STRUCTURI PO SIMVOLU
    for (char c = 'a'; c <= 'z'; c++)
        for (i = 0; i < n; i++)
            if (strchr(strlwr(a[i].vzlet), c) - a[i].vzlet == 0)
                printf("%i) MESTO VZLETA -- %s -- MESTO POSADKI -- %s -- NAME SAMOLETA -- %s -- KOL-VO MEST -- %d -- PRICE BILTA -- %.2f -- CLASS -- %s --\n", i + 1, a[i].vzlet, a[i].posadka, a[i].samolet.name, a[i].samolet.kolvo_mest, a[i].bilet.price, a[i].bilet.classs);
    }
→ Ссылка