[C] Sortowanie tablicy struktur - przez wybieranie

xyz_zyx
Użytkownik
Użytkownik
Posty: 10
Rejestracja: 20 paź 2014, o 22:56
Płeć: Mężczyzna
Lokalizacja: Lębork
Podziękował: 3 razy

[C] Sortowanie tablicy struktur - przez wybieranie

Post autor: xyz_zyx »

Witam !
Tak jak w temacie... Mam problem w tym, że sortuje mi dobrze daną tablicę dopiero po którejś inicjalizacji sortowania...

Dana struktua

Kod: Zaznacz cały

   struct klub {
    char nazwa[MAX_CHAR];
    unsigned int liga; // 3 ligi
    unsigned int licz_kibice;
    unsigned int licz_stadion;
    unsigned int budzet;
    unsigned int poz;
};
Funkcja sortujaca - wsk_team to wskaznik na cala tablice, a decyzja to int przechowujacy nasza decyzje wedlug czego mamy sortowac

Kod: Zaznacz cały

int porownanie_string(struct klub *wsk_team,unsigned int j,unsigned int i)
{
    return (strcmp((*(wsk_team+i)).nazwa, (*(wsk_team+j)).nazwa) >= 0) ? 1 : 0;
}

void sort_wyb (struct klub *wsk_team, unsigned int decyzja) {
    unsigned int i,i_pom,j;
    struct klub pom;
        for (i=0;i<licz_kluby-1;i++) {
            i_pom=i;
            pom = *(wsk_team+i);
            switch (decyzja) {
                case 1:
                    for (j = i+1; j < licz_kluby;j++) {
                        if (porownanie_string(wsk_team,j,i)) {
                        i_pom = j;
                        pom = *(wsk_team+j);
                        }
                    }
                    break;
                case 2:
                     for (j = i+1; j < licz_kluby;j++) {
                        if ((*(wsk_team+j)).licz_kibice < (*(wsk_team+i)).licz_kibice) {
                        i_pom = j;
                        pom = *(wsk_team+j);
                        }
                    }
                    break;
                case 3:
                     for (j = i+1; j < licz_kluby;j++) {
                        if ((*(wsk_team+j)).budzet < (*(wsk_team+i)).budzet) {
                        i_pom = j;
                        pom = *(wsk_team+j);
                        }
                     }
                    break;
            }
            *(wsk_team+i_pom) =  *(wsk_team+i);
            *(wsk_team+i) = pom;
        }
    zobacz_rekord(wsk_team);
}
zobacz_ rekord - po prostu wyswietlenie wyniku

Wszystko wskazuje ze gdzie mam problemy z petlą (z pętlami)... Tylko nie moge znalezc tego błędu... Z góry dziękuje za pomoc.
Ostatnio zmieniony 25 lis 2014, o 22:32 przez Afish, łącznie zmieniany 1 raz.
Powód: Poprawa wiadomości.
Afish
Moderator
Moderator
Posty: 2828
Rejestracja: 15 cze 2008, o 15:45
Płeć: Mężczyzna
Lokalizacja: Seattle, WA
Podziękował: 3 razy
Pomógł: 356 razy

[C] Sortowanie tablicy struktur - przez wybieranie

Post autor: Afish »

W sortowaniu przez wybieranie masz znaleźć zawsze najmniejszy dostępny element i wpakować go na odpowiednią pozycję. Ty porównujesz zawsze z tym samym elementem, więc nie znajdziesz minimum, tylko ostatni mniejszy element.
Obrazowo: masz tablicę 5,1,2, gdy i=0, najpierw porównasz jedynkę z piątką, stwierdzisz, że jest mniejsza, potem porównasz dwójkę z piątką, stwierdzisz, że jest mniejsza, a po wszystkim zamienisz dwójkę z piątką. Na oko wydaje się, że porównywanie z elementem i_pom-tym powinno załatwić sprawę.
Bonusowo kilka uwag odnośnie czytelności kodu:
1. Dlaczego stosujesz notację (*(wsk_team+j)).licz_kibice zamiast wsk_team[j].licz_kibice i analogicznie w innych miejscach?
2. Zamiast robić trzy pętle w switchu, lepiej jest wyrzucić pętlę poza switch i dopiero wewnątrz pętli decydować, jakiego użyć porównania. Zauważ, że w każdej pętli robisz niemal to samo: najpierw porównujesz elementy, potem aktualizujesz zmienne pomocnicze.
3. Wybór sposobu porównania powinien być w osobnej metodzie, żeby nie zaciemniać samego algorytmu sortowania przez wybieranie.
4. Mieszanie języków zazwyczaj nie jest dobrym pomysłem (MAX_CHAR, wsk_team a licz_kibice i decyzja chociażby).
5. Zamiast magicznych wartości zmiennej decyzja lepiej użyć enuma.
xyz_zyx
Użytkownik
Użytkownik
Posty: 10
Rejestracja: 20 paź 2014, o 22:56
Płeć: Mężczyzna
Lokalizacja: Lębork
Podziękował: 3 razy

[C] Sortowanie tablicy struktur - przez wybieranie

Post autor: xyz_zyx »

Dziękuje najmocniej za pomoc... Co do sortowania to po prostu nieuwaga a za dodatkowe uwagi bardzo dziękuje bo na pewno wplywaja pozytywnie na odbior "stylistyczny" kodu... Tylko co do uwagi 1. Ja tam skorzystam z wskaznika na tablice wiec chyba zaproponowany przez Ciebie zapis w tym przypadku jest niepoprawny ?
Afish
Moderator
Moderator
Posty: 2828
Rejestracja: 15 cze 2008, o 15:45
Płeć: Mężczyzna
Lokalizacja: Seattle, WA
Podziękował: 3 razy
Pomógł: 356 razy

[C] Sortowanie tablicy struktur - przez wybieranie

Post autor: Afish »

Jest poprawny. Zapis a[b] jest równoważny zapisowi *(a + b).
Technicznie rzecz biorąc tablica i wskaźnik na pierwszy element nie różnią się prawie niczym. Polecam poczytać ... o-function
xyz_zyx
Użytkownik
Użytkownik
Posty: 10
Rejestracja: 20 paź 2014, o 22:56
Płeć: Mężczyzna
Lokalizacja: Lębork
Podziękował: 3 razy

[C] Sortowanie tablicy struktur - przez wybieranie

Post autor: xyz_zyx »

Okej... Kapuje... Jeszcze raz dziękuje
ODPOWIEDZ