Sortowanie tablicy struktur - przez wybieranie (jezyk c)

Odpowiedz Nowy wątek
2014-11-25 20:31

Rejestracja: 5 lat temu

Ostatnio: 5 lat temu

0

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

Dana struktua

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

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.

Pozostało 580 znaków

2014-11-25 20:54

Rejestracja: 14 lat temu

Ostatnio: 1 dzień temu

Może lepiej coś takiego:

int wg_nazwy(struct klub *a,struct klub *b) { return strcmp(a->nazwa,b->nazwa); }
int wg_kibicow(struct klub *a,struct klub *b) { return (a->kibice)-(b->kibice); }
int wg_budzetu(struct klub *a,struct klub *b) { return (a->budzet)-(b->budzet); }
typedef int Wg(struct klub *.struct klub *);

void sort_wyb(struct klub *wsk_team,int ile,int decyzja)
  {
   static Wg *wg[]={0,&wg_nazwy,&wg_kibicow,&wg_budzetu};
   int i,k;
   struct klub pom;
   for (i=1;i<ile;++i)
     {
      pom=wsk_team[i];
      for(k=i-1;(k>=0)&&(wg[decyzja](wsk_team+k,&pom)>0);--k) wsk_team[k+1]=wsk_team[k];
      wsk_team[k]=pom;
     }
  }

wywołanie: sort_wyb(tablica_klubow,licz_kluby,decyzja);


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Pozostało 580 znaków

2014-11-26 11:00

Rejestracja: 5 lat temu

Ostatnio: 5 lat temu

0

Dzięki za pomoc ! Na podstawie Twojego kodu coś tam sam wyskrobałem i działa i na pewno jest o wiele czytelniejszy

Pozostało 580 znaków

Odpowiedz

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