Как использовать Bubble Sort / qsort () в структуре для сортировки по алфавиту - PullRequest
0 голосов
/ 14 мая 2018

Мне нужно написать код, в котором в структуре я регистрирую номерной знак, модель, марку, год и дневную стоимость автомобиля. После регистрации этих данных, мне нужно отсортировать всю структуру на основе номерного знака автомобиля, а затем отобразить на экране для пользователя. У меня такая же проблема с Bubble Sort, как и с qsort (), она сортирует только первую букву пластины, поэтому если я поставлю « ADB-1234 » для автомобиля 1 и «* 1003» * ABC-1234"для автомобиля 2, он не поменяется местами, и ADB-1234 будет первым номерным знаком, а не вторым.

Должно быть так, например:

ВХОД

Car 1

car plate: AGH-1234
car model: GTR
car brand: Nissan
car year: 2016
daily value of car: 100

Car 2

car plate: ABC-1234
car model: Corolla
car brand: Toyota
car year: 2014
daily value of car:50

Заказ ...

OUTPUT

Car 2
car plate: ABC-1234
car model: Corolla
car brand: Toyota
car year: 2014
daily value of car:50

Car 1

car plate: AGH-1234
car model: GTR
car brand: Nissan
car year: 2016
daily value of car: 100

Вот код с Bubble Sort:

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

int main()
{

struct carro // STRUCT
{
    char placa[50];
    char marca[50];
    char modelo[50];
    char ano[50];
    char valordiaria[50];
};

struct carro car[3];


int x=0; //COUNTER



for(x=0; x<3; x++) // CAR REGISTER
{

    printf("\nCarro: %d", (x+1));

    printf("\nPlaca: ");
    gets(car[x].placa);
    fflush(stdin);

    printf("Marca: ");
    gets(car[x].marca);
    fflush(stdin);

    printf("Modelo: ");
    gets(car[x].modelo);
    fflush(stdin);

}

              //BUBBLESORT******

struct carro hold;
int o, pass;
int i=0;

for ( pass = 0; pass < 3 ; pass++ )//number of passes
    for ( o = 0; o < 3 - pass; o++ )//single pass
        if ( strcmp( car[o].placa, car[o+1].placa ) > 0)  
        {
            hold = car[o];
            car[o] = car[o+1];//swap array elements if statement is true
            car[o+1] = hold;
        }

printf("\n\nNomes em ordem alfabetica: \n");
for(x=0; x<3; x++) // MOSTRA NA TELA A STRUCT ORDENADA
{
    printf("\n\n\nCarro: %d", (x+1));
    printf("\nPlaca: %s", car[x].placa);
    printf("\nMarca: %s", car[x].marca);
    printf("\nModelo: %s", car[x].modelo);
    printf("\nAno: %s", car[x].ano);

}

}  

Вот код, использующий qsort ():

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


typedef struct   // STRUCT
{
    char placa[50];
    char marca[50];
    char modelo[50];
    char ano[50];
    char valordiaria[50];
} carro;
carro car[3];

int compare (const void * a, const void * b)
{

    carro *carroA = (carro *)a;
    carro *carroB = (carro *)b;



    return ( carroB->placa - carroA->placa );
}


int main()
{
    //struct carro car[3];

    int x=0; //COUNTER

    for(x=0; x<3; x++) // CAR REGISTER
    {

        printf("\nCarro: %d", (x+1));

        printf("\nPlaca: ");
        scanf("%s",car[x].placa);
        //fflush(stdin);

        printf("Marca: ");
        scanf("%s",car[x].marca);
        //fflush(stdin);

        //printf("Modelo: ");
        //scanf("%s",car[x].modelo);
        //fflush(stdin);
        /*
                printf("Ano: ");
                gets(car[x].ano);
                fflush(stdin);

                printf("Valor da diaria: ");
                fflush(stdin);
                gets(car[x].valordiaria);
                */
    }


    qsort (car, 3, sizeof(carro), compare);

    printf("\n\nSTRUCT ORDENADA: \n");
    for(x=0; x<3; x++) // MOSTRA NA TELA A STRUCT ORDENADA
    {
        printf("\n\n\nCarro: %d", (x+1));
        printf("\nPlaca: %s", car[x].placa);
        printf("\nMarca: %s", car[x].marca);
        //printf("\nModelo: %s", car[x].modelo);
        //printf("\nAno: %s", car[x].ano);
        //printf("\Valor da diaria: %s", car[x].valordiaria);
    }
}

1 Ответ

0 голосов
/ 14 мая 2018

Ваша проблема здесь:

return ( carroB->placa - carroA->placa );

Поле placa является указателем - C не имеет реальных строк.И вычитание одного указателя из другого не сравнивает строки, оно вычитает адреса памяти двух указателей.

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

...