Array aufsteigend oder absteigend oder gemischte Reihenfolge?
-
Tachyon schrieb:
Korhil schrieb:
@Tachyon Vielleicht soll anhand dieser Zeilen ja gerade entschieden werden, ob ein Sortieralgorithmus eingesetzt werden soll. Außerdem schadet ein wenig Programmierpraxis - auch wenn sie unnötig ist - dem Lernenden nicht.
Auch wieder war-
Korhil schrieb:
fflush(stdin);
Das ist kein ANSI C, siehe (http://www.c-plusplus.net/forum/viewtopic-var-t-is-39349.html)
Klar ist das ANSI C. Nur das Verhalten ist undefiniert.
Okay, aber ist etwas undefiniertes akzeptabler ?
-
Hallo,
was hälst du von folgender Lösung? Die Funktion hat eine Signatur analog zu qsort aus der Standardbibliothek; sie kann auf Arrays beliebigen Typs abgeschossen werden und auch die Vergleichsfunktion wird übergeben.
Grüße
Martin#include <stdlib.h> #include <stdio.h> #define UNORDERED 0 #define ASCENDING 1 #define DESCENDING 2 int asc_descending(void *base, size_t nmemb, size_t size, int (*compar) (const void *, const void *)) { register unsigned char *i, *r; int res = ASCENDING | DESCENDING; i = r = base; r += --nmemb * size; while (i < r) { int c = (*compar) (i, i + size); if (c < 0) res &= ~DESCENDING; else if (c > 0) res &= ~ASCENDING; i += size; } return res; } static int cmp(const void *p1, const void *p2) { return *(const int *)p1 - *(const int *)p2; } int main() { int v[] = { 0, 1, 1, 2, 3, 5, 8 }; /* int v[] = { 8, 5, 3, 2, 1, 1, 0 }; */ /* int v[] = { 8, 5, 0, 1, 3, 2, 1 }; */ size_t n = sizeof(v) / sizeof(int); switch (asc_descending(v, n, sizeof(int), &cmp)) { case ASCENDING: printf("aufsteigend\n"); break; case DESCENDING: printf("absteigend\n"); break; case UNORDERED: printf("unsortiert\n"); break; default: printf("Autsch!\n"); } return EXIT_SUCCESS; }