Diskuze: srovnani pole poli pomoci qsort ?
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 9 zpráv z 9.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.
Napiš jak jsi to řešil, třeba ti někdo poradí proč ti to nešlo.
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);
}
Uvedený spôsob zoradí pole polí správne, ale len keď sú čísla v prvom stĺpci rozdielne, neopakujú sa.
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);
}
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 ?
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.
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.
Zobrazeno 9 zpráv z 9.