C++ Buchstabenzählung, Probleme mit while



  • Zu dem anderen Problem. Komme aus der Schleife nur mit Break, sonst ist ne endlos Schleife.Ich nehme an das ist der Grund warum er bei einem Leerzeichen dazwischen abbricht und nicht bis zum Ende des Textes auswertet. Im Endeffekt will ich ja mit dem Programm alle möglichen Texte,Mails auswerten können.

    while((cin.get(eing))){
    if((eing >= 'a') && (eing <= 'z')) charcount[eing - 'a']++;
    else if((eing >= 'A') && (eing <= 'Z')) charcount[ch - 'A']++; else break;
    }



  • Cybermax007 schrieb:

    Im Endeffekt will ich ja mit dem Programm alle möglichen Texte,Mails auswerten können.

    WAHHHH noch eine Nachspezifizierung. gib halt mal \0 ein, dann brauchste kein break



  • Cybermax007 schrieb:

    Zu dem anderen Problem. Komme aus der Schleife nur mit Break

    Doch, Du kommst raus, wenn Du das Betriebssystemspezifische Dateiendezeichen eingibst.
    Unter Linux [Strg]+[d], unter Windows [Strg]+[z]. Wenn ich mich recht erinnere.



  • padreigh schrieb:

    Cybermax007 schrieb:

    Im Endeffekt will ich ja mit dem Programm alle möglichen Texte,Mails auswerten können.

    WAHHHH noch eine Nachspezifizierung. gib halt mal \0 ein, dann brauchste kein break

    Das wird nicht klappern,
    Eingabe von \0 kommt ja als '\' '0' rein.
    Nur auf Sourcecodelevel gibt's die Escape-Sequenzen.



  • Buchstaben in map speichern (buchstabe als key, anzahl als value)
    Durchiterieren durch map und in ein multiset speichern mit größen vergleich nach .second als vergleich. Multiset ausgeben. Sollte doch so gehen, oder?



  • #include <vector>
    #include <iostream>
    #include <algorithm>
    #include <string>
    #include <iomanip>
    
    typedef std::vector<std::pair<int, char>> PairVec;
    
    void Inc(PairVec& vec, char c);
    
    int main()
    {
    	PairVec vec;
    
    	std::string buf;
        std::getline(std::cin, buf); 
    
    	double total = 0;
    
    	for (std::string::iterator it = buf.begin(); it != buf.end(); ++it)
        {
            if (isalpha(*it))
            {
    			Inc(vec, *it);
    
    			++total;
            }
        }
    
    	std::sort(vec.rbegin(), vec.rend());
    
    	std::cout.precision(3);
    
    	for (PairVec::iterator it = vec.begin(); it != vec.end(); ++it)
    	{
    		std::cout << it->second << " = " << (it->first / total) * 100 << "%" << std::endl;
    	}
    }
    
    void Inc(PairVec& vec, char c)
    {
    	for (PairVec::iterator it = vec.begin(); it != vec.end(); ++it)
    	{
    		if (it->second == c)
    		{
    			++it->first;
    			break;
    		}
    	}
    
    	vec.push_back(std::make_pair(1, c));
    }
    


  • Korrektur:

    #include <vector>
    #include <iostream>
    #include <algorithm>
    #include <string>
    #include <iomanip>
    
    typedef std::vector<std::pair<int, char>> PairVec;
    
    void Inc(PairVec& vec, char c);
    
    int main()
    {
    	PairVec vec;
    
    	std::string buf;
        std::getline(std::cin, buf); 
    
    	double total = 0;
    
    	for (std::string::iterator it = buf.begin(); it != buf.end(); ++it)
        {
            if (isalpha(*it))
            {
    			Inc(vec, *it);
    
    			++total;
            }
        }
    
    	std::sort(vec.rbegin(), vec.rend());
    
    	std::cout.precision(3);
    
    	for (PairVec::iterator it = vec.begin(); it != vec.end(); ++it)
    	{
    		std::cout << it->second << " = " << it->first << " : " << (it->first / total) * 100 << "%" << std::endl;
    	}
    }
    
    void Inc(PairVec& vec, char c)
    {
    	for (PairVec::iterator it = vec.begin(); it != vec.end(); ++it)
    	{
    		if (it->second == c)
    		{
    			++it->first;
    
    			return;
    		}
    	}
    
    	vec.push_back(std::make_pair(1, c));
    }
    

Anmelden zum Antworten