Zeichenhäufigkeit, vereinfachter Code?
-
Guten Abend.
Ich lese derzeit ein Grundlagenbuch für C++.
Nach einigen Kapiteln über Ein- und Ausgaben, Operatoren, Kontrollstrukturen, Präprozessoren, Zeigern und Referenzen, und Arrays(Eindimensionale und Mehrdimensionale), bin ich auf folgende Übung gestoßen:
"Ein Programm soll eine Zeile von maximal 80 Zeichen einlesen und
die Häufigkeiten der darin enthaltenen Buchstaben (ohne ß und Umlaute) feststellen."Ich habe dazu nun einen (meiner Ansicht nach) sehr mühseligen und umständlichen Code geschrieben.
Sieht nach viel aus, ist aber wenig.
- String-Eingabe (max. 80 Zeichen)
- Zuordnung (Buchstabenzählen)
- Ausgabe der Häufigkeiten#include <iostream> #include <conio.h> #include <string> #include <stdio.h> using namespace std; int main() { char string[80]; int zähler; int a = 0, b = 0, c = 0, d = 0, e = 0, f = 0, g = 0, h = 0, i = 0, j = 0, k = 0, l = 0, m = 0, n = 0, o = 0, p = 0, q = 0, r = 0, s = 0, t = 0, u = 0, v = 0, w = 0, x = 0, y = 0, z = 0; cout <<"Eingabe (max. 80 Buchstaben): " << endl; cin.getline(string, 80); for (zähler = 0; zähler < strlen(string); zähler++) { if (string[zähler] == 'a' || string[zähler] == 'A') { a++; } else if (string[zähler] == 'b' || string[zähler] == 'B') { b++; } else if (string[zähler] == 'c' || string[zähler] == 'C') { c++; } else if (string[zähler] == 'd' || string[zähler] == 'D') { d++; } else if (string[zähler] == 'e' || string[zähler] == 'E') { e++; } else if (string[zähler] == 'f' || string[zähler] == 'F') { f++; } else if (string[zähler] == 'g' || string[zähler] == 'G') { g++; } else if (string[zähler] == 'h' || string[zähler] == 'H') { h++; } else if (string[zähler] == 'i' || string[zähler] == 'I') { i++; } else if (string[zähler] == 'j' || string[zähler] == 'J') { j++; } else if (string[zähler] == 'k' || string[zähler] == 'K') { k++; } else if (string[zähler] == 'l' || string[zähler] == 'L') { l++; } else if (string[zähler] == 'm' || string[zähler] == 'M') { m++; } else if (string[zähler] == 'n' || string[zähler] == 'N') { n++; } else if (string[zähler] == 'o' || string[zähler] == 'O') { o++; } else if (string[zähler] == 'p' || string[zähler] == 'P') { p++; } else if (string[zähler] == 'q' || string[zähler] == 'Q') { q++; } else if (string[zähler] == 'r' || string[zähler] == 'R') { r++; } else if (string[zähler] == 's' || string[zähler] == 'S') { s++; } else if (string[zähler] == 't' || string[zähler] == 'T') { t++; } else if (string[zähler] == 'u' || string[zähler] == 'U') { u++; } else if (string[zähler] == 'v' || string[zähler] == 'V') { v++; } else if (string[zähler] == 'w' || string[zähler] == 'W') { w++; } else if (string[zähler] == 'x' || string[zähler] == 'X') { x++; } else if (string[zähler] == 'y' || string[zähler] == 'Y') { y++; } else if (string[zähler] == 'z' || string[zähler] == 'Z') { z++; } } cout << "\n\nBuchstabenhaeufigkeit der Eingabe:\n" << '\"' << string << '\"' << "\n\n" << endl; cout << "a: " << a << "\tb: " << b << "\tc: " << c << "\td: " << d << "\te: " << e << "\tf: " << f << "\ng: " << g << "\th: " << h << "\ti: " << i << "\tj: " << j << " k: " << k << "\nl: " << l << " m: " << m << " n: " << n << " o: " << o << " p: " << p << "\nq: " << q << " r: " << r << " s: " << s << " t: " << t << " u: " << u << "\nv: " << v << " w: " << w << " x: " << x << " y: " << y << " z: " << z << endl; getch(); }Dieser Code funktioniert einwandfrei.
Ich möchte diesen jedoch sehr viel kompakter schreiben.
Ich habe bereits versucht hier mehrdimensionale Arrays zum Einsatz zu bringen.
Gäbe es da eine Möglichkeit oder täusche ich mich da?Wenn mir jemand einen Tipp geben kann (!BITTE KEINE KOMPLETTEN CODES!), also Denkanstöße, wäre das schonmal eine nette Unterstützung.
PS: Oben habe ich erwähnt, welche Kapitel ich bereits durchgearbeitet habe. Wenn ihr also darauf achtet, mich nicht mit einem komplett fremden Gebiet wie "Klassen" oder "Funktionen" zu konfrontieren, hilft mir das weitaus besser.

Gruß
Cruxi
-
Kern ist ein Array
int anzahl[256];und
unsigned char string[80];und
++anzahl[string[zähler]];Und bei der Ausgabe
for(int i='a';i<='z';++i) cout<<char(i)<<' '<<anzahl[i]<<'\n';//kein endl, wenn '\n' reicht.edit: Oh, Großbuchstaben auch. Naja, 'q'+('a'-'A')='Q' kannste mal annehmen.
-
Cruxi schrieb:
Ich lese derzeit ein Grundlagenbuch für C++.
Nein, Du liest ein C-Buch, das halbherzig nach C++ umgefrickelt wurde.
Cruxi schrieb:
Nach ... Präprozessoren, Zeigern und Referenzen, und Arrays(Eindimensionale und Mehrdimensionale)
noch keine std::string? Komisch. Und wozu so früh einen Ausflug zum Präprozessor?
Cruxi schrieb:
PS: Oben habe ich erwähnt, welche Kapitel ich bereits durchgearbeitet habe. Wenn ihr also darauf achtet, mich nicht mit einem komplett fremden Gebiet wie "Klassen" oder "Funktionen" zu konfrontieren, hilft mir das weitaus besser.

Kein Problem. Aber falls der Autor die Initialen J.W. trägt, wechsle das Buch bevor es Dich kaputtmacht.
-
@volkard
Warum keine std::map?
-
cooky451 schrieb:
@volkard
Warum keine std::map?Damit Cruxi jetzt ein wenig Rätselspaß ausleben kann, ohne neue Klassen und Funktionen zu lernen.
-
Danke für deine Antwort, volkard.
strings kamen leider nur teilweise dran.
Das Buch wurde von Gerhard Willms verfasst.Ich nutze die Gelegenheit mal und bleibe kurz beim Thema:
Kannst Du mir eventuell einen guten Buchvorschlag für C++ machen,
sodass ich es mit meinem parallel lesen kann, um mehr Sicherheit zu bekommen?
Es sollte einem praktischen Aufbau folgen. Außerdem sollte es gut nachvollziehbare Beispielcodes enthalten. Übungen wären natürlich sehr willkommen.
Für Emphelungen wäre ich sehr dankbar.
Ich wende mich dann erstmal wieder meinem Code zu.
PS: std::map ist mir noch nicht bekannt.
-
Mein Tipp ist C++ Primer Plus (5th ed.).
P.S. Lass das mit "parallel lesen".
-
Cruxi schrieb:
strings kamen leider nur teilweise dran.
Das Buch wurde von Gerhard Willms verfasst.Dieses ist mir jetzt schon mehrmals negativ aufgefallen. Vielleicht liegt's am Erscheinungsjahr (1999) oder der Autor kann's einfach nicht besser. Es macht jedenfalls von Ferne den Eindruck des typischen C/C++-Buches. (Für alle unbedarften Leser: C/C++ ist ein Negativprädikat)