Bestimmung der Häufigkeit von Buchstaben in einem String



  • Hallo, ich komme gerade bei meinem Programm nicht weiter.
    Ich lese von der der Kommandozeile einen String ein, zähle die darin enthaltenen Zeichen(nur Buchstaben von 'a-z') und gebe die Anzahl der Zeichen wieder aus.
    Nun möchte ich das neben der Anzahl der Zeichen die relative Häufigkeit ermittelt wird. Wie oft ein zeichen im Verhältnis zu den anderen auftgetaucht ist.

    Jedoch funktioniert das bei mir nicht -.-

    Von der Theorie wäre es doch: Anzahl des jeweiligen Zeichens durch die Anzahl aller Zeichen.

    int count[26];					// array mit zaehler der zeichen
    	int ncline = 0;					// anz. aller Zeichen (zwischenraumzeichen nicht eingerechnet)
    
    	string cline;
    	for(int i = 1; i < (argc); ++i )
    	{
    		cline = argv[i];
    		for(unsigned int i = 0; i < cline.length(); ++i)
    		ncline;
    
    		for(unsigned int k = 0; k < cline.length(); ++k)
    		count[cline[k] -'a']++;
    
    	}
    
    	cout << "Die Uebergabe aus der commandline enthaelt: \n"
    	     << "   Zeichen: " << ncline << endl;
    
    	     double z = 0.0;		//Häufigkeit
    
    	     cout << "Auswertung : \n";
    				for(int i = 0; i <= 'z' - 'a'; i++)
    				{	
    				if(count[i] != 0)										 			
    				{
    					z = ( count[i] / ncline);
    
    					cout << static_cast<char>('!a'+i) << ": " << count[i]
    				         << " rel. Haeufigkeit : " << z <<endl;	
    				}
    

    Hat jemand eine idee :>



  • int count[26];					// array mit zaehler der zeichen (dessen Elemente du zuvor besser mit 0 initialisieren solltest) 
    	int ncline = 0;					// anz. aller Zeichen (zwischenraumzeichen nicht eingerechnet)
    
    	string cline;
    	for(int i = 1; i < (argc); ++i )
    	{
    		cline = argv[i];
    		for(unsigned int i = 0; i < cline.length(); ++i)
    		ncline; //ncline sollte vermutlich inkrementiert werden, sinnvollerweise macht man hier aber ncline+=cline.length(); statt der Schleife, wenn nur Kleinbuchstaben in der Kommandozeile vorkommen
    
    		for(unsigned int k = 0; k < cline.length(); ++k)
    		count[cline[k] -'a']++;   //Gilt hier auch, alles andere als Kleinbuchstaben endet in Problemen
    
    	}
    
    	cout << "Die Uebergabe aus der commandline enthaelt: \n"
    	     << "   Zeichen: " << ncline << endl;
    
    	     double z = 0.0;		//Musst du nicht unbedingt initialisieren, sollte der Compiler aber auch melden
    
    	     cout << "Auswertung : \n";
    				for(int i = 0; i <= 'z' - 'a'; i++)
    				{	
    				if(count[i] != 0)										 			
    				{
    					z = ( count[i] / ncline); //da count[i] und ncline integers sind, musst du vorher explizit nach double konvertieren, sonst wirst du immer 0 oder 1 als Ergebnis haben
    
    					cout << static_cast<char>('!a'+i) << ": " << count[i]    //sollte es nicht 'a' heissen?
    				         << " rel. Haeufigkeit : " << z <<endl;	
    				}
    


  • ah danke, lag an der typumwandlung... wie trivial 😎


Anmelden zum Antworten