Mein erstes C Programm - Und schon wieder ein Taschenrechner ...



  • CStoll schrieb:

    Nulltens: Was ist so interessant an Taschenrechner-Programmen? 😃

    Du meinst weil die so voellig nutzlos sind ...

    Ja, das habe ich inzwischen auch begriffen und suche derzeit nach einer besseren Idee fuer meine naechste Uebung ...

    CStoll schrieb:

    ... mykeypad() besteht aus einer Folge von Blöcken, die sich nur in den verwendeten Parametern unterscheiden (das schreit nach einer Hilfsfunktion).

    Habe ich sofort umgesetzt und sieht jetzt so aus:

    tastatur (int row, int col)
    {
        curs_set(0);
    
        int taste[4][4] = { {'1','2','3','/'}, {'4','5','6','*'}, {'7','8','9','-'}, {'0','.','?','+'} };
        int r[4] = {4,7,10,13};
        int c[4] = {2,7,12,17};
    
        int i=0, n=0, p=0, q=0;
    
        for (i = 0; i < 16; i++)
        {
            if (i > 11)
            {
                n = 3;
                p = i-12;
            }
            else if (i > 7 & i <=11)
            {
                n = 2;
                p = i-8;
            }
            else if (i > 3 & i <= 7)
            {
                n = 1;
                p = i-4;
            }
            else if (i <= 3)
            {
                n = 0;
                p = i;
            }
    
            key = newwin( 3, 5, row+r[n], col+c[p] );
            box(key,0,0);
            refresh();
            wrefresh(key);
    
            mvprintw( row+1+r[n], col+2+c[p], "%c", taste[n][p] );
        }
    
        return;
    }
    

    Sicherlich auch so noch nicht perfekt, so sollte ich wohl in Zukunft zumindest aussagefaehigere Namen fuer meine Variablen verwenden, aber sicherlich schon besser als 16 x den nahezu gleichen Code zu schreiben.

    drüber schrieb:

    bei den ganzen case für die tastaturabfrage wären konstanten mit sprechenden namen besser als nur zahlen.

    Stimmt, habe ich auch gleich umgesetzt.

    Danke fuer die Anregungen ....



  • Die if-else-Kaskade sieht immer noch grauenhaft aus - das geht noch kürzer:

    for(i=0;i<16;++i)//ich bevorzuge Präfix-Inkrement - ist potentiell schneller
    {
      n = i%4;
      p = i/4;
      ...
    }
    


  • CStoll schrieb:

    ...Präfix-Inkrement - ist potentiell schneller

    gibt es dafür eine erklärung??



  • CStoll schrieb:

    {
      n = i%4;
      p = i/4;
      ...
    }
    

    Nun ja, ich sitze hier mit grossen Augen und kann nur noch staunen ...

    Ich habe den Code entsprechend umgebaut und es laeuft natuerlich, nur ueber das "warum" muss ich mir noch ein paar mehr Gedanken machen.

    Ganz zu schweigen davon, wie Du das mal so eben auf einen Blick erkannt hast ... 😕

    Carsten, Du bist ein Genie!!!!



  • Apeman schrieb:

    CStoll schrieb:

    ...Präfix-Inkrement - ist potentiell schneller

    gibt es dafür eine erklärung??

    für int nicht

    Apeman schrieb:

    Sagt der eine Löwe zum Anderen, als sie den Zirkusclown fressen: "Na, der schmeckt aber komisch!"

    der ist so schlecht, dass er schon wieder lustig ist.



  • Apeman schrieb:

    CStoll schrieb:

    ...Präfix-Inkrement - ist potentiell schneller

    gibt es dafür eine erklärung??

    für int nicht

    und für was sonst?

    Apeman schrieb:

    Sagt der eine Löwe zum Anderen, als sie den Zirkusclown fressen: "Na, der schmeckt aber komisch!"

    der ist so schlecht, dass er schon wieder lustig ist.

    deswegen ja 😉



  • Apeman schrieb:

    für int nicht

    und für was sonst?

    Für so 'ne andere Sprache, die mal von C abgeleitet wurde. Da trifft das häufiger zu. Aber das dürfte für Dich nicht so furchtbar interessant sein 😃

    Aber wenn man sich das Präfix-Inkrement einmal als gängige Praxis angewöhnt hat, spricht ja nichts dagegen das in anderen Sprachen auch zu verfolgen.



  • Apeman schrieb:

    CStoll schrieb:

    ...Präfix-Inkrement - ist potentiell schneller

    gibt es dafür eine erklärung??

    Für int vielleicht nicht - aber als C++ Programmer ist man es gewohnt, daß Postfix-Operatoren langsamer sein könnten (temporäre Variablen, zusätzlich nötige Kopier-Aktionen etc). Und die Präfix-Variante ist auf jeden Fall nicht langsamer.

    gboelter schrieb:

    Ich habe den Code entsprechend umgebaut und es laeuft natuerlich, nur ueber das "warum" muss ich mir noch ein paar mehr Gedanken machen.

    Du weißt, was die Operatoren % und / machen? Dann ist der Rest eigentlich recht übersichtlich.

    Ganz zu schweigen davon, wie Du das mal so eben auf einen Blick erkannt hast ... 😕

    Das macht die Erfahrung 😃



  • CStoll schrieb:

    aber als C++ Programmer ist man es gewohnt, daß Postfix-Operatoren langsamer sein könnten (temporäre Variablen, zusätzlich nötige Kopier-Aktionen etc).

    naja, C++ steckt ja bekannterweise voller merkwürdigkeiten (mal nett ausgedrückt) 😉
    aber in C sollte es doch egal sein, ob man das ++ dahinter oder davor schreibt, wenn die variable an der stelle nicht ausgewertet wird. oder gibt es da auch fälle, wobei das pre- einem post-increment vorzuziehen ist?



  • Ja, wenn man den Wert des Ausdrucks irgendwo verwenden will, macht es einen Unterschied. Aber in Fällen wie hier ist es prinzipiell egal - die Macht der Gewohnheit 😉

    (btw, ich habe nicht "ist schneller" geschrieben, sondern "ist potentiell schneller" ;))


Anmelden zum Antworten