Tastatur-Programm (noob)



  • Hi Leute, weiß einer, wo ich den Denkfehler habe?

    Ich versuche eine Programm zu schreiben, dass mir alle Tastaturanschläge ausgibt, bis das Zeichen @ angetroffen wird. Das heißt, bis das @ getroffen wurde, wurden 13 mal f, 3 mal x, getippt...

    #include <iostream>
    
    using namespace std;
    
    int main ()
    
    {
    
        char i; //Deklaration von characters
        char eingabe;
    
        cout << "Bitte bedienen Sie die Tastatur mit Anschlaegen! " << endl;
    
        cin >> eingabe;
    
        for (i = 0; i <!=@; i++) // i wusste ich nicht worauf ich das setzten soll, dachte 0 gilt fpr zahlen wie für andere zeichen. Ich wollte solange i ungleich @, erhöhe i.
    
        {
            if (eingabe [i] == '@') break;
            eingabe [i] = tolower (eingabe [i]); //Für kleinbuchstaben
    
        }
    
       //Hier dachte ich an else, else mache weiter mit dem programm....
    {
    
    }
    
    }
    

    Bitte bitte keine Lösung oder einen fertigen Code, will kein Copy und paste machen. Brauche lediglich Verständnishilfen um es selber zu verstehen. Beispiele aber dennoch erwünscht.

    Vielen Dank meine Lieben
    3DMan



  • #include <iostream>
    #include <map>
    using namespace std;
    
    int main(){
    	map<char,int> anzahlen;
    	char ch;
    	while(cin>>ch && ch!='@')
    		++anzahlen[ch];
    	for(auto i:anzahlen)
    		cout<<i.first<<": "<<i.second<<'\n';
    }
    
    hallo, welt!@
    !: 1
    ,: 1
    a: 1
    e: 1
    h: 1
    l: 3
    o: 1
    t: 1
    w: 1
    


  • 3DMan schrieb:

    Bitte bitte keine Lösung oder einen fertigen Code, will kein Copy und paste machen. Brauche lediglich Verständnishilfen um es selber zu verstehen. Beispiele aber dennoch erwünscht.

    Nö. Macnhmal ist fertiger Code einfach besser! Wir haben hier auch andere "Spezialisten" im Forum, die keinen fertigen Code wünschen, auffällig ist, daß sie nicht merklich besser werden. Auf den Kern anzahlen[eingabe]=anzahlen[eingabe]+1 kommt man kaum selber.

    3DMan schrieb:

    Hi Leute, weiß einer, wo ich den Denkfehler habe?

    #include <iostream>
    using namespace std;
    
    int main ()
    {
    
        char i; //Deklaration von characters
        char eingabe;//wie unten ersichtlich wird planst du für string eingabe
        //i ist was anderes als eingabe? ach, i ist nur zu unlokal
    
        cout << "Bitte bedienen Sie die Tastatur mit Anschlaegen! " << endl;
       //du willst gar kein endl
    
        cin >> eingabe;
        //keine schleife? dann wenigstens nen sting machen
    
        for (i = 0; i <!=@; i++)
    //evtl for (i = 0; i<eingabe.size()&&eingabe[i]!='@'; i++)
    
        {
            if (eingabe [i] == '@') break;//aha!
    //also for (i = 0; i<eingabe.size(); i++)
    //bzw for(auto i:eingabe)
    //dann oben string eingabe statt char eingabe
            eingabe [i] = tolower (eingabe [i]); //Für kleinbuchstaben
    //ob das not tut? na, egal, erstmal hinkriegen
    
        }
    
       //Hier dachte ich an else, else mache weiter mit dem programm....
    {
    //selbe for-schleife und pro buchstabe dessen anzahl hochsetzten 
    }
    
    }
    


  • Vielen Dank, ich muss zwar grade was updaten, damit mir xCode überhaupt was ausspuckt. Ich weiß nicht wofür inlude map steht. Was verbirgt sich hinter dieser library?
    Was macht map <char,int> im vergleich zu character oder int?

    for(auto i:anzahlen)
    cout<<i.first<<": "<<i.second<<'\n';

    das verstehe ich auch nicht.
    Könntest du das kurz erklären?

    Vielen lieben Dank schonmal!
    Hast recht, vllt. ist es mit Code zu lernen doch besser...



  • Stell dir eine map wie ein Wörterbuch vor. Deutsch - Englisch hat sortierte deutsche Wörter damit man sie schnell finden kann und weist jedem deutschen Wort ein englisches zu.
    map<char, int> m; ist vom Prinzip her das gleiche, es weist einigen chars jeweils ein int zu bzw den vorkommenden Buchstaben eine Anzahl. m[char] gibt das zugehörige int zurück. Mit map<string, string> kann man ein Wörterbuch bauen.
    Bei der Schleife geht er jeden "Wörterbucheintrag" durch. Jeder Eintrag hat 2 Werte, ein char und ein int. Implementiert ist das als pair<char, int>. Mit pair.first kommst du ans erste Element, also an das char, mit pair.second an das int.



  • Danke! Das war sehr hilfreich.
    Kann einer vllt. nochmal genauer erklären, wofür das auto i: steht? Ich kanns mir schon denken in der Gesamtbetrachtung, aber was macht es genau...



  • Kurzform vom durchiterieren.

    //c++98
    for (map<char, int>::const_iterator i = anzahlen.cbegin(); i != anzahlen.cend(); ++i)
    

    Blargh, so viel sinnlose Tipperei, außerdem kennt der Compiler genau welchen Typ i haben muss und weist dich auch freundlich drauf hin wenn du es falsch machst. Wenn er es eh schon weiß kann er es auch gleich selber hinschreiben:

    //c++11
    for (auto i = anzahlen.cbegin(); i != anzahlen.cend(); ++i)
    

    Schon viel freundlicher, aber die Schreibfaulheit...

    //c++14
    for (auto i : anzahlen)
    

    Das sieht doch schon nett aus.

    //python
    for i in anzahlen:
    

    Naja, man kanns auch übertreiben.



  • nwp3 schrieb:

    //c++14
    for (auto i : anzahlen)
    

    Das sieht doch schon nett aus.

    range based for ist C++14? Dachte wäre auch mit C++11 eingeführt worden?


Anmelden zum Antworten