Ich finde keine Alternative zu "If Bedingung"



  • Also ich versuche gerade eine Mini-Lexikon zu programmieren.
    Also auf die klassische Anfänger Art 😃 :

    if (eingabe == wort)
    {
      wort ist .........
    }
    

    Doch ich habe irgendwie keine Lust die ganze Zeit mit IF Bedingung zu arbeiten.
    Gibt es denn da keine Alternative ????

    Schön wäre es, wenn ich es alles unter Funktionen packen könnte.
    Aber da wartet ein Hindernis auf mich:

    Ich würde gerne wissen wie es unter Windows geht (bis jetzt habe ich es nur in der Konsolenanwendung geschafft 🙄 )



  • Guck dir mal die switch-Anweisung an, um deine ifs zu ersetzen und das ganze etwas kürzer zu machen.

    Da du scheinbar noch nicht sehr weit bist, wirst du wohl erstmal noch eine ganze Weile in der Konsole bleiben. Window-Programme (GUIs) sind schon etwas anspruchsvoller.



    1. Für Lexika bieten sich assoziative Container an, also z.B. hashtables, maps und wie sie alle heißen.

    2. Was verstehst du unter "unter Funktionen packen"?

    3. Das hat mit Windows oder Konsole nichts zu tun. Davon abgesehen sind Windows und Konsole keine Gegensätze - Ich vermute mal dass du eine Anwendung mit GUI unter Windows meinst, an Stelle der Windows Konsole. Ist aber wie gesagt ein völlig anderes Problem, für dessen Lösung du dich in eine entsprechende GUI-Bibliothek einarbeiten müsstest. (z.B. QT, wxWidgets, ggf auch blanke WinAPI und wie sie alle heißen, je nach deinen Zielen)



  • Switch-Anweisungen funktionieren aber nur mit built-in-Typen (kenne jetzt nicht die genaue Bezeichnung, jedenfalls aber nicht mit C-Strings oder std::string).



  • wxSkip schrieb:

    Switch-Anweisungen funktionieren aber nur mit built-in-Typen (kenne jetzt nicht die genaue Bezeichnung, jedenfalls aber nicht mit C-Strings oder std::string).

    Die Bezeichnung lautet Ganzzahlen; Aufzählungen mit eingeschlossen.



  • Genau, switch funktioniert eben nur bei Typen, die entweder int sind oder sich nach int konvertieren lassen. Ansonsten gibt's wohl nichts, was man als Alternative verwenden könnte - zumindest nichts, was ein Anfänger verstehen würde.^^

    mfg



  • Incocnito schrieb:

    zumindest nichts, was ein Anfänger verstehen würde.^^

    Was ist an einer Map so schwer zu verstehen, dass man sie einem Anfänger nicht zutrauen kann?

    #include <map>
    #include <string>
    #include <iostream>
    #include <ostream>
    
    typedef std::map<std::string, std::string> Buch;
    
    int main()
    {
        Buch woerterbuch;
        woerterbuch["Begriff"] = "bezeichnet man üblicherweise den Bedeutungsinhalt z. B. eines sprachlichen Ausdrucks oder einer Vorstellung";
        // usw fuer alle Begriffe...
    
        std::string abfrage = "Begriff";
        Buch::iterator ergebnis = woerterbuch.find(abfrage);
        if (ergebnis != woerterbuch.end())
            std::cout << abfrage << " bedeutet: " << ergebnis->second << std::endl;
        else
            std::cout << abfrage << " Wort wurde nicht gefunden!" << std::endl;
    
    }
    


  • Au ja, Iteratoren und STL sind für jeden Anfänger selbstverständlich total einleuchtend.



  • ich bin mir nichtmal sicher ob sein wort ein std::string ist ^^



  • Incocnito schrieb:

    Au ja, Iteratoren und STL sind für jeden Anfänger selbstverständlich total einleuchtend.

    Auf jeden Fall intuitiver zu bedienen als irgendwelches C-Zeugs. Wobei ich auch nirgendwo erkennen kann, wo man das Geheimnis eines Iterators verstanden haben muss, um das Problem zu lösen. Iteratoren sind maximal notwendig, wenn man die vorhandenen Paare ermitteln will. Also erst interessant, wenn er sich an die GUI-Lösung wagen will. Und dabei wird nicht mehr Wissen vorausgesetzt, als ich bei der Lösung mit C-Arrays nicht auch bräuchte. Was nebenbei auch erschlagen sein dürfte, wenn er GUIs programmieren kann.
    Der Iterator um an das Paar über find() zu kommen ist unnötig, man könnte auch einfach über den Index-Operator ganz klassisch drauf zugreifen. Ist für den Anfänger sicher besser. Aber das find() ist jetzt nicht so kompliziert und im Forum findet sich auch sicher jemand, der einem hilft. So dass man sich nicht unnötig die Map mit Missmatchs zumüllen muss.



  • Also noch die Version, ohne Iterator.

    #include <map>
    #include <string>
    #include <iostream>
    #include <ostream>
    
    typedef std::map<std::string, std::string> Buch;
    
    int main()
    {
        Buch woerterbuch;
        woerterbuch["Begriff"] = "bezeichnet man üblicherweise den Bedeutungsinhalt z. B. eines sprachlichen Ausdrucks oder einer Vorstellung";
        // usw fuer alle Begriffe...
    
        std::string abfrage = "Begriff";
        std::string ergebnis = woerterbuch[abfrage];
        if (ergebnis.length() == 0) // Begriffserklaerung ist leer
            std::cout << abfrage << " wurde nicht gefunden!" << std::endl;
        else
            std::cout << abfrage << " bedeutet: " << ergebnis << std::endl;
    }
    


  • Paul Müller schrieb:

    Also noch die Version, ohne Iterator.

    #include <map>
    #include <string>
    #include <iostream>
    #include <ostream>
    
    typedef std::map<std::string, std::string> Buch;
    
    int main()
    {
        Buch woerterbuch;
        woerterbuch["Begriff"] = "bezeichnet man üblicherweise den Bedeutungsinhalt z. B. eines sprachlichen Ausdrucks oder einer Vorstellung";
        // usw fuer alle Begriffe...
    
        std::string abfrage = "Begriff";
        std::string ergebnis = woerterbuch[abfrage];
        if (ergebnis.length() == 0) // Begriffserklaerung ist leer
            std::cout << abfrage << " wurde nicht gefunden!" << std::endl;
        else
            std::cout << abfrage << " bedeutet: " << ergebnis << std::endl;
    }
    

    Uh. Bin ganz und garnicht begeistert von dieser Version, jede erfolglose Suche erzeugt einen Eintrag und bläht die map unnötig auf. Dann doch lieber bei Iteratoren bleiben und bei Bedarf deren Konzept erklären.



  • Paul Müller schrieb:

    Incocnito schrieb:

    zumindest nichts, was ein Anfänger verstehen würde.^^

    Was ist an einer Map so schwer zu verstehen, dass man sie einem Anfänger nicht zutrauen kann?

    #include <map>
    #include <string>
    #include <iostream>
    #include <ostream>
    
    typedef std::map<std::string, std::string> Buch;
    
    int main()
    {
        Buch woerterbuch;
        woerterbuch["Begriff"] = "bezeichnet man üblicherweise den Bedeutungsinhalt z. B. eines sprachlichen Ausdrucks oder einer Vorstellung";
        // usw fuer alle Begriffe...
    
        std::string abfrage = "Begriff";
        Buch::iterator ergebnis = woerterbuch.find(abfrage);
        if (ergebnis != woerterbuch.end())
            std::cout << abfrage << " bedeutet: " << ergebnis->second << std::endl;
        else
            std::cout << abfrage << " Wort wurde nicht gefunden!" << std::endl;
    
    }
    

    Vielen dank Paul.
    Aber ist dieses Verfahren überhaupt effizient.
    Ich bin zwar noch Anfänger, aber ich würde gerne wissen, ob diese Methode bei mehreren Hundert Tausend Wörterbuch einträgen funktioniert oder einfach nur langsam arbeitet ?


  • Mod

    Costguard schrieb:

    Aber ist dieses Verfahren überhaupt effizient.

    Das ist sogar sehr effizient.

    Ich bin zwar noch Anfänger, aber ich würde gerne wissen, ob diese Methode bei mehreren Hundert Tausend Wörterbuch einträgen funktioniert oder einfach nur langsam arbeitet ?

    Ganz locker ausreichend. Wenn es dir wirklich um jede Mikrosekunde geht, könntest du auch einen Hashtable benutzen.


Anmelden zum Antworten