Benötige Hilfe beim Sortieren von Array
-
Hallo,
ich habe folgendes Problem und hoffe, dass mir hier vielleicht jemand helfen kann. Habe zwar schon einige Zeit lang im Forum gelesen, mein Problem besteht aber immer noch.
Ich möchte aus einer Textdatei alle Zeichen einlesen und diese nach der Häufigkeit ihres Auftretens sortiert wieder ausgeben. Ich dachte es würde vielleicht mit quicksort funktionieren, habe es aber leider nicht hinbekommen. Mein Problem ist auch, dass ich nicht genau weiß, wie ich die Zeichen nach der Sortierung mit der Anzahl ihres Auftretens in Verbindung bringen kann.
Nachfolgend habe ich mal den vorhandenen Code eingefügt. Für Hilfe bedanke ich mich schonmal im voraus.
int main () { FILE * textdatei; textdatei = fopen ("text.txt", "r"); if (textdatei == NULL){ printf ("Die Datei text.txt konnte nicht geoeffnet werden.\n"); } int ch; int zeichen [256]={0}; while(!feof(textdatei)){ ch=fgetc(textdatei); if (ch>=32) zeichen [ch]++; } for (ch=0; ch<=255; ch++) if (zeichen[ch]>0) { printf ("\nZeichen: %c\tAnzahl: %i", ch, zeichen[ch]); } // Hier möchte ich die Werte aus dem Array sortieren und zusammen mit dem Zeichen wieder ausgeben qsort ( compare); fclose (textdatei); // Schließen der Datei text.txt. getch (); return 0; }
-
Wenn du nur ein int array verwendest, weißt du nach dem Sortieren natürlich nicht mehr, welches Zeichen was ist.
Ich würde das Zeichen und die Anzahl zusammen in eine Struktur packen:
struct charfreq { unsigned char ch; int n; };
Und dann ein Array davon verwenden, zu Beginn richtig initialisiert:
struct charfreq zeichen[256]; for (int i = 0; i < 256; i++) zeichen[i] = (struct charfreq) { .ch = i, .n = 0 };
Dann kannst du es mit qsort und einer geeigneten Vergleichsfunktion sortieren.
(Ach, und statt 256 sollte man lieber Konstanten verwenden, z.B. UCHAR_MAX + 1)
-
Ach, und statt 256 sollte man lieber Konstanten verwenden, z.B. UCHAR_MAX + 1
Ach, richtig, aber 256 ist halt auch konstant.