Sortowanie tablicy według wieku - struktura.

Odpowiedz Nowy wątek
2014-12-18 12:04
0

Witam mam mały problem mam posortować tablicę z imionami, nazwiskami, wagą, wzrostem, wiekiem - według wieku. Użyłem sortowania bąbelkowego, ale nie mam pojęcia jak pozamieniać wszystkie dane, bo obecnie mój kod, zamienia dane tylko wiekiem.

Więc jeśli będzie np.:

Jan Kowalski 25 lat 180cm 85kg
Adam Pachołek 15 lat 150cm 50kg

To wyświetli mi się tylko:

Jan Kowalski 15 lat 180cm 85kg
Adam Pachołek 25 lat 150cm 50kg

Jak temu zapobiec?

Kod funkcji:

void sortowanie(Osoba *os)
{
    int pom = 0;
 
    for (int i = 0; i<5; i++)
        for (int j = 0; j<5 - i - 1; j++) //pętla wewnętrzna
            if ((os+j)->wiek >(os+j+1)->wiek)
            {
                //zamiana miejscami
                pom = os[j].wiek;
                os[j].wiek = os[j+1].wiek;
                os[j+1].wiek = pom;
            }
}

Mam w funkcji stworzyć pomocnicze do imie,nazwisko,wiek,wzrost,waga czy da się jakoś pozamieniać te dane Od razu. Tzn. tak jakby przestawić po prostu miejscami w tablicy struktury "os"?

@EDIT

Tzn. Rozchodzi się o to, żebym nie musiał pisać takiego kodu:

void sortowanie(Osoba *os)
{
    string imie, nazwisko;
    int wiek=0, wzrost=0;
    float waga = 0;
 
    for (int i = 0; i<5; i++)
        for (int j = 0; j<5 - i - 1; j++) //pętla wewnętrzna
            if ((os+j)->wiek >(os+j+1)->wiek)
            {
                //zamiana miejscami
                wiek = os[j].wiek;
                os[j].wiek = os[j+1].wiek;
                os[j+1].wiek = wiek;
 
                wzrost = os[j].wzrost;
                os[j].wzrost = os[j + 1].wzrost;
                os[j + 1].wzrost = wzrost;
 
                waga = os[j].waga;
                os[j].waga = os[j + 1].waga;
                os[j + 1].waga = waga;
 
                imie = os[j].imie;
                os[j].imie = os[j + 1].imie;
                os[j + 1].imie = imie;
 
                nazwisko = os[j].nazwisko;
                os[j].nazwisko = os[j + 1].nazwisko;
                os[j + 1].nazwisko = nazwisko;
            }
}

dodanie znaczników <code> - @furious programming

edytowany 2x, ostatnio: furious programming, 2014-12-18 14:48

Pozostało 580 znaków

2014-12-18 12:15
2
  1. Osoba tmp=os[i];
    os[i]=os[j];
    os[j]=tmp;
  2. std::swap(os[i],os[j]);
  3. int comparebyname(const void *a,const void *b) { return strcmp(((Osoba*)a)->nazwisko,((Osoba*)b)->nazwisko); }
    sort(os,os+5,&comparebyname);

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
edytowany 1x, ostatnio: _13th_Dragon, 2014-12-18 12:18
te pierwsze 2 po tym warunku "if"? Funkcja spod "3" co właściwie robi, zamienia tylko nazwiska odpowiednio? - SPOJowiecaa 2014-12-18 12:22
Pod 3 - całość sortuje wg nazwiska. - _13th_Dragon 2014-12-18 12:24

Pozostało 580 znaków

2014-12-18 12:35
0

@_13th_Dragon

Nie wiem czy aby na pewno dobrze się zrozumieliśmy mi chodzi o sortowanie według wieku, tzn. dla wejścia:

Imie | Nazw | Wiek   | Wzrost | Waga
a    | b    | 20 lat | 30 cm  | 40 kg
c    | d    | 15 lat | 50 cm  | 60 kg
e    | f    | 30 lat | 10 cm  | 12 kg
g    | h    | 90 lat | 50 cm  | 90 kg
j    | k    | 5 lat  | 9 cm   | 1 kg

Wyjście:

Imie | Nazw | Wiek   | Wzrost | Waga
j    | k    | 5 lat  | 9 cm   | 1 kg
c    | d    | 15 lat | 50 cm  | 60 kg
a    | b    | 20 lat | 30 cm  | 40 kg
e    | f    | 30 lat | 10 cm  | 12 kg
g    | h    | 90 lat | 50 cm  | 90 kg

dodanie znaczników <code> - @furious programming

edytowany 2x, ostatnio: furious programming, 2014-12-18 14:50

Pozostało 580 znaków

2014-12-18 12:40
0

Wstaw w miejsce

//zamiana miejscami

wariant 1 lub 2.

A ta funkcja swap, to jakaś systemowa? - SPOJowiecaa 2014-12-18 12:46
A jakbym chciał zmienić sortowanie to jak użyć tej trzeciej opcji, bo rozumiem, że sort, to też funkcja z jakiejś gotowej biblioteki. Więc bardziej interesuje mnie co robi funkcja comparebyname, tak dokładniej. Tzn. chyba dokładniej mi się rozchodzi o to jak dokładnie "strcmp" porównuje stringi? Alfabetycznie? - SPOJowiecaa 2014-12-18 13:00

Pozostało 580 znaków

2014-12-18 13:06
0

A jakbym chciał zmienić sortowanie to jak użyć tej trzeciej opcji, bo rozumiem, że sort, to też funkcja z jakiejś gotowej biblioteki. Więc bardziej interesuje mnie co robi funkcja comparebyname, tak dokładniej. Tzn. chyba dokładniej mi się rozchodzi o to jak dokładnie "strcmp" porównuje stringi? Alfabetycznie?
http://www.cplusplus.com/reference/cstring/strcmp/?kw=strcmp

Polecam zapisać cplusplus.com do jakiejś zakładki.

Pozostało 580 znaków

2014-12-18 13:15
0

Więc dla mnie coś tu jest nie jasne, bo funkcja sort ma konstrukcję:

 void sort( RanIt first, RanIt last, Comparator comp );

I w dokumentacji wyczytałem, że jeśli trzeci argument jest false, to znaczy, że pierwszy argument powinien znajdować się za drugim, a jeśli true, to odwrotnie.

Więc przesunięcie powinno następować jeśli wartość zwrócona przez funkcję comparebyname, więc i strcmp, jest "<0", ale "strcmp" zwraca tak, jeśli pierwszy argument jest mniejszy od drugiego, więc zupełnie odwrotnie?

usunięcie cytowania całego poprzedniego posta - @furious programming

edytowany 2x, ostatnio: furious programming, 2014-12-18 14:50
Ile jeszcze razy mam przypominać, żebyś nie cytował całego poprzedniego posta, jeśli piszesz zaraz pod nim i do jego całości się odnosisz?! - furious programming 2014-12-18 14:51
Ok. Ponadto już zrozumiałem jak działa te "sort". - SPOJowiecaa 2014-12-18 14:57

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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