C++ Buchstabenzählung, Probleme mit while



  • Hi,

    Hi, Versuche gerade ein Programm zu schreiben das mir die eingegeben Buchstaben zählt und danach sortiert ausgibt.Habe im Moment Probleme bei der Zählung. Speziell der while schleife
    Im Moment bin ich soweit...

    int main(){
    vector<int> charcount(26, 0);
    char eing;
    cin >> eing;

    while (cin(good)) //bis Eingabeende
    {

    if((eing >= 'a') && (eing <= 'z')) charcount[eing - 'a']++; // mitzaehlen
    else
    if((eing >= 'A') && (eing <= 'Z')) charcount[eing - 'A']++; //auch mitzählen

    cin >> eing; //neues Zeichen einlesen

    }
    }

    komme nie aus der schleife heraus.was soll ich da noch einbauen?

    lg



  • int main()
    {
        vector<int> charcount(26, 0);
        char eing;           
        cin >> eing;
    
        while (cin(good))           //bis Eingabeende
        {
           if((eing >= 'a')  &&  (eing <= 'z'))
              charcount[eing - 'a']++;    //mitzaehlen
           else
              if((eing >= 'A')  &&  (eing <= 'Z'))
                 charcount[eing - 'A']++;   //auch mitzählen
              else
                 break;
    
           cin >> eing; //neues Zeichen einlesen
        }       
    }
    


  • Also bei mir kompiliert das erst mal nicht.

    Das muss doch

    cin.good()
    

    heißen und nicht

    cin(good)
    

    Willst du nur Buchstaben zählen oder alles?
    Außerdem empfehle ich dir std::string

    Lg freeG

    So hier hab mal kurz was mit string gemacht ausm standgreif, müsst aber so laufen;-)

    #include <iostream>
    #include <string>
    
    using namespace std;
    
    int main()
    {
        string eingabe;
        cin >> eingabe;
    
        int counter = 0;
        for( int i = 0; i < eingabe.size(); ++i )
        {
            if( eingabe[i] >= 'a' && eingabe[i] <= 'z' )
                ++counter;
            else if( eingabe[i] >= 'A' && eingabe[i] <= 'Z')
                ++counter;
        }
    
        cout << "Es wurden " << counter << " Buchstaben eingegeben!";
    
    }
    


  • #include <iostream>
    #include <vector>
    using namespace std;
    
    int main()
    {
        vector<int> charcount(26, 0);
        char eing;
    
        while (cin.get(eing)) //bis Eingabeende
        {
    
            if((eing >= 'a') && (eing <= 'z'))
                charcount[eing - 'a']++; // mitzaehlen
            else if((eing >= 'A') && (eing <= 'Z'))
                charcount[eing - 'A']++; //auch mitzählen
        }
        cout<<"und jetzt noch die auswertung...\n";
    }
    


  • fr33g schrieb:

    Außerdem empfehle ich dir std::string

    Ich nicht. Schon std::vector war fehl am Platze.



  • volkard schrieb:

    fr33g schrieb:

    Außerdem empfehle ich dir std::string

    Ich nicht. Schon std::vector war fehl am Platze.

    Oh sorry, hab das ganze viel zu schnell gelesen, dachte er wolle die Anzahl der Buchstaben, kein Plan wie ich da drauf komme, er will ja die Buchstaben sortiert ausgeben.
    Sorry;-)

    Lg freeG



  • fr33g schrieb:

    dachte er wolle die Anzahl der Buchstaben, kein Plan wie ich da drauf komme, er will ja die Buchstaben sortiert ausgeben.

    Dachte auch, er wolle die Anzahl der Buchstaben. Und dann die Buchstaben nach Häufigkeit sortiert ausgeben.
    Das wäre aber eine viel zu schwierige Auswertung für jetzt schon.



  • volkard schrieb:

    fr33g schrieb:

    Außerdem empfehle ich dir std::string

    Ich nicht. Schon std::vector war fehl am Platze.

    wieso das denn, soll er C-Arrays nutzen?



  • std::array wäre wohl geeignet, aber einen Grund gegen vector sehe ich nicht. Alternativ auch evtl ne map.



  • Erstmal danke für die vielen Antworten! Ich werde gleich mal testen :-).

    Ja es sollen die Buchstaben gezählt und dann nach Häufigkeit gereit werden. Dachte mit Vektor müsste es doch gut klappen.

    lg



  • Skym0sh0 schrieb:

    volkard schrieb:

    fr33g schrieb:

    Außerdem empfehle ich dir std::string

    Ich nicht. Schon std::vector war fehl am Platze.

    wieso das denn, soll er C-Arrays nutzen?

    Ich nenne sie liebevoll C++-Arrays.



  • Danke hat mit while (cin.get(eing)) hats funktioniert 🙂 . Jetzt noch überlegen wie man das sortieren kann.



  • wieso das denn, soll er C-Arrays nutzen?

    Ja, was spricht denn dagegen? Ich hätte wahrscheinlich std::array gewählt, wegen der schöneren Iterationsmöglichkeiten, aber bei solchen Beispielen geht es auch wunderbar mit den guten alten C-Arrays.



  • wenn sortieren inherent ist, warum nicht ne map?

    #include <iostream>
    #include <map>
    
    int main()
    {
        std::map<char,int> myMap;
        typedef std::map<char,int>::const_iterator const_iter_myMap;
    
        // fill and initialize allowed characters
        for (char c='a'; c <= 'z'; ++c)
        {
            myMap[c]==0;
            myMap[std::toupper(c)]==0;
        }
    
        char eing;
        // capture, end with '\0'
        while ( std::cin.get(eing) )
        {
            if (myMap.find(eing) != myMap.end())
                myMap[eing]=myMap[eing]+1;    
        }
    
        // output
        for (const_iter_myMap it=myMap.begin() ; it != myMap.end(); it++ )
            if ((*it).second != 0)
                std::cout << (*it).first << " => " << (*it).second << " times" << std::endl;
    }
    


  • #include <iostream>
    #include <string>
    #include <cctype>
    
    int main()
    {
    	int vec[26] = {};
    
    	std::string buf;
    	std::getline(std::cin, buf);
    
    	for (std::string::iterator it = buf.begin(); it != buf.end(); ++it)
    	{
    		if (isalpha(*it))
    		{
    			++vec[std::tolower(*it) - 'a'];
    		}
    	}
    
    	for (unsigned int i = 0; i < 26; ++i)
    	{
    		if (vec[i] > 0) // ==> Ausgabe nur, falls Buchstabe existiert
    		{
    			std::cout<< static_cast<char>(i + 'a') << " = " << vec[i] << std::endl;
    		}
    	}
    }
    


  • padreigh schrieb:

    wenn sortieren inherent ist, warum nicht ne map?

    Weil for(int i='a';i<='z';++i) nicht minder sortiert ist.



  • volkard schrieb:

    padreigh schrieb:

    wenn sortieren inherent ist, warum nicht ne map?

    Weil for(int i='a';i<='z';++i) nicht minder sortiert ist.

    Das *mag* in irgend einer exotischem Fall nicht geordnet sein, die Map sortiert aber nach < und das ist für char's entsprechend überladen - also wird es bei der Ausgabe "irgendwie" über operator< sortiert sein... mag sein das sowas in C# dann als aAbBcCdD oder so sortiert ist - aber sortiert ist es 😃



  • padreigh schrieb:

    Das *mag* in irgend einer exotischem Fall nicht geordnet sein, die Map sortiert aber nach < und das ist für char's entsprechend überladen

    Cybermax007 will aber nach Häufigkeit und nicht nach Zeichen sortieren. Das heisst, char als Key bringt dabei nichts. int als Key geht aber auch nicht.

    Aber man könnte die Zeichen in einem zusätzlichen Schritt in einem anderen Container nach Häufigkeit sortiert abspeichern.



  • cybermax007 schrieb:

    <SNIPP> ... die eingegeben Buchstaben zählt und danach sortiert ausgibt. ...<SNAPP>

    Davon steht aber nichts im Ursprungspost - nur was von sortiert ausgeben. Ich habe für mich mal entschieden das er alphabetische Sortierung haben will 😉 wenn er was anderes will muss er das schon ein bisserl besser formulieren 🤡

    edith: Hubbs seh gerade, er hat ja nachspezifiziert. Der Fluch aller Informatiker 😛



  • Ja sollte dann nach Häufigkeit sortieren. Im Moment schaff ich es aber nur alphabetisch sortiert und ein weiteres problem hab ich auch noch, wenn ich eine eingabe mache die z.b. so aussieht "dsf jsaas" wertet er nur bis dsf aus und den rest des textes nicht mehr.

    Als Ausgabe hab ich mal gemacht:

    for(int i = 0; i < 26; i++)
    cout << static_cast<char>(i + 'A')
    << charcount[i];

    Kann man das noch sortieren oder muss man das generell anders machen?


Anmelden zum Antworten