Funktion: tolower



  • Hallöchen,

    nach einigen leider vergeblichen Versuchen die im Betreff genannte Funktion via Google und diversen anderen Foren zu recherchieren, seid ihr nunmehr meine letzte Anlaufstelle.

    Was ich bisher erreicht habe, in DEV C++ einen Programmcode zu erstellen der vorgegebene Wörter in der Konsolenanwendung in Kleinbuchstaben darstellt:

    /*
    #include <cstdlib>
    #include <iostream>
    
    using namespace std;
    
    int main()
    {   
        char text[] = "HALLO WIE GEHTS DiR?";
        for(int i=0;i<sizeof(text);i++){
                if(text[i] >= 'A' && text[i] <= 'Z'){
                      text[i] = text[i] + 32;
                }
        }
        cout << text << endl;
        system("PAUSE");
        return EXIT_SUCCESS;
    }
      */
    

    Meine momentane Form hat folgende Darstellung http://img194.imageshack.us/i/unbenanntx.gif/ // Funktion die nun realisiert werden soll ist:

    Bei Eingabe der richtigen Antwort soll nun die Groß- und Kleinschreibung keinerlei Relevanz haben. Egal wie man die Antwort "Ground Positioning System" schreibt, also sollte bspw. "GRounD POSItioniG SYSTEM" ebenfalls richtig sein.

    Mein Lösungsansatz bzw. Idee ist es mithilfe des ASCII-Code eine Umwandlung zu erreichen. Ich weiß wenn man den Betrag 32 zu einem kleingeschriebenen Buchstaben addiert, dessen Großbuchstaben erhält. Weitere Schwierigkeit ist sicherlich die Leerzeichen, die sich in einer Antwort befinden können zu ignorieren und desweiteren nicht nur einzelne Buchstaben sondern ganze Wörter umzuwandeln.

    Ich hoffe ich habe nun in aller Ausführlichkeit beschrieben welches Ziel ich verfolge und ich eine Hilfestellung/Anregungen von Euch erhoffe 🙂

    Soweit meine Gedankengänge (;

    Gruß Chris



  • #include <locale>
    #include <string>
    
    std::string to_lower(const std::string &value, const std::locale &locale = std::locale("german"))
    {
      std::string r;
      r.reserve(value.size());
    
      for(std::string::const_iterator i=value.begin(), e=value.end(); i != e; ++i)
      {
        r.push_back(std::tolower(*i, locale));
      }
    
      return r;
    }
    
    bool case_insensitive_comparer(const std::string &lhs, const std::string &rhs, const std::locale &locale = std::locale("german"))
    {
      return to_lower(lhs, locale) == to_lower(rhs, locale);
    }
    

    bb



  • Hallöle,

    blueangel1610 schrieb:

    Hallöchen,

    nach einigen leider vergeblichen Versuchen die im Betreff genannte Funktion via Google und diversen anderen Foren zu recherchieren, seid ihr nunmehr meine letzte Anlaufstelle.

    Was ich bisher erreicht habe, in DEV C++ einen Programmcode zu erstellen der vorgegebene Wörter in der Konsolenanwendung in Kleinbuchstaben darstellt:
    ...

    Ist doch vom Ansatz her brauchbar, ausbaufähig:

    int main() 
    {   
        setlocale(LC_ALL, ""); // Multilanguage tolower conversion.
        char text[] = "Geilomat programming System. FeIni GeHtS, BRUDER! TRÖÖÖT!"; 
    
        for( int i = 0; text[i]; i++ ) 
    		text[i] = tolower(text[i]);
    
        cout << text << endl; 
        return 0; 
    } 
    
    Gruß,
    B.B.
    


  • @unskilled

    Könntest Du deinen Beitrag ein bisschen kommentieren, damit ich verstehe was Du da geschrieben hast? Danke (:

    Gruß Chris



  • blueangel1610 schrieb:

    Könntest Du deinen Beitrag ein bisschen kommentieren, damit ich verstehe was Du da geschrieben hast? Danke (:

    Wenn du einzelne Funktionen die benutzt werden nicht verstehst schau am Besten in der Referenz deiner Wahl nach, was die jeweilige Funktion macht. Da mit solltest du schon einen guten Überblick bekommen, was die von unskilled skizzierte Funktion macht. Wenn du Fragen zu einzelnen Puntken hast stell sie einfach gezielt statt drauf zu hoffen, dass genau der Punkt ausreichend kommentiert wird 😉



  • Hallo,

    dann versuche ich mal die oben genannte Funktion mit meinen eigenen Worten und dem kleinen Verständnis für die C++ - Programmierung zu erklären und hoffe auf Rückmeldungen :x

    -Zunächst einmal haben wir ganz oben mit "include" Bibliotheken eingebunden.
    -Dann benutzen wir eine vorgefertigte(?), schon eingebundene Klasse/Funktion des C++ Builders und teilen ihm am Ende die Sprache mit, mit der er arbeiten soll, nehme ich mal an
    -Zwischendurch sehe ich dann noch eine For-Schleife deren Wirkung ich mir absolut nicht erklären kann und dann sind wir schon fast am Ende
    -Das "r.push_back(std::tolower(*i, locale));" könnte vllt. die Bedeutung der umgewandelten Buchstaben sein?

    Die Doppelpunkte stehen nochmal für welche Bedeutung?

    Wofür steht insbesondere die Bezeichnung "to_lower(lhs, locale)" und "to_lower(rhs, locale)" // Welche Aufgaben haben diese genau?
    Besonders die Abkürzungen "lhs" und "rhs" sind mir derweil noch unbekannt.

    Ich hoffe ich stelle mich wirklich nicht zu dumm an, aber ich versuche wirklich angestrengt diese Programmiersprache zu erlernen (;



  • unskilled schrieb:

    #include <locale>
    #include <string>
    //-Zunächst einmal haben wir ganz oben mit "include" Bibliotheken eingebunden.
    
    std::string to_lower(const std::string &value, const std::locale &locale = std::locale("german"))
    {
      std::string r;
      r.reserve(value.size());
    
    /*
    -Zwischendurch sehe ich dann noch eine For-Schleife deren Wirkung ich mir absolut nicht erklären kann und dann sind wir schon fast am Ende
    
    das hier geht den gegebenen string einfach von ganz vorn bis ganz hinten durch - so ähnlich wie pointer-arithmetik, nur eben gekapselt
    */
      for(std::string::const_iterator i=value.begin(), e=value.end(); i != e; ++i)
      {
    /*
    -Das "r.push_back(std::tolower(*i, locale));" könnte vllt. die Bedeutung der umgewandelten Buchstaben sein?
    
    std::tolower ist eine fkt, die einen einzelnen buchstaben, klein macht^^
    das ergebnis der fkt fügen wir mit push_back hinten an den string ran
    */
        r.push_back(std::tolower(*i, locale));
      }
    
      return r;
    }
    
    bool case_insensitive_comparer(const std::string &lhs, const std::string &rhs, const std::locale &locale = std::locale("german"))
    {
      //hier werden die beiden lower-case-strings mittels operator == einfach nur auf gleichheit getestet
      return to_lower(lhs, locale) == to_lower(rhs, locale);
    }
    

    bb

    -Dann benutzen wir eine vorgefertigte(?), schon eingebundene Klasse/Funktion des C++ Builders und teilen ihm am Ende die Sprache mit, mit der er arbeiten soll, nehme ich mal an

    kann ich nicht zuordnen - welche stelle meinst du damit? Oo

    Die Doppelpunkte stehen nochmal für welche Bedeutung?

    wurde glaube scope-operator genannt
    für den zugriff innerhalb von namespaces (-> google "namespace") oder statischen membern einer klasse/struct/... (-> google "static")

    Wofür steht insbesondere die Bezeichnung "to_lower(lhs, locale)" und "to_lower(rhs, locale)

    die fkt to_lower hab ich ganz am anfang ja implementiert, sie wandelt einen string komplett in lower-case um...
    lhs und rhs sind die beiden parameter (steht für left hand side / right hand side. kannst du aber auch anders nennen, wenn du willst...), die wir übergeben bekommen haben. locale ist ne hilfsklasse, die wir brauchen um zu wissen, welchen zeichensatz wir verwenden müssen...

    besser?
    frag ruhig weiter, wenn du was nicht verstehst(aber nachdem du zumindest versucht hast, es selbst zu verstehen).

    bb : )



  • blueangel1610 schrieb:

    -Zunächst einmal haben wir ganz oben mit "include" Bibliotheken eingebunden.

    Eingebunden werden eigentlich nur Header. Biblitoheken sind meistens etwas mehr als das. In diesem Fall handelt es sich um zwei Header der Standardbibliothek.

    -Dann benutzen wir eine vorgefertigte(?), schon eingebundene Klasse/Funktion des C++ Builders und teilen ihm am Ende die Sprache mit, mit der er arbeiten soll, nehme ich mal an

    Die klasse std::string gehört zur Standardbibliothek und hat mit dem C++ Builder rein garnichts zu tun. Der C++ Builder ist lediglich ein Compiler, der mit eigenen Bibliotheken kommen mag, die hier aber nicht benutzt werden. Solltest du dich mit den C++-Builder Bibliotheken beschäftigen wollen (wovon ich bei deinem aktuellen Wissensstand erstmal abrate) dann haben wir dafür ein eigenes Unterforum. Erste Aufgabe für dich: beschäftige dich ein wenig näher mit dem C++-Buch deiner Wahl (es sollte sich erstmal mit Standard C++ und nicht um den C++-Builder drehen) und lerne etwas über die grundlegensten Klassen der Standardbibliothek, wie z.B. eben std::string.
    Bei dem "german" gehts nicht um die Sprache selber, sondern nur um die sogenannte locale. Das ist auch wieder ein Teil der C++ Standardbibliothek. Locales bestimmen zum Beispiel, in welchem Format Zahlen geschrieben werden und andere Dinge, die Länderspezifisch sind. Richtige Sprachen (also z.B. deutsch oder englisch) versteht ein C++-Compiler nicht und kann sie auch nicht unterscheiden.

    -Zwischendurch sehe ich dann noch eine For-Schleife deren Wirkung ich mir absolut nicht erklären kann und dann sind wir schon fast am Ende

    Wenn du dich näher mit den Klassen der Standardbibliothek beschäftigst (Container und Iteratoren) dann solltest du die for-Schleife auch verstehen. Das gehört quasi zum kleinen Einmaleins, sowas taucht immer wieder auf.

    Das "r.push_back(std::tolower(*i, locale));" könnte vllt. die Bedeutung der umgewandelten Buchstaben sein?

    Siehe oben. Beschäftige dich mit Containern (strings sind quasi eine Art Container für Zeichen), dann wirds klarer.

    Die Doppelpunkte stehen nochmal für welche Bedeutung?

    Welche davon? das std:: ist ein Zugriff auf den Namensraum std. Sollte auch zeimlich früh in deinem Buch auftauchen.

    Wofür steht insbesondere die Bezeichnung "to_lower(lhs, locale)" und "to_lower(rhs, locale)" // Welche Aufgaben haben diese genau?
    Besonders die Abkürzungen "lhs" und "rhs" sind mir derweil noch unbekannt.

    die Bezeichnugn steht für den Aufruf der Funktion, die vorher definiert wurde. rhs und lhs sind variablennamen die vorher deklariert wurden. Sie werden oft benutzt und stehen für "left hand side" und "right hand side" (linke Seite udn rechte Seite)

    Ich hoffe ich stelle mich wirklich nicht zu dumm an, aber ich versuche wirklich angestrengt diese Programmiersprache zu erlernen (;

    Die Anstrengung ist der Fehler. Du versuchst dich in einem offenbar sehr frühen Stadium an Dingen, die einfach noch ein wenig zu fortgeschritten sind. Fang klein an und geh Schritt für Schritt ein gutes Tutorial durch und versuche nicht zu viel auf einmal. So eien Sprache lernt sich nicht von heut auf morgen, aber wenn du es Stück für Stück und richtig lernst gehören die Dinge die hier stehen für dich bald zu den einfachsten Fingerübungen.



  • Hallöchen,

    hier mal meinen momentanen Zwischenstand, nur leider immernoch ohne tolower() 😞
    Auch nach vielen gelesenen Forenbeiträgen zu diesem Thema ist mir leider noch immer unklar wie diese funktioniert.
    Ihr habt vermtl. Recht das ich zu hoch greife, aber was bleibt mir anderes übrig, wenn der Lehrer den Wunsch zum Einbau dieser Funktion äußert ...

    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #pragma hdrstop
    #include <stdlib.h> // Für Randomfunktion
    
    #include "Unit1.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    
    //Globale Deklarationen
    TForm1 *Form1;
    
    int Nr, Nr2; // Speichert zufällig generierte Zahlen
    const Max = 5;; // Konstanter Wert für Variable
    String Frage[Max]; // 5 Fragen als Array (von 0 - 4)
    String Antwort[Max]; // 5 Antworten als Array (von 0 - 4)
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::FormCreate(TObject *Sender)
    {
      randomize(); // Generiert Zufallszahl
    
      Frage[0]="Gegen wen setzte sich Bonn 1949 bei der Wahl der Bundeshauptstadt durch?";
      Frage[1]="Wer gewann im Jahr 2007 die F1-Weltmeisterschaft?";
      Frage[2]="Wer ist Erstbesteiger des Mount Everest?";
      Frage[3]="Wofür steht die Abkürzung ''GPS''?";
      Frage[4]="Wo befindet sich der Sitz der UNO?";
    
      Scrollbar1->Max = Max - 1; // Bewegt sich immer um eins
      Scrollbar1->Min = 0; // Startpunkt der Scrollbar
    
      Antwort[0]="Frankfurt am Main";
      Antwort[1]="Michael Schumacher";
      Antwort[2]="Edmund Hillary";
      Antwort[3]="Global Positioning System";
      Antwort[4]="New York";
    
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::Button_NeueFrageClick(TObject *Sender)
    {
      Panel_Frage->Caption = Frage[Nr]; // Abhängig von [Nr] wird Frage ausgegeben
      Edit_Antwort->Text = "Bitte geben Sie hier Ihre Antwortmöglichkeit ein!";
      Edit_Antwort->SetFocus(); // Fokus auf Edit-Feld
      Scrollbar1->Position=Nr; // Wechselnde Position an Scrollbar = Neue Frage auf Panel
      Nr2=Nr; // Wertezuweisung
    
      do
      {
      Nr=random(Max);
      }
    
      while (Nr==Nr2);
    
      Panel_Frage->Caption = Frage[Nr];
      Scrollbar1->Position=Nr;
      //Do-While: Es wird ausgeschlossen das sich die Frage 2x hintereinander wdh.
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Scrollbar1Change(TObject *Sender)
    {
      Nr=Scrollbar1->Position; // [Nr] steht für Position auf Scrollbar
      Panel_Frage->Caption = Frage[Scrollbar1->Position];
      /* Aufschrift des Panels abhängig von Frage die
         durch die Position der Scrollbar bestimmt wird*/
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button_TestenClick(TObject *Sender)
    {
    
    if(Edit_Antwort->Text == Antwort[Nr])
    {
      Panel_Bewertung->Caption = "Richtig!!!";
      Panel_Bewertung->Color=clLime;
    }
    
    else
    
    {
    Panel_Bewertung->Caption = "Falsch!!!";
      Panel_Bewertung->Color=clRed;
    }
    /* Auswertung der gegebenen Antwort -- incl. Färbung des Panels */
    
    }
    //---------------------------------------------------------------------------
    


  • was ist String?
    da es sicherlich ne vcl-string-klasse ist, könnte es gut sein, dass es da schon ne fertige member-fkt gibt: ToLower bzw ToUpper...

    bb



  • Dieser Thread wurde von Moderator/in pumuckl aus dem Forum C++ in das Forum VCL (C++ Builder) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Ja, es gibt in der VCL für AnsiString, respektive String die Funktionen AnsiString::LowerCase() und AnsiString::UpperCase().



  • Hallöchen (;

    Ihr werdet es nicht glauben, aber ich habe es endlich geschafft (:

    String Eingabea;
    String Antworta;
    
    Eingabea = Edit_Antwort->Text;
    Antworta = Antwort[Nr];
    
    if(Eingabea.LowerCase() == Antworta.LowerCase())
    

    Habt ihr eine Ahnung warum die Variablennamen "Eingabe" und "Ausgabe" nicht funktionieren, die Variablennamen "Eingabea" und "Ausgabea" dennnoch, wie in dem Bsp. funktionieren?



  • Schau dir noch mal diese Zeile genau an:

    Antworta = Antwort[Nr];
    

    Und nun überleg mal, warum du links nicht 'Antwort' schreiben darfst -)


Anmelden zum Antworten