Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: srovnani pole poli pomoci qsort ?

Aktivity
Avatar
shatem
Člen
Avatar
shatem:28.11.2014 22:07

zdravim, potreboval bych poradit jak srovnat pole poli, idealne podle prvniho sloupce. zkousel jsem to pres qsort ale po srovani mam vsude nuly. dejme tomu ze chci srovnat pole

 40 8430 43
20 5420 43
20 10220 45
40 21022 45

na

 20 5420 43
20 10220 45
40 8430 43
40 21022 45

predem dekuju za pomoc, protoze sam to nezvladnu.

Editováno 28.11.2014 22:07
 
Odpovědět
28.11.2014 22:07
Avatar
Lukáš Hruda
Tvůrce
Avatar
Odpovídá na shatem
Lukáš Hruda:28.11.2014 22:28

Napiš jak jsi to řešil, třeba ti někdo poradí proč ti to nešlo.

 
Nahoru Odpovědět
28.11.2014 22:28
Avatar
Odpovídá na shatem
Libor Šimo (libcosenior):29.11.2014 7:50

Skúsil som to, ale nie je to ešte ono.

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

int porovnaj(const void * a, const void * b)
{
    return (*(int*)a - *(int*)b);
}

int main ()
{
    int i, j;
    int cisla[][3] = {{40,8430,43},{20,5420,43},{20,10220,45},{40,21022,45}};

    qsort(cisla, 4, sizeof(int) * 3, porovnaj);
    for (i = 0; i < 4; i++){
        for (j = 0; j < 3; j++)
            printf("%d\t", cisla[i][j]);
        putchar('\n');
    }
    return (EXIT_SUCCESS);
}
Nahoru Odpovědět
29.11.2014 7:50
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Libor Šimo (libcosenior):29.11.2014 8:06

Uvedený spôsob zoradí pole polí správne, ale len keď sú čísla v prvom stĺpci rozdielne, neopakujú sa.

Nahoru Odpovědět
29.11.2014 8:06
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Libor Šimo (libcosenior):29.11.2014 10:49

Nakoniec som niečo našiel na http://stackoverflow.com/.
Ale tento príklad platí len pre dynamické pole.

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

int porovnaj( const void *pa, const void *pb ) {
    const int *a = *(const int **)pa;
    const int *b = *(const int **)pb;
    if(a[0] == b[0])
        return a[1] - b[1];
    else
        return a[0] - b[0];
}

int main()
{
    int i, j, k = 0, pocet_poli;
    int **cisla;
    int pom[] = {40,8430,43,20,5420,43,20,10220,45,40,
                 21022,4545,12,547,23,65,874,1258,65};

    pocet_poli = (sizeof(pom) / sizeof(int)) / 3;
    cisla = malloc(pocet_poli * sizeof(int*));
    for (i = 0; i < pocet_poli; i++) {
        cisla[i] = malloc(3 * sizeof(int));
        for (j = 0; j < 3; j++) {
            cisla[i][j] = pom[k];
            k++;
        }
    }
    // vypis povodneho pola poli
    for (i = 0; i < pocet_poli; i++){
        for (j = 0; j < 3; j++)
            printf("%d\t", cisla[i][j]);
        putchar('\n');
    }

    qsort(cisla, pocet_poli, sizeof(cisla[0]), porovnaj);

    // vypis zoradeneho pola poli
    putchar('\n');
    for (i = 0; i < pocet_poli; i++){
        for (j = 0; j < 3; j++)
            printf("%d\t", cisla[i][j]);
        putchar('\n');
    }
    return (EXIT_SUCCESS);
}
Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
Nahoru Odpovědět
29.11.2014 10:49
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
shatem
Člen
Avatar
shatem:29.11.2014 19:59

díky za tvůj čas. přemejšlel jsem nad dynamickym polem, je to i lepší umět no, takže to asi zkusím, vyzkoušim pro jistotu obě :)

 
Nahoru Odpovědět
29.11.2014 19:59
Avatar
shatem
Člen
Avatar
shatem:29.11.2014 21:49

super, funguje jak ma, jeste jednou diky, teda problem je trochu v tom ze kdyz nazaplnim vsechny alokovane pole tak to nejdrive vypise nuly. (resil jsem to tak, ze jsem srovnal od nejvetsiho a vzal jen ty co potrebuju) slo by to udelat i jinak nebo ne ? :)

 
Nahoru Odpovědět
29.11.2014 21:49
Avatar
Odpovídá na shatem
Libor Šimo (libcosenior):30.11.2014 7:28

V príklade som vytvoril pointer na pole polí int **cisla.
Potom jednorozmeré pole int pom[] = {......} a to som použil na naplnenie poľa polí, konkrétne 6 poli po 3 int.
Je potrebné, aby si správne pochopil kód.

Nahoru Odpovědět
30.11.2014 7:28
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
shatem
Člen
Avatar
Odpovídá na Libor Šimo (libcosenior)
shatem:1.12.2014 13:03

to jsem pochopil, ale resil jsem, kdyz nemam pevne dany pocet, tak nezaplnene pole maj hodnotu nula tudiz byli na prvnim miste. jediny co tak reallocovat po jednom prvku, jenze to zpomali program.

 
Nahoru Odpovědět
1.12.2014 13:03
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 9 zpráv z 9.