Häufigkeit von Wörtern in (string) Text zählen
-
Bin Anfänger in c++ und soll ein Programm schreiben
das einen Text einließt mit get.string
und dann zählt wie oft ein Wort mit 1 Buchstaben , 2 Buchstaben
3. Buichstaben.... vorkommt.
Kann mir bitte einer helfen.
Ohne s.size Funktionen etc.
ganz simple soll es geschrieben sein.
-
Dieser Thread wurde von Moderator/in estartu_de aus dem Forum MFC (Visual C++) in das Forum C++ verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Wie willst du ohne size() die Länge eines Wortes bestimmen? (size ist das günstigste für diesen Zweck, du kannst natürlich dessen Funktionalität auch mit strlen oder (für die ganz hartnäckigen) einer for()-Schleife nachbauen).
Wenn du die Wortlänge hast, empfehle ich dir einen vector<int>, in dem du die Anzahlen mitschreibst:
vector<int> anzahl; string wort; while(fin>>wort) { int char_anzahl=wort.length();//statt length() kannst du dich beliebig austoben, wenn dir das zu einfach ist if(char_anzahl<anzahl.size())anzahl.resize(char_anzahl); anzahl[char_anzahl-1]++; } for(int n=0;n<anzahl.size());++n) cout<<"es gibt "<<anzahl[n]<<" Wörter mit "<<n+1<<" Buchstaben.\n";
-
Ja es soll wirklich für die ganz hartnäckigen programmiert werden.
Stelle mir ungefähr vor...
Erst einmal:
Char Satz[100] int Woerter[50]=0
int k=1
mit einer for Schleife dann
einlesen wielang die verschiedenen Wörter sind
bsp.
for(int i=0 ; Satz[i]="\n" ; i++)
{
if (Satz[i]=' ') int Woerter[k+1] ;
else Woerter[k]=Woerter[k]+1
}dann haette man schonmmal in Woerter[k] die verschiedenen Längen der Woerter gespeichert aber ich brauch ja die Anzahl der verschiedenen Wörter Längen?!
-
Hallo,
hast du in etwa sowas gesucht?#include <cstdlib> #include <iostream> using namespace std; int main() { char Satz[28] = {"aaaaa bb ccc dddd dd eeeee."}; int Woerter[28]; for (int i = 0; i < 28; i++) { Woerter[i] = 0; } int zaehler1 = 0; int zaehler2 = 0; for (int i = 0; i < 28; i++) { if (Satz[i]==' '||Satz[i]=='.') { Woerter[zaehler2-1]++; zaehler1++; zaehler2 = 0; } else { zaehler2++; } } for (int i = 0; i < 28; i++) { if (Woerter[i] != 0) cout << "Wörter mit der Anzahl " << i+1 << ": " << Woerter[i] << endl; } system("PAUSE"); return 0; }MfG Jaschi
-
Ja super genau so wollte ich es haben,
jetzt nur noch eine Kleinigkeit:Es soll nicht da stehen mit Wörter mit 3 Buchstaben = 2
sondern Wörter mit 3 Buchstaben = ##
also als Balkendiagramm mit ##
-
Danke habe es selber geschafft, sieht jetzt so aus
#include "stdafx.h" #include <iostream> using namespace std; int main() { char Satz[200]; cout << "Text = ?" ; rewind(stdin); cin.get(Satz, 200); int Woerter[200]; for (int i = 0; i < 200; i++) { Woerter[i] = 0; } int zaehler1 = 0; for (int i = 0; i<200 ; i++) { if (Satz[i]==' ' || Satz[i]=='\0') { Woerter[zaehler1-1]++; zaehler1 = 0; } else { zaehler1++; } } for (int i = 0; i < 200; i++) { if (Woerter[i] != 0) { cout << i+1 << ": " ; for (int z=0; z<Woerter[i]; z++) { cout << "#"; } cout << endl; } } return 0; }
-
PeterF. schrieb:
Ja es soll wirklich für die ganz hartnäckigen programmiert werden.
Also für die ganz harten
- ohne Schnick-Schnack und straight forward.
Dann so:#include <map> #include <sstream> #include <iostream> #include <algorithm> #include <iterator> #include <functional> #include <iomanip> typedef std::map< std::string::size_type, int > catalog_type; struct Counter : std::iterator< std::output_iterator_tag, void, void, void, void > { explicit Counter( catalog_type& lz ) : m_lz( lz ) {} Counter& operator=( catalog_type::key_type laenge ) { ++m_lz[laenge]; return *this; } Counter& operator*() { return *this; } Counter& operator++() { return *this; } Counter& operator++( int ) { return *this; } private: catalog_type& m_lz; }; void printWL( const catalog_type::value_type& lz ) { using namespace std; cout << "Woerter mit " << setw(2) << static_cast< unsigned >( lz.first ) << " Buchstaben = "; const char c = cout.fill( '#' ); cout << setw( lz.second ) << '#' << setfill( c ) << endl; } int main() { catalog_type laengenZaehler; std::transform( std::istream_iterator< std::string >( // lesen & zählen std::stringstream("Das ist ein langer Text mit vielen Wörtern und manches mehr") ), std::istream_iterator< std::string >(), Counter( laengenZaehler ), std::mem_fun_ref( &std::string::size ) ); std::for_each( laengenZaehler.begin(), laengenZaehler.end(), &printWL ); // und ausgeben }
.. und ohne Zwischenspeicher. Und falls Du die Wörter aus einer Datei lesen möchtest, so ersetze 'std::stringstream("..")' durch 'std::ifstream("Datei-Name")'.
Gruß
Werner