Sortowanie po nazwisku

0

Witam. Zapytam wprost, co robię źle, że nie działa sortowanie?

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

struct Dane
{
    char nazwisko[40];
    char imie[30];
    char plec;
};
struct Dane dane[40];
int ilosc;
void wczytajDane();
void sortujDane();
void wypiszDane();

void wczytajDane()
{

    printf("Ilosc danych do wpisania: ");
    scanf("%d", &ilosc);

    for (int i=0;i<ilosc;i++)
    {
        printf("Podaj naziwsko: ");
        scanf("%s", dane[i].nazwisko);
        printf("Podaj imie: ");
        scanf("%s", dane[i].imie);
        if(dane[i].imie[strlen(dane[i].imie)-1]=='a')
            dane[i].plec='k';
        else
            dane[i].plec='m';
    }
}
void wypiszDane()
{
    int i;
    for(i = 0; i < ilosc; i++)
        {
        printf(" %s %s %c\n\n" , dane[i].nazwisko, dane[i].imie, dane[i].plec);
        }
}
void sortujDane(struct Dane dane[], int cnt)
   {
        int i,j;
        struct Dane temp;

        for(i=0;i<cnt;++i)
        {
            for(j= i+ 1;j<cnt;++j)
            {
                if(strcmp(dane[i].nazwisko,dane[j].nazwisko)<0)
                {
                    temp=dane[i];
                    dane[i]=dane[j];
                    dane[j]=temp;
                }
            }
        }
    }

int main()
{

    wczytajDane();
    sortujDane();
    wypiszDane();

}
2

A czy to w ogóle Ci się kompiluje, ale nie działa zgodnie z oczekiwaniami, czy wyskakuje błąd podczas kompilacji? Mi nawet nie chce się skompilować.

Fragment, który boli kompilator to wywołanie w main funkcji sortujDane();. Zauważ, że jej deklaracja ma inną postać, niż późniejsze wywołanie - została zdefiniowana jako void sortujDane(struct Dane dane[], int cnt), ale wywołujesz ją bez argumentów.

Taka zmiana na szybko i brzydko, ale powodująca że całość się uruchamia i nawet coś sortuje:

void sortujDane()//struct Dane dane[], int cnt)
   {
        int i,j,cnt;
        struct Dane temp;
        cnt=ilosc;
0

Dziękuję za odpowiedź. Program po aktualizacji uruchamia się, natomiast nadal nie działa sortowanie. W takim przypadku jeżeli przekazuje argumenty, to dlaczego nie mam zdefiniowania w funkcji tej funkcji structa?

1

Zgodnie z @cerrato, nie kompilowało się, deklaracje i definicje funkcji powinne mieć tą samą listę elemntów. Poprawiłem też na prawdziwy insertion sort (przynajmniej tak mi się wydaje :)). Potestuj:

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

struct Dane
{
    char nazwisko[40];
    char imie[30];
    char plec;
};
struct Dane dane[40];
int ilosc;
void wczytajDane();
void sortujDane(struct Dane dane[], int cnt);
void wypiszDane();

int main(){
    wczytajDane();
    sortujDane(dane, ilosc);
    wypiszDane();
    return 0;
}
void wczytajDane()
{

    printf("Ilosc danych do wpisania: ");
    scanf("%d", &ilosc);

    for (int i=0;i<ilosc;i++)
    {
        printf("Podaj naziwsko: ");
        scanf("%s", dane[i].nazwisko);
        printf("Podaj imie: ");
        scanf("%s", dane[i].imie);
        if(dane[i].imie[strlen(dane[i].imie)-1]=='a')
            dane[i].plec='k';
        else
            dane[i].plec='m';
    }
}
void wypiszDane(){
    int i;
    for(i = 0; i < ilosc; i++){
        printf(" %s %s %c\n\n" , dane[i].nazwisko, dane[i].imie, dane[i].plec);
    }
}

void sortujDane(struct Dane dane[], int cnt){
        int i,j;
        struct Dane tmp;

        for(i = 1;i < cnt; ++i){
            tmp = dane[i];
            j = i - 1;
            while (j >= 0 && strcmp(dane[i].nazwisko,dane[j].nazwisko)<0){
                    dane[j + 1] = dane[j];
                    j = j - 1;
            }
            dane[j + 1] = tmp;
         }
}
1

@0097: a co konkretnie masz na myśli pisząc, że program nie sortuje? Zobacz, jaki jest efekt jego uruchomienia u mnie:

screenshot-20190205224957.png

1

I wyjaśnij też proszę, co miałeś na myśli pisząc "W takim przypadku jeżeli przekazuje argumenty, to dlaczego nie mam zdefiniowania w funkcji tej funkcji structa?", bo jakoś nie rozumiem pytania ;)

Być może chodzi o to, że dane i ilosc są zmiennymi globalnymi, czyli widocznymi we wszystkich fragmentach programu. W związku z tym nie trzeba ich przekazywać, bo są wszędzie dostępne.

0

Dokładnie, już wszystko jasne. Dzięki :)

0

@lion137 dziękuję, już zrozumiałem

0
int porownajNazwiska(const struct Dane *a, const struct Dane *b)
{
     return strcoll(a->nazwisko, b->nazwisko);
}

void sortujDane(struct Dane dane[], int cnt, int (*predykat)(const struct Dane *, const struct Dane *)) {
    qsort(dane, cnt, sizeof(dane[0]), (int (*)(const void *, const void *))predykat);
}

void sortujDanePoNazwisku(struct Dane dane[], int cnt)
{
    sortujDane(dane, cnt, porownajNazwiska);
}

https://wandbox.org/permlink/QQXf7xxHJSyIKfme

1 użytkowników online, w tym zalogowanych: 0, gości: 0, botów: 1

Robot: Bingbot