Buchstaben zählen
-
Hallo Profis,
für euch erscheint die Aufgabe wahrscheinlich ziemlich banal, aber da ich neu mit C++ arbeite, habe ich noch ziemliche Anfangsschwierigkeiten beim Schreiben eines Programms.
Aufgabe: Es soll die Anzahl der Buchstaben jedes Wortes bestimmt werden (mithilfe eines Feldes mit Zählern für die Buchstaben je Wort, new() ), ohne das Wort selbst dauernd zu speichern. Weiters soll eine Datei mit den Häufigkeiten der Buchstabenzahlen je Wort erstellt und alle 'e' gezählt werden (find () ). Lies dazu den Text aus der Datei 'Märchenwelt.txt' ein!
Brauche das Programm für die Schule und weiß noch nicht so recht wie ich das ganze angehn soll!
Vorschläge??
Bin über jede Hilfe mehr als dankbar!!
-
He, der erste Vorschlag sollte von dir kommen
Wir schauen den dann an und, wenn wir glauben das du Einsatz zeigst, geben wir Tipps zur Verbesserung.
Also hau in die Tasten und zeig uns was du bisher hast.
MfG f.-th.
-
also ich hab mal ganz allgemein damit angefangen alle Buchstaben zu zählen!
nur für die 'e's müsste man ja die schleife von m nur auf ein if umändern, oder?
allerdings weiß ich noch nicht so recht, wie ich die einzelnen Wörter einlesen und ihre buchstabenanzahl berechnen soll.
[code] // get one character at a time from a text file // convert to lower case and count letters 'a' to 'z' #include <iostream> #include <fstream> using namespace std; // count letters 'a' to 'z' in string s void countLetters( string s ) { int pos, sum = 0; char m; // only a to z for( m = 97; m < 123; m++ ) { // start with index = 0 pos = s.find( m, 0 ); while( pos != string::npos ) { // adjust index up pos = s.find( m, pos+1 ); // total up this character sum++; } if ( sum > 0) { cout << m << " = " << sum << endl; } sum = 0; } } int main() { char c; string str1; ifstream is; // open the text file is.open("Maerchenwelt.txt"); // loop while extraction from file is possible while ( is.good() ) { // get character from file c = is.get(); cout << c; // build string with all lower case characters c = tolower( c ); str1.push_back( c ); } cout << endl << endl; cout << str1 << endl; // count letters a to z countLetters(str1); // close file is.close(); cin.get(); // wait return 0; }
[/code]
-
Ich bin für Auflösen ohne weitere Erziehungsversuche. Ich denke, er gibt sich redlich Mühe. snooker kann ja nichts dafür, daß er suboptimale Quellen hat.
Mag jemand es fertig machen?Ich bin noch am Überlegen, was mit
"Aufgabe: Es soll die Anzahl der Buchstaben jedes Wortes bestimmt werden (mithilfe eines Feldes mit Zählern für die Buchstaben je Wort, new() )," gemeint ist. Das paßt für mich nicht so ins Konzept. Was soll die Ausgabe sein? Meine Kristallkugel versagt bei dieser Aufgabe leider total. Sonst würde ich es machen.
-
danke, volkard!!
hab die Aufgabe einfach mal so abgeschrieben wie wir sie bekommen haben!! laut unserem Lehrer sollen wir jedes einzelne wort aus der Datei einlesen (aber nicht dauerhaft speichern) und dessen Anzahl an buchstaben bestimmen. die Ausgabe sollte im Prinzip so aussehen.
Es 2
war 3
einmal 6
ein 3
Koenigreich 11
...die angabe in der klammer und der Hinweis mit new() sollte wohl zum Verständnis beitragen - bei mir aber eher zur verwirrung...
-
snooker schrieb:
die angabe in der klammer und der Hinweis mit new() sollte wohl zum Verständnis beitragen - bei mir aber eher zur verwirrung...
Bei mir auch! Meno, war ich verwirrt! Ohne die Hinweise ist die Aufgabe ganz ok.
So mußt Du ja im Prinzip nur immer weiter Zeichen lesen und schauen, ob es ein Buchstabe ist (is_alpha() oder selber gebaut) und wenn es ein Buchstabe ist ihn ausgeben und die Anzahl hochzählen.
Und sobald es keiner mehr ist die Anzahl ausgeben und dann solange weitergehen, wie es keiner war.
Und das immer weiter, solange die Datei nicht zu Ende ist.Alle 'e' zählen laß erstmal weg. Das ist dann supi einfach, wenn die andere Aufgabe geklappt hat.
-
volkard schrieb:
snooker schrieb:
die angabe in der klammer und der Hinweis mit new() sollte wohl zum Verständnis beitragen - bei mir aber eher zur verwirrung...
Bei mir auch! Meno, war ich verwirrt! Ohne die Hinweise ist die Aufgabe ganz ok.
So mußt Du ja im Prinzip nur immer weiter Zeichen lesen und schauen, ob es ein Buchstabe ist (is_alpha() oder selber gebaut) und wenn es ein Buchstabe ist ihn ausgeben und die Anzahl hochzählen.
Und sobald es keiner mehr ist die Anzahl ausgeben und dann solange weitergehen, wie es keiner war.
Und das immer weiter, solange die Datei nicht zu Ende ist.Alle 'e' zählen laß erstmal weg. Das ist dann supi einfach, wenn die andere Aufgabe geklappt hat.
Seit wann schreibst du denn in so einem Stil ? ;O
-
cvcv schrieb:
Seit wann schreibst du denn in so einem Stil ? ;O
Hat Dich das "Meno" verwirrt?
Ja, daran habe ich minutenlang gebastelt, bis es gepaßt hat.
Nicht getroffen? Ich habe es letztendlich abgeschickt, ohne die perfekte Einleitung gefunden zu haben. Ich war unzufrieden damit. Ich wollte verrückten (abwegigen) Lösungen zuvorkommen.
Der Rest ist doch der liebe Erklärbar gegenüber Nubes wie immer, oder?
-
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; }