Buchstaben zählen
-
Kann das sein das der Aufgabensteller sich an folgendem orientiert:
http://www.cplusplus.com/doc/tutorial/files/Ziemlich am Ende auch mit:
new
Es reicht wenn du beim Quelltext den "C/C++ Button" nimmst. Lass den "Code Button" für andere Sprachen, für die es keinen Button gibt
MfG f.-th.
-
Zwar nicht die effizienteste Lösung, aber am elegantesten wäre das mit einer Map lösbar:
#include <map> #include <fstream> #include <iostream> int main() { std::map<char, std::size_t> count; { std::ifstream input("Maerchenwelt.txt"); while(input) ++count[input.get()]; } for(auto cur = count.begin(), end = count.end(); cur != end; ++cur) std::cout << cur->first << ": " << cur->second << "\n"; }
-
Ich verstehe das so, dass die Anzahl der Buchstaben pro Wort, nicht für den gesamten Text gezählt werden soll. Wenn das Wort selbst nicht gespeichert werden soll, liefe das auf eine std::deque<std::map<char, unsigned> > oder so hinaus (wahlweise statt der map auch unordered_map oder ein einfaches Array, wenn der zusätzliche Speicherverbrauch keine Rolle spielt).
Ich stelle mir das etwa so vor:
#include <deque> #include <fstream> #include <iostream> #include <locale> #include <map> int main() { std::deque<std::map<char, unsigned> > letter_counter; std::ifstream in("Maerchenwelt.txt"); std::locale loc; char c; while(in >> c) { letter_counter.resize(letter_counter.size() + 1); do { ++letter_counter.back()[c]; } while(in.get(c) && !std::isspace(c, loc)); } for(std::size_t i = 0; i < letter_counter.size(); ++i) { std::cout << "Wort " << i << ": \n"; for(std::map<char, unsigned>::const_iterator j = letter_counter[i].begin(); j != letter_counter[i].end(); ++j) { std::cout << j->first << ": " << j->second << '\n'; } } }
Behandlung von Satzzeichen und Groß/Kleinschreibung ist, falls erforderlich, darin noch nicht enthalten.
-
Nöö. Die Anzahl der Buchstaben eines jeden Wortes nur!
ergibt
Nöö 3
Die 3
Anzahl 5
der 3
Buchstaben 10
eines 5
jeden 5
Wortes 6
nur 3Da braucht man keine map, keinen vector, keine queue, kein Array.
-
Hmm ?
Er versucht durchaus die Anzahl der einzelnen Buchstaben zu zählen, zumindestens sagt mir das sein Code.
-
Ethon schrieb:
Hmm ?
Er versucht durchaus die Anzahl der einzelnen Buchstaben zu zählen, zumindestens sagt mir das sein Code.Dem hat er auf http://www.c-plusplus.net/forum/297187-4 widersprochen, dachte ich.
-
Irgendwie sowas?
#include <fstream> #include <iostream> #include <string> int main() { std::ifstream reader("maerchenwelt.txt"); std::string word; while(reader >> word) { std::cout << "Wort: " << word << " Laenge: " << word.size() << std::endl; } }
-
Tachyon schrieb:
Irgendwie sowas?
#include <fstream> #include <iostream> #include <string> int main() { std::ifstream reader("maerchenwelt.txt"); std::string word; while(reader >> word) { std::cout << "Wort: " << word << " Laenge: " << word.size() << std::endl; } }
Ja. Und dann hatte ich die Aufgabe so verstanden, daß das Wort selbst nicht gespeichert werden soll, also keinen string nehmen. Aber dazu soll sich der Threadersteller selber äußern.
-
volkard schrieb:
Ja. Und dann hatte ich die Aufgabe so verstanden, daß das Wort selbst nicht gespeichert werden soll, also keinen string nehmen. Aber dazu soll sich der Threadersteller selber äußern.
Dann darf man auch keinen Stream benutzen. Nichtmal fread oder fscanf. Das wird lustig.
-
Tachyon schrieb:
volkard schrieb:
Ja. Und dann hatte ich die Aufgabe so verstanden, daß das Wort selbst nicht gespeichert werden soll, also keinen string nehmen. Aber dazu soll sich der Threadersteller selber äußern.
Dann darf man auch keinen Stream benutzen. Nichtmal fread oder fscanf. Das wird lustig.
Das war jetzt unnötig.
Sagen wir mal so: Daß Streams puffern, wissen wir ja nicht.
-
volkard schrieb:
Dem hat er auf http://www.c-plusplus.net/forum/297187-4 widersprochen, dachte ich.
Nun, es soll nicht dauerhaft gespeichert werden, aber da die Idee ganz lustig ist:
#include <iostream> #include <fstream> #include <locale> using namespace std; int main() { locale loc(""); wifstream datei("maerchenland.txt"); datei.imbue(loc); while (datei) { unsigned wortlaenge = 0; wchar_t zeichen; while (datei.get(zeichen) && isalpha(zeichen, loc)) ++wortlaenge; if (wortlaenge) cout << wortlaenge << '\n'; } }
Das fummelige an der Geschichte ist, die Umlaute im Märchen richtig von isalpha erkennen zu lassen. Hier in diesem Code wird angenommen, dass die Systemlocale ("") schon passend gesetzt ist, ansonsten muss man eben explizit die passende Zeichencodierung (und vorzugsweise auch die Sprache) angeben. In Linux kann das z.B. "de_DE.utf8" sein.
Die Standardlocale "C" funktioniert jedenfalls nicht mit Umlauten (das ist soweit ich weiß sogar irgendwo von einem Standard garantiert).
-
Ah. In dem Fall:
#include <algorithm> #include <fstream> #include <functional> #include <iostream> #include <iterator> #include <string> int main() { std::ifstream in("Maerchenwelt.txt"); std::transform(std::istream_iterator<std::string>(in), std::istream_iterator<std::string>(), std::ostream_iterator<std::size_t>(std::cout, " "), std::mem_fun_ref(&std::string::size)); std::cout << std::endl; }