Anfänger braucht dringend Hilfe über String ,Zeichenkette



  • Hallo
    Ich bin auf der Suche nach einer Lösung für meine Aufgabe.

    es sieht so aus

    #include <iostream>

    using namespace std;

    int main ();

    char zeichenkette;

    //die Aufgabe besteht darin dass ich eine Zeichenkette eingeben muss z.b

    cout<<"Geben Sie die Zeichenkette ein " << endl ;
    cin>>Zeichenkette;

    // Z.b Zeichenkette lautet: Aaa Bbb Ccc Asdef

    Nun wenn ich die Zeichenkette eingebe , muss ich ein Buchstabe eingeben
    // wenn ich a eingebe sollte folgendes ausgegeben werden.
    cin>> buchstabe ;
    cout<<"Der Buchstabe"<< buchstabe << " kommt" << x << " Mal in der Zeichenkette vor"<< endl;

    Ich habe versucht nach Info zu suchen um die Aufgabe zu lösen , doch ich weiß nicht mal wonach ich suchen soll ( habe schon mit string funktion wörter zählen , count word in string gesucht aber nichts gefunden , im buch steht auch nichts)

    BITTE UM HILFE 🙂

    Bitte eine einfache Anwort für absoluter Anfänger 🙂

    Vielen Dank für die Antwort



  • der datentyp char speichert dir nur ein einzelnes zeichen. du willst aber eine zeichenkette. der richtige typ dafür ist std::string . um auf den zugreifen zu können brauchst du #include <string> . was std::string ist wird in jedem grundlagenbuch erklärt.

    du willst also einen bestimmten buchstaben in einem std::string zählen. schau dir mal http://www.cplusplus.com/reference/algorithm/count/ an.

    gruss.



  • Vielen Dank.
    Sie haben die richtige Antwort bezüglich meine Frage gegeben. ja das mit #include <string> habe ich auch schon gewusst nur leider vergessen einzugeben. Die Seite von Ihnen liefert genau das was ich brauche.

    Danke Schön 🙂



  • Die Lösung für die Aufgabe habe ich schon raus und erfolgreich getestet, aber mich würde interessieren ob es noch eine andere Lösung gäbe.

    Vielleicht kann jm. ja die Lösung posten, sodass ich auch was neues lernen kann 😃

    Hier ist die Lösung (ink. Aufgabenstellung)

    /Entwerfen Sie ein C++ Programm, welches eine Zeichenkette sowie einen Buchstaben einliest. Das Programm soll ausgeben, wie oft der Buchstabe in der Zeichenkette vorkommt.Kleinbuchstaben und Großbuchstaben gelten als unterschiedliche Buchstaben.
    Testlauf (Eingaben unterstrichen):
    Geben Sie die Zeichenkette ein: Aaa Bbb Ccc.
    Geben Sie den Buchstaben ein: a
    Der Buchstabe a kommt 2 mal in der Zeichenkette vor.
    Drücken Sie eine beliebige Taste . . .
    /

    #include <iostream>
    #include <string>

    using namespace std;

    int main( int argc, char **argv )
    {

    string zeichenkette;
    char buchstabe;

    cout<<"Geben Sie die Zeichenkette ein: ";
    getline(cin, zeichenkette);
    cout<<"Geben Sie den Buchstaben ein: ";
    cin>>buchstabe;

    long zahl = count(zeichenkette.begin(), zeichenkette.end(), buchstabe);

    cout<<"Der Buchstabe "<<buchstabe<<" kommt "<<zahl<<" Mal in der Zeichenkette vor"<<endl;

    return 0 ;
    }


  • Mod

    Es fehlt noch #include<algorithm> . Die andere Lösung wäre natürlich die handgeschriebene Version. Wahrscheinlich ist dies auch die Lösung, die der Aufgabensteller erwartet (es ist leider ziemlich üblich, auf deinem Kenntnisstand einfache Funktionen aus der Standardbibliothek nachprogrammieren zu lassen). Denk mal darüber nach, wie du das lösen würdest, nur mit den Grundbestandteilen der Sprache (Variablen, if-Verzweigungen, Schleifen, u.Ä.). Das ist eine einfache Aufgabe, bei der du viel lernst, wenn du sie selber löst.



  • yeurandom schrieb:

    Die Lösung für die Aufgabe habe ich schon raus und erfolgreich getestet, aber mich würde interessieren ob es noch eine andere Lösung gäbe.

    Vielleicht kann jm. ja die Lösung posten, sodass ich auch was neues lernen kann 😃

    Hallo yeurandom,

    Anbei eine Lösung für das etwas abgewandelte Problem. Wenn man zuerst den Buchstaben eingibt und anschließend die Zeichenkette, kann man beim Lesen der Zeichenkette gleich zählen:

    #include <iostream>
    
    int main()
    {
        using namespace std;
        char buchstabe;
        cout<<"Geben Sie den Buchstaben ein: ";
        cin>>buchstabe; 
        cout<<"Geben Sie die Zeichenkette ein: ";
        cin.ignore( 999, '\n' ); // Lese zunächst die komplette Zeile bis zum Ende, sonst stört das später!
        cin >> noskipws; // sage 'cin', dass auch Leerzeichen und Zeilenende mitgelesen werden
        int zaehler = 0;
        for( char zeichen; cin >> zeichen && zeichen != '\n'; ) // bis '\n' := End Of Line also Ende der Zeile lesen
        {
            if( zeichen == buchstabe )
                ++zaehler;
        }
        cout<<"Der Buchstabe "<<buchstabe<<" kommt "<<zaehler<<" Mal in der Zeichenkette vor"<<endl; 
    
        return 0;
    }
    

    Frage ruhig nach, falls irgendwas unklar ist.

    Gruß
    Werner



  • SeppJ schrieb:

    Es fehlt noch #include<algorithm> . Die andere Lösung wäre natürlich die handgeschriebene Version.

    Ja danke SeppJ

    welche funktion habe ich benutz sodass ich <algorithm> inkludieren soll ? Es lässt sich laufen trotz ohne Hilfe von #include<algorithm>

    Die andere Lösung mit Hilfe von If & Schleife sieht so in Ordnung aus ?

    #incclude <iostream>
    #include <string>
    using namespace std;
    
    int main()
    {
    	int x = 0; 
    	string eingabetext;
    	char buchstabe;
    
    	cout << "Geben Sie die Zeichenkette ein: ";
    	getline(cin, eingabetext);
    	cout << "Geben Sie den Buchstaben ein: "; cin >> buchstabe;
    
    	for (int i = 0; i < eingabetext.length(); i++) 
    		if (eingabetext.at(i) == buchstabe) // ... oder eingabetext[i] == ...
    			x++;
    
    	cout << "Der Buchstabe " << buchstabe << " kommt " << x
    		<< " mal in der Zeichenkette vor." << endl;
    
    	return 0;
    }
    

    Werner Salomon schrieb:

    Frage ruhig nach, falls irgendwas unklar ist.

    Ich nehme an: Zeichenkette lautet: Das macht ja richtig spass
    Meine Frage zu cin.ignore(999, '\n');

    1. Was genau bewirkt der Wert 999 // Ich habe es probiert auf 1 zu ändern--> läuft ganz normal

    2.Frage: Sie sagen dass Die Zeichen bis zum Ende gelesen werden soll wenn man cin.ignore ( 999, 'n\') eingibt.

    Anstatt '\n' habe ich 's' eingegeben um zu sehen ab wann es gelesen wird

    ergebnis a wurde 3mal gefunden, also es zählt nach Buchstabe s ( => nach "Das")

    kurz und knappt, wenn man (999, '\n') eingibt müsste es doch nichts zählen können da nach dem endline kein text mehr zu zählen ist oder denke ich wieder kommplett falsch. 😃

    Vielen Dank 👍


  • Mod

    yeurandom schrieb:

    welche funktion habe ich benutz sodass ich <algorithm> inkludieren soll ?

    count

    Es lässt sich laufen trotz ohne Hilfe von #include<algorithm>

    Bei dir vielleicht, mit genau deinem Compiler zur richtigen Uhrzeit, wenn die Mondphase stimmt. Aber garantiert überall? Nein. Verlass dich nie da drauf, dass ein Standardheader einen anderen einbindet (außer es ist genau dies vom Standard garantiert). Das geht immer schief. Beispielsweise der beliebte GCC hat in seiner Standardbibliothek fast gar keine Querverweise mehr zwischen Standardheadern und in jeder Version werden es weniger, weil die Entwickler diese gezielt ausmerzen. Damit wäre dein Programm dann plötzlich nicht mehr übersetzbar.

    Die andere Lösung mit Hilfe von If & Schleife sieht so in Ordnung aus ?

    Ist ok.



  • yeurandom schrieb:

    Meine Frage zu cin.ignore(999, '\n');

    1. Was genau bewirkt der Wert 999 // Ich habe es probiert auf 1 zu ändern--> läuft ganz normal

    2.Frage: Sie sagen dass Die Zeichen bis zum Ende gelesen werden soll wenn man cin.ignore ( 999, 'n\') eingibt.

    Anstatt '\n' habe ich 's' eingegeben um zu sehen ab wann es gelesen wird

    ergebnis a wurde 3mal gefunden, also es zählt nach Buchstabe s ( => nach "Das")

    kurz und knappt, wenn man (999, '\n') eingibt müsste es doch nichts zählen können da nach dem endline kein text mehr zu zählen ist oder denke ich wieder kommplett falsch. 😃

    Der erste Parameter bei ignore gibt an, wie viele Zeichen maximal(!) gelesen werden, um das '\n' (also den zweiten Parameter) zu finden. Siehe ignore.
    Also das '999' heißt so viel wie "viele" - korrekt wäre hier std::numeric_limits< std::streamsize >::max() (bedeutet hier 'unendlich' viele), aber dann würdest Du auch fragen, was das soll 😉

    Bei Zeile 8 in meinem Listing wird genau ein Zeichen gelesen. Dahinter steht aber noch das EOL (das '\n'), wenn man nun mit cin >> noskipws das Überspringen der White Space Character abschaltet und dann bis EOL (also '\n') liest, so würde die for-Schleife dahinter genau dieses eine EOL lesen und dann beendet werden. Probiere es aus, indem Du die Zeile 10 einfach weg lässt.
    Man kann cin.ignore( 999, '\n' ); auch interpretieren als: "Überlese den Rest der aktuellen Zeile" .. hinter dem Buchstaben.

    Gruß
    Werner


Anmelden zum Antworten