Sortowanie tablicy według wieku - struktura.

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

2
Osoba tmp=os[i];
os[i]=os[j];
os[j]=tmp;
std::swap(os[i],os[j]);
int comparebyname(const void *a,const void *b) { return strcmp(((Osoba*)a)->nazwisko,((Osoba*)b)->nazwisko); }
sort(os,os+5,&comparebyname);
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

0

Wstaw w miejsce

//zamiana miejscami

wariant 1 lub 2.

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.

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

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