Groß und klein Schreibung im string zählen



  • ich möchte keine verdammte Lösung nur ein Ansatz. Für die gerne Hilfe anbieten ich soll zählen aus wie viele buschstaben meine Eingabe besteht.



  • Wo fehlt es denn genau? Beim Einlesen der Eingabe? Beim Iterieren über die Eingabe? Beim Feststellen, ob es sich um einen Klein-/Großbuchstaben handelt? Beim zählen jener Buchstaben? Bei der Ausgabe des Ergebnisses?



  • Paradox schrieb:

    ich möchte keine verdammte Lösung nur ein Ansatz. Für die gerne Hilfe anbieten ich soll zählen aus wie viele buschstaben meine Eingabe besteht.

    Du sollst also die Standardfunktion strlen nachprogrammieren.
    Das sollte eigentlich in jedem Buch/Tutorial zu C vorkommen.



  • Es soll egal sein ob es groß oder klein geschrieben ist also bei scheitert es beim zählen ich weiß nicht wie ich es zum zählen bringen kann. Vlt ist eine schleife sinnvoll ich hab echt keine Ahnung. Nur so mal nebenbei ich hab die kompletten Lösungen zu den Aufgaben doch ich würde es mal selber machen da ich im Zwischentestat es selber machen muss.


  • Mod

    Schleifen sind gut, wenn man die gleiche Aktion mehrmals wiederholen möchte. "Zählen" besteht daraus, dass man wiederholt etwas um Eins erhöht. Denk mal darüber nach.

    Der Trick ist jetzt natürlich, zu wissen, wann man fertig ist mit dem Zählen. Dazu sind gewiss Hinweise oder Lösungen im Unterricht gegeben worden, wie das Ende einer Zeichenkette zu erkennen ist.



  • Paradox schrieb:

    ich möchte keine verdammte Lösung nur ein Ansatz. Für die gerne Hilfe anbieten ich soll zählen aus wie viele buschstaben meine Eingabe besteht.

    Welche Ansatz hast du denn bislang? Zeig mal was du bisher unternommen hast um zu einer Lösung zu kommen.



  • Paradox schrieb:

    Es soll egal sein ob es groß oder klein geschrieben ist also bei scheitert es beim zählen ich weiß nicht wie ich es zum zählen bringen kann. Vlt ist eine schleife sinnvoll ich hab echt keine Ahnung. Nur so mal nebenbei ich hab die kompletten Lösungen zu den Aufgaben doch ich würde es mal selber machen da ich im Zwischentestat es selber machen muss.

    Selber machen heißt bei dir also folgendes: "Ich guck mir die Lösung an. Uhh versteh ich nicht. hmm vielleicht ein Schleifchen. Och nee, doch keine Ahnung. Im Internet nach Lösungen zu einer Standardaufgabe suchen? Uhh nee, ich frag lieber in nem Forum"
    Das ist falsche Weg mein Freund!



  • Also ich hab etwas versucht doch es läüft, nur beim debuggen kommen paar Fehler:

    #include <iostream>
    #include <string>
    using namespace std;
    
    int main()
    {
    	string text;
    	unsigned int a = 0;
    	cout << "Text eingaben: ";
    	getline(cin, text);
    
    	for (int i = 0; i < text.length; i++)
    	{
    		char x = text.at(i);
    
    		if ((x >= 'a' && x <= 'z') || (x >= 'A' && x <= 'Z'))
    		{
    			a;
    		}
    
    	}
    	cout << "Der Text hat " << a << " Buchstaben" << endl << endl;
    
    	system("pause");
    	return 0;
    
    }
    

    Fehler C3867 "std::basic_string<char,std::char_traits<char>,std::allocator<char>>::length": Keine Standardsyntax; "&" zum Erstellen eines Verweises auf das Member verwenden Project1 d:\fh aachen informatik\ws 2017-18\grundlagen der informatik und höhere programmiersprache\bootcamp\aufgabe 5\project1\quelle.cpp 12

    Fehler C2446 "<": Keine Konvertierung von "unsigned int (__thiscall std::basic_string<char,std::char_traits<char>,std::allocator<char>>::* )(void) noexcept const" in "int" Project1 d:\fh aachen informatik\ws 2017-18\grundlagen der informatik und höhere programmiersprache\bootcamp\aufgabe 5\project1\quelle.cpp 12



  • Beim debuggen? Das Programm wird nicht übersetzt! length ist eine Funktion.



  • a;
    

    Das macht was?



  • Ja ich hab da etwas probiert halt bisschen gepokert bis zu dem

    if
    

    bin ich gekommen dann wusste ich nicht mehr weiter. Ich muss ha erst mit der schleife zählen und dann den Definitionsbereich bestimmen sodass keine Leerzeichen und Sonderzeichen wie z.B. ! gezählt werden. Danach komme ich nicht mehr weiter.



  • Schau halt nach wie du ne Variable inkrementierst.



  • wörtner schrieb:

    Schau halt nach wie du ne Variable inkrementierst.

    Komisch, bei der for-Schleife klappt es ja. 🙄



  • Der Ansatz ist schonmal richtig würde ich sagen. Ich hätte es zumindest nicht viel anders gemacht.

    Ich habe jetzt mal aus length ne Funktion gemacht -> length()
    und a zum hochzählen bewegt -> a++.

    Ich glaube das war alles was dich ausgebremst hat. Hier und da habe ich noch ein paar Kleinigkeiten geändert^^.

    #include <iostream>
    #include <string>
    
    int main() {
    
        std::string text;
        unsigned int a = 0;
        std::cout << "Text eingaben: ";
        getline(std::cin, text);
        char x;
    
        for (int i = 0; i < text.length(); i++) {
    
            x = text.at(i);
    
            if ((x >= 'a' && x <= 'z') || (x >= 'A' && x <= 'Z')) {
                a++;
            }
    
        }
        std::cout << "Der Text hat " << a << " Buchstaben" << std::endl << std::endl;
    
        system("pause");
        return 0;
    
    }
    


  • Tja, da sich der Verfasser nichteinmal mehr meldet gehe ich davon aus, es hat funktioniert. Man hätte sich ja wenigstens bedanken können bei den Leuten die geholfen haben...



  • Undank ist der Welten Lohn.



  • Die Aufgabe ist eigentlich nichts für Anfänger. Eine Lösung in C++ könnte so aussehen:

    #include <locale>
    #include <string>
    #include <iostream>
    #include <algorithm>
    
    int main()
    {
        using namespace std;
    
        // auto myLocale = locale("german");
        auto myLocale = locale();   // aktuelle globale Locale
        auto& ct = use_facet< ctype< char > >( myLocale );
        for( string text; cout << "Text eingaben: ", getline( cin, text ); )
        {
            cout << "Der Text enthaelt " 
                << count_if( begin(text), end(text), [&ct]( char zeichen ) { return ct.is( std::ctype_base::alpha, zeichen ); } ) 
                << " Buchstaben" << endl;
        }
        return 0;
    }
    

    Gibt man den Text "Größe" ein kommt als Ergebnis 3 heraus. Da stellt sich die Frage, was ist ein Buchstabe? Aktiviert man das "german" (s. Code) kommt unter Windows das Ergebnis 4. Anschließend könnte man dann über das Thema 'Code Pages' referieren.
    Es gibt 'ne Menge zu lernen, wenn man programmieren will!

    ... und - um an meinen Vorgänger Zhavok anzuschließen - nein! nach Beiträgen dieser Art meldet sich der Thread-Ersteller normalerweise nicht mehr.

    Gruß
    Werner



  • Werner Salomon schrieb:

    Gibt man den Text "Größe" ein kommt als Ergebnis 3 heraus. Da stellt sich die Frage, was ist ein Buchstabe? Aktiviert man das "german" (s. Code) kommt unter Windows das Ergebnis 4. Anschließend könnte man dann über das Thema 'Code Pages' referieren.
    Es gibt 'ne Menge zu lernen, wenn man programmieren will!

    Moin, evtl. mit wchar_t...

    #include <cstdlib>
    #include <locale>
    #include <string>
    #include <iostream>
    #include <algorithm>
    
    // Test der Lokalisierung
    
    int main() {
    
      using namespace std;
    
      locale::global( locale("") );
    
      auto &ct = use_facet< ctype< wchar_t > >( locale("") );
    
      for( wstring text; wcout << "Text eingeben: ", getline( wcin, text); )
        {
          wcout << L"Der Text enthält "
                << count_if( begin(text), end(text), [&ct](wchar_t zeichen) { return isalpha( zeichen, locale("")); } )
    
                << " Buchstaben\n";
        }
      return EXIT_SUCCESS;
    }
    

    Zumindest hier kommt bei "Größe" 5 heraus. Auch mit Großbuchstaben, inkl. großem 'SZ' 🙂

    System: OpenSuse 13.2 mit g++ 7.2.1 aus dem gcc-repo
    g++ -ansi -Wpedantic -Wall -std=c++17 -g count_alpha.cpp -o count_alpha
    Grüße!

    Edit: Ich bekomme es mit use_facet nicht hin, daher hier eine saubere Version mit isalpha 🙄

    #include <cstdlib>     // EXIT_SUCCESS
    #include <locale>
    #include <string>
    #include <iostream>
    #include <algorithm>
    
    // Test der Lokalisierung
    
    int main() {
    
      using namespace std;
    
      cerr << "Locale nach Programmstart: " << locale().name() << '\n';
    
      auto myLocale = locale("");   // Locale aus den Benutzereinstellung, zumindest unter Linux
    
      locale::global( myLocale );
    
      cerr << "Locale der Benutzereinstellung: " << myLocale.name() << '\n';
    
      for( wstring text; wcout << "Text eingeben: ", getline( wcin, text); )
        {
          wcout << L"Der Text enthält "
                << count_if( begin(text), end(text), [&myLocale](wchar_t zeichen) { return isalpha( zeichen, myLocale); } )
                << " Buchstaben\n";
        }
      return EXIT_SUCCESS;
    }
    

    Ergebnis:

    Locale nach Programmstart: C
    Locale der Benutzereinstellung: de_DE.UTF-8
    Text eingeben: Ein Sigma: σ
    Der Text enthält 9 Buchstaben
    Text eingeben: Größe
    Der Text enthält 5 Buchstaben
    Text eingeben: GRÖẞE
    Der Text enthält 5 Buchstaben
    Text eingeben: ^C

    Das Sigma wird auch auch mitgezählt...



  • So, geht doch...

    folgende Version zählt nur die Buchstaben a-z, A-Z, äöüß und ÄÖÜẞ, ich hoffe std-konform...

    War eine schwere Geburt 🙂

    Ich hatte bei

    locale::global( myLocale );
    

    meine 'myDeLocale' eingesetzt mit dem Ergebnis das es immer einen Programmausstieg ohne Fehler gegeben hat. Ob das normal ist oder am gcc bzw. an der stdlib liegt weiß ich nicht. Hatte dann sämtliche protected-Funktionen der std::ctype mit wcerr implementiert. Ohne Ergebnis.

    Bis ich Begriffen hatte das der Ausstieg wohl schon beim wcin kam, ohje 😃

    #include <cstdlib>     // EXIT_SUCCESS
    #include <locale>
    #include <string>
    #include <iostream>
    #include <algorithm>
    
    // Test der Lokalisierung
    
    struct de_wctype : std::ctype< wchar_t >
    {
      bool do_is(mask m, char_type c) const
      {   
        if ((m & alpha) && ( c == L'ä' || c == L'Ä' || c == L'ö' || c == L'Ö' || c == L'ü' || c == L'Ü' || c == L'ß' || c == L'ẞ' )) {
          return true; 
        }
        return ctype::do_is(m, c);
      } 
    };
    
    int main() {
    
      using namespace std;
    
      wcerr << "Locale nach Programmstart: " << locale().name().c_str() << '\n';
    
      auto myLocale = locale("");   // Locale aus den Benutzereinstellung, zumindest unter Linuxt
    
      de_wctype *my_de_wctype = new de_wctype; // Kein leak, siehe http://en.cppreference.com/w/cpp/locale/ctype
                                               // und http://en.cppreference.com/w/cpp/locale/ctype/~ctype
                                               // Test als lokales Objekt ergibt double-free beim beenden...
    
      auto myDeLocale = locale(myLocale, my_de_wctype);
      auto &ct = use_facet< ctype < wchar_t > >(myDeLocale);
    
      locale::global( myLocale );
      wcerr << "Locale der Benutzereinstellung: " << myLocale.name().c_str() << '\n';
    
      for( wstring text; wcout << "Text eingeben (leere Eingabe zum beenden): ", getline( wcin, text), text != L""; )
        {
          wcout << L"Der Text enthält "
                << count_if( begin(text), end(text), [&ct](wchar_t zeichen) { return ct.is( ctype_base::alpha, zeichen); } )
                << " Buchstaben\n";
        }
    
      return EXIT_SUCCESS;
    }
    

    Die Forumssoftware zeigt das große SZ in den Code-Tags nicht richtig an, also bei "|| c == L'& #7838;'" müsste ein großes SZ (ẞ) rein...

    Und source ist mit utf-8 gespeichert, evtl. gibt man besser die entsprechenden Unicode-Nummern an...

    Ergebnis:

    Locale nach Programmstart: C
    Locale der Benutzereinstellung: de_DE.UTF-8
    Text eingeben (leere Eingabe zum beenden): öäüßÖÄÜẞσ
    Der Text enthält 8 Buchstaben
    Text eingeben (leere Eingabe zum beenden): JKLÖ
    Der Text enthält 4 Buchstaben
    Text eingeben (leere Eingabe zum beenden):

    Sigma etc. wird nun ignoriert...

    Have a nice day!


Anmelden zum Antworten