Avatar
shatem
Člen
Avatar
shatem:

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
Odpovídá na shatem
Lukáš Hruda (Luckin):

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):

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):

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):

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í
+1 bodů
Ř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:

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:

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):

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:

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.