Code-Verkürzung



  • das mit den Funktionen wussete ich wie das geht. Ich habs auch hinbekommen. War ehrlich gesagt nur zu Faul. Bevor ich mit C++ angefagen hab hatte ich 1,5 Jahre Python. Das ist ne ordentliche Ungewöhnung. Vor allem von der Syntax her.

    habs jetz soweit verkürzt:

    if (DreiInReihe1(a,b,c)==true || DreiInReihe1(d,e,f)==true || DreiInReihe1(g,h,i)==true
        || DreiInReihe1(a,d,g)==true || DreiInReihe1(b,e,h)==true || DreiInReihe1(c,f,i)==true
        || DreiInReihe1(a,e,i)==true || DreiInReihe1(c,e,g)==true){
            return 1;}
        else if (DreiInReihe2(a,b,c)==true || DreiInReihe2(d,e,f)==true || DreiInReihe2(g,h,i)==true
        || DreiInReihe2(a,d,g)==true || DreiInReihe2(b,e,h)==true || DreiInReihe2(c,f,i)==true
        || DreiInReihe2(a,e,i)==true || DreiInReihe2(c,e,g)==true){
    
    bool DreiInReihe1(int a, int b, int c){
        if (a%2==1 && b%2==1 && c%2==1){
            return true;}
        else{
            return false;}}
    
    bool DreiInReihe2(int a, int b, int c){
        if (a!=0 && b!=0 && c!=0 && a%2==0 && b%2==0 && c%2==0){
            return true;}
        else{
            return false;}}
    

    aber bei dem anderen codeabschnitt komm ich nicht drauf



  • Und jetzt packst du das ganze noch irgendwie in eine Schleife und das sind dann noch ein paar Zeilen. a,b,c usw. musst du halt am besten in ein Array oder Container packen, damit der Zugriff in einer Schleife möglich ist.



  • Ok mit array und container kann ich jetz wirklich nichts anfangen. Und was für ne Art von Schleifen?



  • Ein Vorteil hat es ja, dass du von Python kommst: Du rückst wenigstens schön ein. 😃

    Aber wovon ich unbedingt abrate, ist das da:

    if (...){
            return true;}
        else{
            return false;}}
    

    Also erstens ist es sehr wichtig, dass du die Klammern einheitlich setzt. Besonders bei grösseren Blöcken siehst du gleich, wo diese beginnen und enden. Aber einfacher kannst du auch gerade schreiben:

    return a%2==1 && b%2==1 && c%2==1;
    

    Das ==true in deinem oberen Code brauchst du im Übrigen auch nicht, da der Wert automatisch als bool (also true oder false ) interpretiert wird. Schleifen sind hier nicht unbedingt vereinfachend, da du ja kreuz und quer vergleichst. Container sind eher für die Datenspeicherung, nicht die Codeübersicht von Bedeutung.

    Aber dein Code sieht doch schon viel besser aus, wenn du die ==true noch entfernst, oder? 😉



  • stimmt habsch jetz auch.
    Aber wäre es auch noch möglich das irgendwie zu schreiben, dass der vielzählige Aufruf der Funktionen kürzer geschrieben werden kann.

    Und das andere Codesegment krig ich nicht in ne Funktion gepackt.



  • Also ich bin immernoch für ne Schleife. :p

    Vor allem das, wo du a,b,c dann d,e,f und g,h,i verlgleichst geht ganz gut in eine Schleife rein. bei den anderen kommt es drauf an, ob es ein bestimmtes Muster gibt. Das musst du aber selbst wissen. 😉



  • martin.bens schrieb:

    Und das andere Codesegment krig ich nicht in ne Funktion gepackt.

    Welches Codesegment? Und wo liegt das Problem genau?

    drakon schrieb:

    Also ich bin immernoch für ne Schleife. :p

    Ja, kommt halt drauf an. Nur wenn man dann in der Schleife mehr Code hat als wenn man die Funktionen direkt hinschreiben würde, muss man sich fragen, ob sich der Aufwand lohnt. Grundsätzlich ist es aber nie schlecht, Schleifen zu berücksichtigen. 😉



  • if (x==1 && y==1){
            a=feldveraenderung(a, spieler);
            anzahl=anzahlveraenderung(a, anzahl);
            spieler=spielerveraenderung(a, spieler);}
        else if(x==2 && y==1){
            b=feldveraenderung(b, spieler);
            anzahl=anzahlveraenderung(b, anzahl);
            spieler=spielerveraenderung(b, spieler);}
        else if(x==3 && y==1){
            c=feldveraenderung(c, spieler);
            anzahl=anzahlveraenderung(c, anzahl);
            spieler=spielerveraenderung(c, spieler);}
        else if(x==1 && y==2){
            d=feldveraenderung(d, spieler);
            anzahl=anzahlveraenderung(d, anzahl);
            spieler=spielerveraenderung(d, spieler);}
        else if(x==2 && y==2){
            e=feldveraenderung(e, spieler);
            anzahl=anzahlveraenderung(e, anzahl);
            spieler=spielerveraenderung(e, spieler);}
        else if(x==3 && y==2){
            f=feldveraenderung(f, spieler);
            anzahl=anzahlveraenderung(f, anzahl);
            spieler=spielerveraenderung(f, spieler);}
        else if(x==1 && y==3){
            g=feldveraenderung(g, spieler);
            anzahl=anzahlveraenderung(g, anzahl);
            spieler=spielerveraenderung(g, spieler);}
        else if(x==2 && y==3){
            h=feldveraenderung(h, spieler);
            anzahl=anzahlveraenderung(h, anzahl);
            spieler=spielerveraenderung(h, spieler);}
        else if(x==3 && y==3){
            i=feldveraenderung(i, spieler);
            anzahl=anzahlveraenderung(i, anzahl);
            spieler=spielerveraenderung(i, spieler);}
    
    int feldveraenderung(int a, int spieler){
        if (a==0){
                return spieler;}
            else{
                cout<<"Feld bereits besetzt.\n";
                return 0;
            }}
    
    int anzahlveraenderung(int a, int anzahl){
        if (a!=0){
            return anzahl++;}}
    
    int spielerveraenderung(int a, int spieler){
        if (a!=0){
            return spieler--;}}
    

    könnte man das noch kürzen?



  • Klar geht das. Probier einfach das ganze zu abstrahieren, wo du jetzt eine Zahl einsetzt. Gibt es da ein Muster? - Wenn ja dann setz es in Programmcode um und dann kannst du das ganze wieder in eine Schleife packen..



  • Das erste sehr wohl. Du machst zwei verschachtelte Schleifen, eine für das x und eine für das y .

    Beim zweiten könntest du eventuell den ternären operator?: einsetzen, aber wichtiger ist, dass du die Klammern sauber setzt. Glaub mir, du wirst später froh sein, wenn du dir jetzt schon einen guten Stil aneignest.



  • Hier mal der ganze Code. Das sollte für mich zur Übung ein Tic-Tac-ToE Spiel werden:

    # include <iostream>
    using namespace std;
    
    int y_koordinate(){
        int y;
        cout<<"y-Koordinate: ";
        cin>>y;
        cout<<"\n";
        return y;
    }
    
    int x_koordinate(){
        int x;
        cout<<"x-Koordinate: ";
        cin>>x;
        cout<<"\n";
        return x;
    }
    
    bool DreiInReihe1(int a, int b, int c){
        return a%2==1 && b%2==1 && c%2==1;}
    
    bool DreiInReihe2(int a, int b, int c){
        return a!=0 && b!=0 && c!=0 && a%2==0 && b%2==0 && c%2==0;}
    
    int feldveraenderung(int a, int spieler){
        if (a==0){
                return spieler;}
            else{
                cout<<"Feld bereits besetzt.\n";
                return 0;
            }}
    
    int anzahlveraenderung(int a, int anzahl){
        if (a!=0){
            return anzahl++;}}
    
    int spielerveraenderung(int a, int spieler){
        if (a!=0){
            spieler--;
            return spieler;}}
    
    int feld(string spielername1, string spielername2){
        int a=0,b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0, spieler=1, anzahl=8;
        while (anzahl<=8){
        if (spieler%2==1){
            cout<<spielername1<<" : \n";}
        else if (spieler%2==0){
            cout<<spielername2<<" : \n";}
        int x=x_koordinate();
        int y=y_koordinate();
        if (x==1 && y==1){
            a=feldveraenderung(a, spieler);
            anzahl=anzahlveraenderung(a, anzahl);
            spieler=spielerveraenderung(a, spieler);}
        else if(x==2 && y==1){
            b=feldveraenderung(b, spieler);
            anzahl=anzahlveraenderung(b, anzahl);
            spieler=spielerveraenderung(b, spieler);}
        else if(x==3 && y==1){
            c=feldveraenderung(c, spieler);
            anzahl=anzahlveraenderung(c, anzahl);
            spieler=spielerveraenderung(c, spieler);}
        else if(x==1 && y==2){
            d=feldveraenderung(d, spieler);
            anzahl=anzahlveraenderung(d, anzahl);
            spieler=spielerveraenderung(d, spieler);}
        else if(x==2 && y==2){
            e=feldveraenderung(e, spieler);
            anzahl=anzahlveraenderung(e, anzahl);
            spieler=spielerveraenderung(e, spieler);}
        else if(x==3 && y==2){
            f=feldveraenderung(f, spieler);
            anzahl=anzahlveraenderung(f, anzahl);
            spieler=spielerveraenderung(f, spieler);}
        else if(x==1 && y==3){
            g=feldveraenderung(g, spieler);
            anzahl=anzahlveraenderung(g, anzahl);
            spieler=spielerveraenderung(g, spieler);}
        else if(x==2 && y==3){
            h=feldveraenderung(h, spieler);
            anzahl=anzahlveraenderung(h, anzahl);
            spieler=spielerveraenderung(h, spieler);}
        else if(x==3 && y==3){
            i=feldveraenderung(i, spieler);
            anzahl=anzahlveraenderung(i, anzahl);
            spieler=spielerveraenderung(i, spieler);}
        else{
            cout<<"Falsche Eingabe\n";
            anzahl++;
            spieler--;}
    
        if (DreiInReihe1(a,b,c) || DreiInReihe1(d,e,f) || DreiInReihe1(g,h,i)
        || DreiInReihe1(a,d,g) || DreiInReihe1(b,e,h) || DreiInReihe1(c,f,i)
        || DreiInReihe1(a,e,i) || DreiInReihe1(c,e,g)){
            return 1;}
        else if (DreiInReihe2(a,b,c) || DreiInReihe2(d,e,f) || DreiInReihe2(g,h,i)
        || DreiInReihe2(a,d,g) || DreiInReihe2(b,e,h) || DreiInReihe2(c,f,i)
        || DreiInReihe2(a,e,i) || DreiInReihe2(c,e,g)){
            return 2;}
            anzahl--;
            spieler++;
            }
    }
    
    int main(){
        cout<<"Tic - Tac - To\n";
        cout<<"Welches Zeichen moechten sie?\n";
        cout<<"Kreuz --> 1 und Kreis -->2  ";
        int spieler1=0, spieler2=0;
        cin>>spieler1;
        cout<<"\n";
        cout<<"Spieler 1 geben sie ihren Namen ein! ";
        string spielername1;
        cin>>spielername1;
        cout<<"Spieler 2 geben sie ihren Namen ein! ";
        string spielername2;
        cin>>spielername2;
        if (spieler1==1){
            cout<<spielername1<<" hat Kreuz und "<<spielername2<<" hat Kreis\n";}
        else if (spieler1==2){
            cout<<spielername2<<" hat Kreuz und "<<spielername1<<" hat Kreis\n";}
        if (spieler1==1){
            spieler2=2;}
        else if(spieler1==2){
            spieler2=1;}
        int gewonnen;
        gewonnen=feld(spielername1, spielername2);
        if (gewonnen==spieler1){
            cout<<spielername1<<" hat gewonnen\n";}
        else if(gewonnen==spieler2){
            cout<<spielername2<<" hat gewonnen\n";}
        system("Pause");
        return 0;
    }
    

    könntet ihr mir noch mögliche Verkürzungen sagen. Das war eben so einfache programmierung und dann wollt ich mir Rat einholen wie ichs besser machen kann.



  • Wir haben dir ja bereits Ratschläge gebracht...?



  • die meisten versteh ich leider nicht.
    einmal das mit den Schleifen und das mit dem ternären operator?



  • Wie wärs, wenn du dich zusätzlich zu unseren Vorschlägen noch ein wenig selbst erkunden würdest?

    Zu den Schleifen haben wir glaube ich genügend Hinweise gegeben. Schau doch, wo du wiederkommende Strukturen erkennst, und versuche, eine Regelmässigkeit darin zu finden.



  • Kleine Merkregel, wenn du weisst, was du noch verkürzen kannst:

    Sobald du Code per Copy/Paste kopierst und einfügst, dann ist das ein Fall von unnötiger Redundanz. (Klar gibt es Ausnahmen, aber bei einem Anfänger greift die Regel sicher recht gut.)

    Ich sehe bei dir so ein Schema:

    for (int y = 0; y < 3; y++)
       for (int x = 0; x < 3; x++)
       {
           bar (array[y*3 + x]);
           foobar (array[y*3 + x]);
           foo (x,y);
       }
    

    Wo das ist und wie du das bei dir umsetzen kannst solltest du selbst hinkriegen..


Anmelden zum Antworten