Napisałem funkcję sortującą i porównującą liczby w tablicy i pojawił się problem, otóż mam stworzyć tablicę struktur typu Punkt {double x; double y} i mam ją posortować rosnąco według składowej x, a potem malejąco według składowej y. Czyli po prostu muszę napisać dwie nowe funkcje porównujące po x i po y, ale nie mogę sobie z tym poradzić, jakieś pomysły?
A nie wystarczy Ci funkcja porównująca i przekazać do niej x lub y a nie całą strukturę?
Być może masz rację, ale nie potrafię się za to zabrać,
int cmp(const void *a, const void b){
const intaa=(const int )a;
const intbb=(const int *)b;
if(*aa==*bb){// aa->x bb -> x (*bb).x
return 0;
}
else if(*aa<*bb){
return -1;
}
else{
return 1;
}
no i teraz trzeba dostosować to do tych struktur, do sortowania po x i po y, tutaj moja kreatywność się kończy
Kod wrzucaj w znaczniki, ja bym spróbował z czymś takim:
Zakładam że struktura point wygląda u Ciebie +/- tak:
structut Poin
{
int a;
int b;
};
int cmp(const int a, const int b){
if(a>=b)
return a;
}else{
return b;
}
}
Wywołanie cmp:
cmp(punkt1.a,puntka.b);
Pisane z palca, mogą być błędy.
w c++14. Przerób na c dla wprawy.
sort(vec.begin(), vec.end(), [](auto p1, auto p2) {
if (p1.x != p2.x)
return p1.x < p2.x;
return p1.y > p2.y;
});
Mógłby ktoś pomóc to przekształcić, nie jestem obeznany w składni c++
Weź się chłopie w garść, miałeś całą logikę wyżej.
int cmp_points(const void *a, const void *b) {
const struct point *point_a = (struct point *)a;
const struct point *point_b = (struct point *)b;
if (point_a->x != point_b->x)
return point_a->x < point_b->x ? -1 : 1;
if (point_a->y != point_b->y)
return point_a->y > point_b->y ? -1 : 1;
return 0;
}
mozna prosciej:
int cmp_points(const void *a, const void *b) {
const struct point *point_a = (struct point *)a;
const struct point *point_b = (struct point *)b;
if (point_a->x != point_b->x)
return point_a->x - point_b->x;
else
return point_a->y - point_b->y;
}
W C jest to bardziej pokręcone. Najlepiej zacząć od jakieś dokumentacji.
int cmpPointByXThenByYNoCast(const struct Point* a, const struct Point* b) {
if (a->x < b->x) return -1;
if (a->x > b->x) return 1;
if (a->y < b->y) return -1;
if (a->y > b->y) return 1;
return 0;
}
int cmpPointByXThenByY(const void* a, const void* b) {
return cmpPointByXThenByYNoCast((struct Point*)a, (struct Point*)b);
}
…
struct Point tab[20];
…
qsort(tab, sizeof(tab)/sizeof(tab[0]), sizeof(tab[0]), cmpPointByXThenByY);
Chyba jest niepoprawnie zdefiniowana twoja funkcja