fork(1) download
  1. #include <stdio.h> /* printf,puts */
  2. #include <string.h> /* strncat,strtok */
  3. #include <stdlib.h> /* bsearch,qsort */
  4. #include <assert.h> /* assert */
  5.  
  6. /* Typdefinition für Map-Element */
  7. typedef struct {
  8. char string[21];
  9. int i;
  10. } Eintrag;
  11.  
  12. /* max. Größe der Map */
  13. enum { MAPSIZE = 1000 };
  14.  
  15. /*
  16.   Funktions-Prototypen
  17.   */
  18.  
  19. /* fügt einen String in die Map ein (oder erhöht den Zähler wenn schon vorhanden) */
  20. void add(Eintrag *map, const char *string);
  21.  
  22. /* durchläuft alle Elemente der Map und ruft für jedes die übergebene Funktion auf */
  23. void loop(const Eintrag *map, void(*callback)(const Eintrag*, void*), void*);
  24.  
  25. /* Callback-Funktion: gibt ein Element auf stdout aus */
  26. void ausgabe(const Eintrag*, void*);
  27.  
  28. /* Callback-Funktion: summiert Häufigkeiten der Elemente */
  29. void zaehlen(const Eintrag*, int*);
  30.  
  31. /* zählt die aktuell in der Map vorhandenen Elemente */
  32. int count(const Eintrag *map);
  33.  
  34. /* Callback-Funktion für qsort zum Sortieren der Map nach Häufigkeit (absteigend) */
  35. int sortiert(const void *a, const void *b);
  36.  
  37.  
  38. int main()
  39. {
  40. char ek[] = \
  41. "Wer reitet so spät durch Nacht und Wind? "\
  42. "Es ist der Vater mit seinem Kind. "\
  43. "Er hat den Knaben wohl in dem Arm, "\
  44. "Er faßt ihn sicher, er hält ihn warm. "\
  45.  
  46. "Mein Sohn, was birgst du so bang dein Gesicht? "\
  47. "Siehst Vater, du den Erlkönig nicht! "\
  48. "Den Erlenkönig mit Kron' und Schweif? "\
  49. "Mein Sohn, es ist ein Nebelstreif. "\
  50.  
  51. "Du liebes Kind, komm geh' mit mir! "\
  52. "Gar schöne Spiele, spiel ich mit dir, "\
  53. "Manch bunte Blumen sind an dem Strand, "\
  54. "Meine Mutter hat manch gülden Gewand. "\
  55.  
  56. "Mein Vater, mein Vater, und hörest du nicht, "\
  57. "Was Erlenkönig mir leise verspricht? "\
  58. "Sei ruhig, bleibe ruhig, mein Kind, "\
  59. "In dürren Blättern säuselt der Wind. "\
  60.  
  61. "Willst feiner Knabe du mit mir geh'n? "\
  62. "Meine Töchter sollen dich warten schön, "\
  63. "Meine Töchter führen den nächtlichen Reihn "\
  64. "Und wiegen und tanzen und singen dich ein. "\
  65.  
  66. "Mein Vater, mein Vater, und siehst du nicht dort "\
  67. "Erlkönigs Töchter am düsteren Ort? "\
  68. "Mein Sohn, mein Sohn, ich seh es genau: "\
  69. "Es scheinen die alten Weiden so grau. "\
  70.  
  71. "Ich lieb dich, mich reizt deine schöne Gestalt, "\
  72. "Und bist du nicht willig, so brauch ich Gewalt! "\
  73. "Mein Vater, mein Vater, jetzt faßt er mich an, "\
  74. "Erlkönig hat mir ein Leids getan. "\
  75.  
  76. "Dem Vater grauset's, er reitet geschwind, "\
  77. "Er hält in den Armen das ächzende Kind, "\
  78. "Erreicht den Hof mit Mühe und Not, "\
  79. "In seinen Armen das Kind war tot. "\
  80. ;
  81.  
  82. Eintrag map[MAPSIZE] = { 0 }; /* Definition der Map (hier als Array) */
  83.  
  84. char *wort;
  85. int z, h;
  86.  
  87. /* Aufsplitten nach Worten und Einfügen in Map */
  88. for (z = 0, wort = strtok(ek, " .!?,"); wort != NULL; wort = strtok(NULL, " .!?,"), z++)
  89. {
  90. add(map, wort);
  91. }
  92.  
  93. printf("Anzahl Worte: %d\n", z);
  94. printf("Anzahl verschiedene Worte: %d\n", count(map));
  95.  
  96. puts("sortiert nach Namen");
  97. loop(map, ausgabe, 0); /* die Map ist hier wegen qsort+strcmp aufsteigend nach Wort-Strings sortiert */
  98.  
  99. puts("sortiert nach Häufigkeit");
  100. qsort(map, count(map), sizeof(Eintrag), sortiert); /* sortieren der Map nach Häufigkeit der Worte (absteigend) */
  101. loop(map, ausgabe, 0);
  102.  
  103. h = 0;
  104. loop(map, zaehlen, &h);
  105. printf("Summe der Häufigkeiten: %d\n", h); /* die Summe der Häufigkeiten muss der Anzahl der Worte entsprechen */
  106. assert(h == z); /* sonst liefert assert hier einen Fehler + Programmabbruch */
  107.  
  108. return 0;
  109. }
  110.  
  111. int count(const Eintrag *map)
  112. {
  113. int i = 0;
  114. for (; i < MAPSIZE && map[i].i; i++);
  115. return i;
  116. }
  117.  
  118. void add(Eintrag *map, const char *string)
  119. {
  120. Eintrag *e = bsearch(string, map, count(map), sizeof(Eintrag), strcmp);
  121. if (e == NULL)
  122. {
  123. int new = count(map); /* neuer Eintrag notwendig */
  124. map[new].i = 1;
  125. strncat(map[new].string, string, 20);
  126. qsort(map, new + 1, sizeof(Eintrag), strcmp);
  127. }
  128. else
  129. {
  130. e->i++; /* wenn schon vorhanden, dann nur entsprechenden Zähler erhöhen */
  131. }
  132. }
  133.  
  134. void loop(const Eintrag *map, void(*callback)(const Eintrag*, void*), void*data)
  135. {
  136. int i;
  137. for (i = 0; i < count(map); i++)
  138. {
  139. callback(&map[i], data);
  140. }
  141. }
  142.  
  143. void ausgabe(const Eintrag *e, void *dummy)
  144. {
  145. printf("%-20s %d\n", e->string, e->i);
  146. }
  147.  
  148. void zaehlen(const Eintrag *e, int *h)
  149. {
  150. *h += e->i;
  151. }
  152.  
  153. int sortiert(const void *a, const void *b)
  154. {
  155. const Eintrag *x = a, *y = b;
  156. return y->i - x->i;
  157. }
  158.  
  159.  
Success #stdin #stdout 0s 2188KB
stdin
Standard input is empty
stdout
Anzahl Worte: 226
Anzahl verschiedene Worte: 136
sortiert nach Namen
Arm                  1
Armen                2
Blumen               1
Blättern            1
Dem                  1
Den                  1
Du                   1
Er                   3
Erlenkönig          2
Erlkönig            2
Erlkönigs           1
Erreicht             1
Es                   2
Gar                  1
Gesicht              1
Gestalt              1
Gewalt               1
Gewand               1
Hof                  1
Ich                  1
In                   2
Kind                 5
Knabe                1
Knaben               1
Kron'                1
Leids                1
Manch                1
Mein                 6
Meine                3
Mutter               1
Mühe                1
Nacht                1
Nebelstreif          1
Not                  1
Ort                  1
Reihn                1
Schweif              1
Sei                  1
Siehst               1
Sohn                 4
Spiele               1
Strand               1
Töchter             3
Und                  2
Vater                9
Was                  1
Weiden               1
Wer                  1
Willst               1
Wind                 2
alten                1
am                   1
an                   2
bang                 1
birgst               1
bist                 1
bleibe               1
brauch               1
bunte                1
das                  2
dein                 1
deine                1
dem                  2
den                  5
der                  2
dich                 3
die                  1
dir                  1
dort                 1
du                   6
durch                1
dürren              1
düsteren            1
ein                  3
er                   3
es                   2
faßt                2
feiner               1
führen              1
geh'                 1
geh'n                1
genau:               1
geschwind            1
getan                1
grau                 1
grauset's            1
gülden              1
hat                  3
hält                2
hörest              1
ich                  3
ihn                  2
in                   2
ist                  2
jetzt                1
komm                 1
leise                1
lieb                 1
liebes               1
manch                1
mein                 5
mich                 2
mir                  4
mit                  6
nicht                4
nächtlichen         1
reitet               2
reizt                1
ruhig                2
scheinen             1
schön               1
schöne              2
seh                  1
seinem               1
seinen               1
sicher               1
siehst               1
sind                 1
singen               1
so                   4
sollen               1
spiel                1
spät                1
säuselt             1
tanzen               1
tot                  1
und                  7
verspricht           1
war                  1
warm                 1
warten               1
was                  1
wiegen               1
willig               1
wohl                 1
ächzende            1
sortiert nach Häufigkeit
Vater                9
und                  7
Mein                 6
du                   6
mit                  6
Kind                 5
den                  5
mein                 5
Sohn                 4
mir                  4
nicht                4
so                   4
Er                   3
Meine                3
Töchter             3
dich                 3
ein                  3
er                   3
hat                  3
ich                  3
Armen                2
Erlenkönig          2
Erlkönig            2
Es                   2
In                   2
Und                  2
Wind                 2
an                   2
das                  2
dem                  2
der                  2
es                   2
faßt                2
hält                2
ihn                  2
in                   2
ist                  2
mich                 2
reitet               2
ruhig                2
schöne              2
Arm                  1
Blumen               1
Blättern            1
Dem                  1
Den                  1
Du                   1
Erlkönigs           1
Erreicht             1
Gar                  1
Gesicht              1
Gestalt              1
Gewalt               1
Gewand               1
Hof                  1
Ich                  1
Knabe                1
Knaben               1
Kron'                1
Leids                1
Manch                1
Mutter               1
Mühe                1
Nacht                1
Nebelstreif          1
Not                  1
Ort                  1
Reihn                1
Schweif              1
Sei                  1
Siehst               1
Spiele               1
Strand               1
Was                  1
Weiden               1
Wer                  1
Willst               1
alten                1
am                   1
bang                 1
birgst               1
bist                 1
bleibe               1
brauch               1
bunte                1
dein                 1
deine                1
die                  1
dir                  1
dort                 1
durch                1
dürren              1
düsteren            1
feiner               1
führen              1
geh'                 1
geh'n                1
genau:               1
geschwind            1
getan                1
grau                 1
grauset's            1
gülden              1
hörest              1
jetzt                1
komm                 1
leise                1
lieb                 1
liebes               1
manch                1
nächtlichen         1
reizt                1
scheinen             1
schön               1
seh                  1
seinem               1
seinen               1
sicher               1
siehst               1
sind                 1
singen               1
sollen               1
spiel                1
spät                1
säuselt             1
tanzen               1
tot                  1
verspricht           1
war                  1
warm                 1
warten               1
was                  1
wiegen               1
willig               1
wohl                 1
ächzende            1
Summe der Häufigkeiten: 226