Prüfung ob Zahl im Array bereits vorhanden



  • Hallo,

    habe das Problem, dass er nicht überprüft ob die Zahl bereits vorhanden ist.
    Es kann natürlich vorkommen, dass zweimal hintereinander die eingegebene Zahl bereits im Array vorkommt. Dies möchte ich genauso ausschließen. Der erste Fall funktioniert einwandfrei. Aber falls die Zahl die bereits vorhanden ist über 21 liegt würde es mir das wieder ignorieren. Ich denke ich müsste einen besseren Algorithmus entwickeln, aber komme leider nicht drauf.

    Danke für euere Hilfen im Voraus.

    int iEingabe;
        int zahl_bereits_vorhanden = 1;
    
        void TippzettelAusfuellen(int A[], int const &max){
            cout << "Fuellen Sie Ihren Tippschein aus: " << endl;
            for (int i = 0; i < max; i++) {
                    cout << "Zahl " << (i+1) << ".: ";
                    cin >> iEingabe;
                    while (iEingabe > 21) {
                            cout << "Zahl ueber 21!\n" << "Eingabe wiederholen!\n";
                            cin >> iEingabe;
                    }
                    if (i >= 1) {
    
                    while (zahl_bereits_vorhanden == 1){
    
                         for (int j = (i-1); j = 0; j--){
                            if (iEingabe == A[j]) {
                                cout << "Zahl bereits vorhanden!\n" << "Eingabe wiederholen!\n";
                                cin >> iEingabe;
    
                            }
                         }
                         zahl_bereits_vorhanden = 0; 
                    }
                    A[i] == iEingabe;
                    zahl_bereits_vorhanden = 1;
                    }
            }            
    
        };
    


  • Die Bedingung in Zeile 19 gar keine.

    Wenn die Zahl schon im Array ist, kannst du jeden Wert eingeben.



  • Verbesserung?



  • for (int j = (i-1); j >= 0; j--)
    


  • Und es bietet sich eine do-while [c]-Schleife an, mit nur einer Stelle für die Eingabe.



  • depream schrieb:

    Verbesserung?

    bool any_of( const int* from, const int* to, int value )
    {
        for( ; from != to; ++from )
            if( *from == value )
                return true;
        return false;
    }
    
    void TippzettelAusfuellen( int A[], int max )
    {
        cout << "Fuellen Sie Ihren Tippschein aus: " << endl;
        for( int i=0; i<max; ++i )
        {
            bool ok;
            int iEingabe;
            do
            {
                cout << "Zahl " << (i+1) << ".: ";
                cin >> iEingabe;
                ok = false;
                if( iEingabe > 21 )
                    cout << "Zahl ueber 21!\n";
                else if( any_of( A, A + i, iEingabe ) )
                    cout << "Zahl bereits vorhanden!\n";
                else
                    ok = true;
                if( !ok )
                    cout << "Eingabe wiederholen!\n";
            }
            while( !ok );
    
            A[i] = iEingabe;
        }         
    };
    

  • Mod

    @Werner: std::find in any_of tuts nicht?
    Etwa

    bool any_of( const int* first, const int* last, int val )
    {
        return std::find(first, last, val) != last;
    }
    


  • es gibt auch std::any_of ; das ist aber ein Template und setzt auf der User-seite Funktoren (z.B. Lambdas) voraus.
    Um depream nicht zu verschrecken, habe ich das so gemacht.



  • Werner_logoff schrieb:

    es gibt auch std::any_of ; das ist aber ein Template und setzt auf der User-seite Funktoren (z.B. Lambdas) voraus.
    Um depream nicht zu verschrecken, habe ich das so gemacht.

    Hättest einen netten Namen erfinden können, vielleicht contains. So belegst Du any_of mit einer Bedeutung, die nichts mit std::any_of zu tun hat, fürchte ich.


  • Mod

    volkard schrieb:

    Hättest einen netten Namen erfinden können, vielleicht contains. So belegst Du any_of mit einer Bedeutung, die nichts mit std::any_of zu tun hat, fürchte ich.

    Das wollte ich schreiben! contains gefiel mir auch viel besser! 👍

    es gibt auch std::any_of; das ist aber ein Template und setzt auf der User-seite Funktoren (z.B. Lambdas) voraus.
    Um depream nicht zu verschrecken, habe ich das so gemacht.

    Das ist überhaupt kein Argument. Meine Variante nutzt einen Funktionsaufruf... und dazu noch find , eine der allgemeinsten STL-Algorithmen überhaupt 😕



  • volkard schrieb:

    vielleicht contains

    Oder gleich knackig kurz "in" 😃

    ps: Ne, das is natürlich doof. Das is nur verständlich wenn man es infix schreibt.



  • Arcoth schrieb:

    find , eine der allgemeinsten STL-Algorithmen überhaupt 😕

    Genau, find ist so allgemein, da gibt es keinen Bedarf für find_if, find_if_not, find_end, find_first_of oder sonst so Spässe.

    hustbaer schrieb:

    Oder gleich knackig kurz "in" 😃

    ps: Ne, das is natürlich doof. Das is nur verständlich wenn man es infix schreibt.

    Wie wärs mit operator>>? ">>" ist dank den IO-Streams ein Synonym für "in".


  • Mod

    hustbaer schrieb:

    volkard schrieb:

    vielleicht contains

    Oder gleich knackig kurz "in" 😃

    Noch viel knackiger: "∈"



  • volkard schrieb:

    Werner_logoff schrieb:

    es gibt auch std::any_of ; das ist aber ein Template und setzt auf der User-seite Funktoren (z.B. Lambdas) voraus.
    Um depream nicht zu verschrecken, habe ich das so gemacht.

    Hättest einen netten Namen erfinden können, vielleicht contains. So belegst Du any_of mit einer Bedeutung, die nichts mit std::any_of zu tun hat, fürchte ich.

    ... interessant. Kannst Du das näher erläutern, warum hat mein any_of oben nichts mit std::any_of zu tun? Mein Sprachverständnis ist irgendwie ein anderes.


  • Mod

    Nun, any_of prüft, ob eines der Elemente in der Range eine Bedingung erfüllt, deines prüft einfach ob ein bestimmtes Element existiert. Ist in der Tat recht nah dran.



  • Arcoth schrieb:

    Nun, any_of prüft, ob eines der Elemente in der Range eine Bedingung erfüllt, deines prüft einfach ob ein bestimmtes Element existiert. Ist in der Tat recht nah dran.

    so dachte ich bisher auch, aber volkard anscheinend nicht.
    Und hustbaer, 'find=das neue for' und Du signalisierten Zustimmung für volkards Bemerkung mit Vorschlägen für alternative Namen - so interpretiere ich das jedenfalls.



  • Arcoth schrieb:

    Nun, any_of prüft, ob eines der Elemente in der Range eine Bedingung erfüllt, deines prüft einfach ob ein bestimmtes Element existiert. Ist in der Tat recht nah dran.

    Da wäre der Name any_of_if passender, wenn man sich an die Namen anderen STL Funktionen anlehnen möchte.



  • Werner_logoff schrieb:

    Und hustbaer, 'find=das neue for' und Du signalisierten Zustimmung für volkards Bemerkung mit Vorschlägen für alternative Namen - so interpretiere ich das jedenfalls.

    Ich verstehe nicht was du mir sagen willst.
    'find=das neue for'?
    WTF?
    Und wo du Zustimmung siehst ist nur ein Scherz.

    Bin verwirrt.


Log in to reply