Wildcard bei Prüfungsanweisung einer if-Verzweigung



  • Hallo Community,
    ich werde aus den Anleitungen aus dem Internet einfach nicht schlau! Meine Kenntnisse sind zwar noch relativ gering, für mein Programmiervorhaben jedoch allemal ausreichend.

    Aber zum Problem: Ich habe eine if-Verzweigung und diese soll, eine vorher deklarierte und definierte, string-Variable nach zwei Wörtern durchsuchen, diese sind in meinem Programm "Rotauge" und "Brasse" (Experten wissen jetzt bestimmt schon worum es im Programm geht)! Beide Wörter müssen enthalten sein.

    Jetzt könnte natürlich einfach "if (antwort != "Rotauge und Brasse")" schreiben, allerdings würde ich den Benutzer dann in eine eigene Programmsyntax und zur Singularform zwingen und dies möchte ich nicht. Primitve, aus VB abgeleitete Umsetzungsversuche haben nicht funktionert, ich bitte um einen Denkanstoß!

    Vielen Dank im Voraus!



  • was bitte ist ne if-schleife?

    aber ansonsten könnten std::string::find weiterhelfen.



  • hanstroll123 schrieb:

    was bitte ist ne if-schleife?

    Eine falsche Bezeichnung für if-Verzweigung bzw. if-Abfragen. Hat man mir damals leider so beigebracht und hat sich deswegen in meine Sprache gefressen 😃



  • Julizi schrieb:

    Meine Kenntnisse sind zwar noch relativ gering, für mein Programmiervorhaben jedoch allemal ausreichend.

    ...

    if-Schleife

    if-Schleife? Soso...

    Julizi schrieb:

    ich bitte um einen Denkanstoß!

    boost regexp



  • Eure Antworten sind durchaus paradox, zuerst sprecht ihr mir jegliche Programmiersprachenkenntnisse, weil ich in einen von drei Fällen if-Schleife statt if-Verzweigung geschrieben habe, ab und schickt mir dann einen Link auf ein Nachschlagewerk (für Fortgeschrittene) bzw. schreibt irgendwas hin, was wie eine Programmiersprache aussieht. Sprich Ich bin zu doof für if-Abfragen, aber schlau genug euren Beitrag zu verstehen.

    Wie man aus dem obigen Abschnitt entnehmen kann, haben mir eure (oder deine, unregristiert) Beiträge leider nicht weiterhelfen können. Ich bitte um eine schlichte Erklärung einer beliebigen Funktion die das bewirkt, was ich umsetzen möchte.

    Liebe Grüße.



  • Poste doch mal, wie du das in VB löst, dann schaun wir ob man das übersetzen kann.



  • deine kompetenz hab ich dir damit eigentlich nicht abgesprochen...

    sorry, ich dachte, dass du dich selbst in eine funktion mit einer standardreferenz einlesen könntest.

    ok, dann mal gaaaanz langsam:

    so jetzt geh ich auf den link hier: http://www.cplusplus.com/reference/string/string/find/
    "Searches the string for the first occurrence of the sequence specified by its arguments."
    aha, klingt gut. da oben hat's aber vier versionen, welche nun? mal die beschreibung des ersten parameters lesen
    "str Another string with the subject to search for."
    aha, also die erste version erlaubt es uns, den string nach einem anderen string zu durchsuchen. genau das wollen wir.
    und der zweite parameter?
    "pos [...] A value of 0 means that the entire string is searched."
    also da der default auf 0 ist müssen wir da nichts machen, gut.

    jetzt müssen wir nur noch wissen, was die funktion zurückgibt.
    "Return Value
    The position of the first character of the first match.
    If no matches were found, the function returns string::npos."
    ok, das heißt, wenn er etwas findet, dann gibt er sicher nicht string::npos zurück. das können wir ausnutzen.

    dann mal zum programmieren:

    std::string antwort; //das steht irgendwo weiter oben bei dir
    //dann wird eingelesen
    
    //und nun der entscheidende part:
    
    if(antwort.find("Rotauge") != std::string::npos)
    //also wenn er den text tatsächlich gefunden hat
    {
        //dann suchen wir nochmals, diesmal nach einem anderen text:
        if(antwort.find("Brasse") != std::string::npos)
        {
            //super, wenn wir hier ankommen, dann kommen beide texte vor
        }
    }
    

    alternativ könnte man auch statt 2 ineinander verschachtelten if-bedingungen auch die bedingungen zu einer zusammenfassen mit dem logisch-und-operator &&, das bringt aber theoretisch keinen vorteil mit sich (ausser leserlichkeit).



  • Julizi schrieb:

    hanstroll123 schrieb:

    was bitte ist ne if-schleife?

    Eine falsche Bezeichnung für if-Verzweigung bzw. if-Abfragen. Hat man mir damals leider so beigebracht und hat sich deswegen in meine Sprache gefressen 😃

    ifschleife:
    if ( true )
    {
        goto ifschleife;
    }
    

    (aber kA, ob die Syntax stimmt)
    😃



  • Dieses Zusammenwerfen von if-Anweisungen in einen Topf mit for- und anderen Schleifen kommt daher, dass die Kinder heute nur noch Schuhe mit Klettverschlüssen tragen und ihre Geschenke nur noch mit Klebeband verschließen, so dass sie mit der Idee, dass eine Schleife etwas ist, das immer im Kreis herumführt, nicht vertraut sind.

    😉



  • Mein Informatiklehrer ist 63 und benutzt regelmäßig das Wort if-schleife.
    Danke schonmal für die Hilfestellung, allerdings funktioniert hier irgendwas nicht.

    marke : cout << "Augew" << ae << "hlt wurde die Stipprute!"; wait();
    	// cout << "Eingaben bitte mit Enter best" << ae << "tigen!\n";
    	cout << "Welche Fische f" << ae <<"ngt man mit dieser Rute?: ";
    	cin >> Fisch;
    	if (Fisch.find("Rotauge") && Fisch.find("Brasse") == string::npos) {
    		cout << "\nLeider falsch!\n";
    		goto marke;
    	}
    	cout << "Richtig!"; wait();
    

    Rotauge lässt er nicht durchgehen, Brasse jedoch schon, aber leider auch Karotte und alles andere. Allerdings soll nur Rotauge und Brasse als richtig gelten. Ein else-Fall scheint mir unnötig, da ich ja sofern es nicht zutrifft zurück zu "marke" springe. Was mich wundert ist, dass die Änderung der Vergleichsoperatoren nicht daran ändert.



  • Julizi schrieb:

    Mein Informatiklehrer ist 63 und benutzt regelmäßig das Wort if-schleife.

    Das war ein Witz. Dein Informatiklehrer bringt dir aber anscheinend auch bei, bei jeder Gelegenheit goto einzusetzen, das sind schon zwei Anhaltspunkte um seine Lehren ein bisschen zu hinterfragen.

    Deine Logik ist verkehrt, du gibst einfach die falschen Texte aus, siehe Kommentare:

    Danke schonmal für die Hilfestellung, allerdings funktioniert hier irgendwas nicht.

    marke : cout << "Augew" << ae << "hlt wurde die Stipprute!"; wait();
    	// cout << "Eingaben bitte mit Enter best" << ae << "tigen!\n";
    	cout << "Welche Fische f" << ae <<"ngt man mit dieser Rute?: ";
    	cin >> Fisch;
    	if (Fisch.find("Rotauge") != std::string::npos) {
    		if (Fisch.find("Brasse") != std::string::npos) {
    			cout << "\nLeider falsch!\n";   // Das ist der Erfolgsfall.
    			goto marke;
    		}
    		cout << "\nLeider falsch!\n"; // hier ist nur 'Rotauge' vorhanden
    		goto marke;
    	}
    	cout << "Richtig!"; wait(); // hier ist weder 'Rotauge' noch 'Brasse' vorhanden
    

    edit: Du hast deinen Code gerade geändert:

    if (Fisch.find("Rotauge") && Fisch.find("Brasse") == string::npos)
    

    Das ist Unsinn. Es sollte

    if (Fisch.find("Rotauge") == string::npos && Fisch.find("Brasse") == string::npos)
    

    heißen. Dokumentation lesen hilft...

    Nochmal edit: Ich hab deinen Code nur abgeschrieben und auf das minimale akzeptable Niveau gehoben. Im Gesamtkontext ist es natürlich immer noch Unfug. Richtig wäre:

    if (Fisch.find("Rotauge") != string::npos && Fisch.find("Brasse") != string::npos)
    

    Das trifft genau dann zu, wenn sowohl "Rotauge" als auch "Brasse" als Teilstring in Fisch gefunden werden.



  • Das Programm lässt aber immer noch Brasse und Rotauge als Einzelwort durchgehen, aber immerhin ist die Karotte jetzt falsch.

    Ganz am Anfang sah mein Code nämlich auch so aus, aber weil eben das nicht funktionierte hab ich da irgendwas verzapft. Puuuh...



  • Julizi schrieb:

    Ganz am Anfang sah mein Code nämlich auch so aus, aber weil eben das nicht funktionierte hab ich da irgendwas verzapft. Puuuh...

    Und jetzt wäre der Zeitpunkt, mal einen Schritt zurückzutreten und eine Funktion zu schreiben. Ganz konkret:

    /* Gibt wahr zurueck, wenn s das Wort "Rotauge" oder "Brasse" enthaelt.
     * Falsch in allen anderen Fällen.
    */
    bool enthaelt_brasse_oder_rotauge(const std::string& s);
    

Anmelden zum Antworten