[Novize] Bewertung der Problemlösung



  • Hallo Leute,

    Meine Aufgabe laut Lehrbuch war es eine Tabelle ausgeben zu lassen welche sich durch die Eingabe in der Größe festlegen lässt. So würde die Zahl "5" eine Tabelle ausgeben welche 5 Reihen und 5 Zeilen besitzt. Jede Zelle dieser Tabelle wäre das Produkt der Multiplikation dieser Reihen/Zeilen Nummern.

    #include <stdio.h>
    
    int main(void)
    {
    
    	unsigned long size = 5;
    	int zeile;
    	int reihe;
    
    	for(zeile = 0; zeile <= size; zeile++)
    		{	
    			printf("%d\t",zeile == 0 ? 0 : zeile%(size+1));
    
    			for(reihe = 1; reihe <= size; reihe++)
    			{
    				printf("%d\t",(reihe%(size+1))*(zeile == 0 ? zeile+1 : zeile));
    			}
    
    			printf("\n");
    		}
    
    	return 0;
    }
    

    Geschrieben habe ich das so. Ich würde gerne paar Vorschläge von anderen Lösungen sehen. Da ich finde meine ziemlich verwirrend wirkt auf dem ersten Blick. Bitte beachtet das ich bisher keine Ahnung von Arrays etc. habe. Mein Stand beinhaltet. Loops und if statements. Und Schreibsparende wie Conditional Statement und prefix postfix ++.



  • Schau dir noch mal genau deine Schleifenköpfe an (bzgl. der Indizes ;-).
    Und anstatt der Modulo-Operation reicht auch einfach ein +1 bzw. -1.

    Hast du den Code denn überhaupt mal ausführen lassen? Dann würden dir die Indizes doch sofort auffallen - oder ist das Absicht mit der zusätzlichen 0-Zeile?

    P.S. Die Begriffe Zeile und Reihe sind m.E. gleichwertig - du meinst wohl eher Zeile und Spalte.



  • ...



  • Swordfish schrieb:

    Deutsch und Englisch für Bezeichner zu mischen ist nicht die feine englische 😉

    Ist unsinnig oder gehört plausibel erklärt, warum das nicht gut sein soll!



  • ...



  • Falke88 schrieb:

    So würde die Zahl "5" eine Tabelle ausgeben welche 5 Reihen und 5 Zeilen besitzt. Jede Zelle dieser Tabelle wäre das Produkt der Multiplikation dieser Reihen/Zeilen Nummern.

    Bei euch beiden sehe ich aber anhand der Startwerte und der Schleifenbedingung eine extra Zeile/Spalte.
    Hier wären aber nur 5 Zeilen/Spalten gefragt und ihr bräuchtet keine if/elsen. :p
    Kompakt, weniger gut lesbar/verständlich:

    int main(void)
    {
    	int size = 5;
    	int i = 1, j = i, n = 1;
    	while ( n <= size*size )
    		n % size ? ( printf ("%3d", j), j += i, n++ ) : ( printf ("%3d", j), putchar('\n'), i++, j = i, n++ );
    	return 0;
    }
    


  • ...



  • Noch schwerer lesbar, noch unverständlicher. 😃
    Und zwei Variable weniger 👍



  • i % size ? "" : "\n"
    

    den Part finde ich gut - demnach wenn nonzero dann passiert nichts und bei zero i=5 % size=5 = 0 - dann false und "\n" als Zeilensprung.

    Hier verstehe ich das %5d aber nicht

    printf( "%5d%s", ( ( i - 1 ) / size + 1 ) * ( ( ( i - 1 ) % size ) + 1 )
    

    bzw. ich weiss nicht genau was der format specifier %5d bedeutet... bringt der sowas wien tab in 5 sprüngen oder begrenzt er wie %.2f die höhe der ganzzahl...was eigentlich sinnfrei wäre oder...

    Brauche nur dort Aufklärung 😉



  • Das gibt eine Dezimalzahl rechtsbündig mit minimal 5 Stellen aus.
    Ist die Zahl kleiner wird mit Leerzeichen aufgefüllt.
    -> http://www.cplusplus.com/reference/cstdio/printf/



  • Swordfish schrieb:

    berniebutt schrieb:

    Swordfish schrieb:

    Deutsch und Englisch für Bezeichner zu mischen ist nicht die feine englische 😉

    Ist unsinnig oder gehört plausibel erklärt, warum das nicht gut sein soll!

    Ich habe nicht gesagt es sei gut oder schlecht. Ich habe gesagt es sei kein toller Stil (... und Geschmack ist streitbar). Bist Du anderer Meinung?

    Ja, ich bin anderer Meinung! Als Bezeichner für englischsprachige Sachen - wie size, row, column, count - nimmt man diese. Für alle anderen Bezeichner
    wählt man besser die eigene Sprache. Es macht wenig Sinn, z.B. in einem deutschsprachigen Buchhaltungsprogramm für die Mehrwertsteuer (Mwst)
    Value Additional Tax (VAT) zu verwenden.

    Dieses Nebenthema kann abgehakt werden! 🕶



  • Grüß Gott,

    ich traue mich wieder einmal hervor und bewundere die Diskussion über diese Aufgabe. Viele der Vorschläge würden vordere Plätze im Obfucated C Context für Einzeilenprogramme belegen, oder doch in der Kategorie "minimale Anzahl von Variablen". Aber sind sie auch laufzeitoptimal?

    Hier mein Vorschlag, der 90% der Multiplikationen einspart. Die Addition nSpalte+=nZeile entspricht nSpalte++ , kostet also (fast) nichts. In Zeile 13 entällt dagegen die Multiplikation.

    Sicher ist das Programm wie immer nicht normgerecht (im Sinne der Normen aus dem letzten Jahrtausend). Auch habe ich mir das Einlesen gespart und erst einmal durch eine Präprozessorkonstante ersetzt.

    /*U038_EinmalEins1.c : Einstiegspunkt der Konsolenanwendung*/
    /*Programm optimieren: Optimierte Version*/
    
    #include <stdio.h>
    
    #define NMAX 10
    
    int main() {
      int nZeile,nSpalte;
      for (nZeile=1;nZeile<=NMAX;nZeile++) {
        for (nSpalte=nZeile;nSpalte<=NMAX*nZeile;nSpalte+=nZeile) { /*optimiert der Kompiler nicht, dann Zwischenvariable anlegen*/
          fprintf_s(stdout,"%3d ",nSpalte);
        } /*nSpalte*/
        fprintf_s(stdout,"\n"); /*Zeile abschliessen*/
      } /*for*/
      return 0;
    } /*main*/
    

    Normalerweise optimiert ein guter Kompiler die Zeile 12, indem er erkennt, dass das Abbruchkriterium konstant bleibt und legt versteckt eine Variable an. Ganz vorsichtige Programmierer fügen vor die Zeile 12 eine weitere Variable ein, um diese dann für NMAX*nZeile zu verwenden.


Anmelden zum Antworten