Pascal´sches Dreieck - C-Programmierung - 2D-Array - Symmetrieformatierung



  • Hallo,

    ich habe ein Problem bei der Programmierung der Symmetrieformatierung zur Ausgabe des Pascal´schen Dreiecks in C. Es geht nur um die Formatierung der Dreieckssymmetrie. Das Pascal´sche Dreieck an sich habe ich schon programmiert. Für die Implementierung habe ich ein zweidimensionales Array benutzt.

    Mein Code:

    #include <stdio.h>
    int main() {
    	int zeilen, i, k, pascdre[10][10];
    	printf("\nPascalsches Dreieck\n\n");
    	printf("Geben Sie die Anzahl der Zeilen ein: ");
    	scanf_s("%d", &zeilen);
    	for (k = 0; k < zeilen; k++) {
    		for (i = 0; i <= k; i++) {
    			if (i == 0 || i == k) {
    				pascdre[k][i] = 1;
    			}
    			else
    			{
    				pascdre[k][i] = pascdre[k - 1][i - 1] + pascdre[k - 1][i];
    			}
    		}
    	}
    	for (k = 0; k < zeilen; k++) {
    		for (i = 0; i <= k; i++) {
    			printf("%d ", pascdre[k][i]);
    		}
    		printf("\n");
    	}
    	return 0;
    }
    

    Die Ausgabe sieht folgendermaßen aus bei einer Größe mit sechs Zeilen:

    1
    1 1
    1 2 1
    1 3 3 1
    1 4 6 4 1
    1 5 10 5 1

    Wie kann ich jetzt die Symmetrie des Dreiecks programmieren, damit eine Formatierung, wie in der Mathematik üblich ist mit der ersten Zeile in der Mitte zentriert, entsteht?

    Kann mir jemand weiterhelfen? Ich habe leider überhaupt keine Ahnung, wie ich die Symmetrie programmieren soll.

    Liebe Grüße

    hello443



  • @hello443 du musst vor der ersten Zahl in einer Zeile noch Leerzeichen ausgeben.

    Wieviel, hängt von der aktuellen Zeile und der Zeilenanzahl ab.

    Wenn du eine feste Breite für die Zahlen wählst (z.B. 3: printf("%3d ", pascdre[k][i]);
    kannst du dir ausrechnen, wieviel Leerzeichen das sind.



  • Hallo @DirkB ,

    vielen Dank für die Hilfe. Ich habe es richtig hinbekommen. Nach der ersten Ausgabe-Schleife habe ich eine if-Verzweigungsstruktur in den Code implementiert. Das Ergebnis sieht wunderbar aus.

    Ich zeige hier nochmal den nachgebesserten Code:

    #include <stdio.h>
    int main() {
    	int zeilen, i, k, pascdre[10][10];
    	printf("\nPascalsches Dreieck\n\n");
    	printf("Geben Sie die Anzahl der Zeilen ein: ");
    	scanf_s("%d", &zeilen);
            // Berechnung-Schleife
    	for (k = 0; k < zeilen; k++) {
    		for (i = 0; i <= k; i++) {
    			if (i == 0 || i == k) {
    				pascdre[k][i] = 1;
    			}
    			else
    			{
    				pascdre[k][i] = pascdre[k - 1][i - 1] + pascdre[k - 1][i];
    			}
    		}
    	}
            // Ausgabe-Schleife
    	for (k = 0; k < zeilen; k++) {
    		if (k == 0) {
    			printf("%19c", 0x20);
    		}
    		else if (k == 1) {
    			printf("%17c", 0x20);
    		}
    		else if (k == 2) {
    			printf("%15c", 0x20);
    		}
    		else if (k == 3) {
    			printf("%13c", 0x20);
    		}
    		else if (k == 4) {
    			printf("%11c", 0x20);
    		}
    		else if (k == 5) {
    			printf("%9c", 0x20);
    		}
    		else if (k == 6) {
    			printf("%7c", 0x20);
    		}
    		else if (k == 7) {
    			printf("%5c", 0x20);
    		}
    		else if (k == 8) {
    			printf("%3c", 0x20);
    		}
    		else {
    			printf("%c", 0x20);
    		}
    		for (i = 0; i <= k; i++) {
    			printf("%4d", pascdre[k][i]);
    		}
    		printf("\n");
    	}
    	return 0;
    }
    


  • @hello443
    Bei so einer if-else-if-Kette nimmt man eine switch-Anweisung

    Hier kann man aber die Anzahl der Leerzeichen ausrechnen, dann brauchst du nur eine Zeile dafür.
    Die Leerzeichen kannst du in einer Schleife ausgeben oder aber im Formatstring den * Modifier benutzen. Dann kannst du den Wert für die Feldbreite als extra Parameter mit angeben.

    printf("%*c", (zeilen -1-k)*4 / 2 +1, ' '); //ungetestet



  • @DirkB
    Kannst du mir deine zwei genannten Methoden mal einzeln zeigen. Sowohl mit der Schleife zur Ausgabe der Leerzeichen als auch mit dem Formatstring. Ich verstehe nicht genau was mit dem Modifier gemeint ist. Ist das Sternsymbol im Platzhalter vom Ausgabestring ein Zeigersymbol? Ist der Modifier ein Zeiger? Ich bin in der C-Programmierung noch nicht stark vertieft.
    An sich habe ich es ja bereits gelöst mittels einer if-else-if-Kette. Ich bin jetzt neugierig, wie man die Leerzeichenformatierung in einer Codezeile schreiben kann.

    PS: Wie machst du die Formatierung in einem Thread von diesem Forum hier, wenn du z.B. in deiner Antwort vorhin if-else-if schreibst? Wie kann man diese Formatierung einstellen?



  • @hello443 sagte in Pascal´sches Dreieck - C-Programmierung - 2D-Array - Symmetrieformatierung:

    Sowohl mit der Schleife zur Ausgabe der Leerzeichen

    for (int a=0; a< (zeilen -1-k)*4 / 2 +1;++a)  
       putchar(' ');
    

    als auch mit dem Formatstring.

    printf("%*c", (zeilen -1-k)*4 / 2 +1, ' ');

    Ich verstehe nicht genau was mit dem Modifier gemeint ist.

    printf bekommt als ersten Parameter einen sog. Formatstring übergeben.
    Daraus erkennt printf, wie es die weiteren Parameter behandeln soll.
    Dafür gibt es Formatspecifier. Diese werden mit einem % eingeleitet und enden meist mit einem Buchstaben. Dazwischen kann man noch Modifier schreiben

    Welche Modifier es für welche Formatspecifier gibt, steht in einer Reference zu printf.

    Ist das Sternsymbol im Platzhalter vom Ausgabestring ein Zeigersymbol? Ist der Modifier ein Zeiger?

    Nein, denn es steht in einem Stringliteral (zwischen " "). Da wird nur \ für die Escapesequenzen besonders behandelt.
    Die Bedeutung für dieses * liegt bei der Funktion printf

    PS: Wie machst du die Formatierung in einem Thread von diesem Forum hier, wenn du z.B. in deiner Antwort vorhin if-else-if schreibst? Wie kann man diese Formatierung einstellen?

    Du hast ja schon die Formatierung für mehrere Codezeilen gefunden.
    Da werden drei Backticks ``` vor und nach dem Code eingefügt.
    Wenn du dies mit nur einem Backtick (die Taste rechts neben ß - mit Shift) machst wird der Code ohne Zeilennummern formatiert `if` ergibt dann if

    An sich habe ich es ja bereits gelöst mittels einer if-else-if-Kette.

    Sehr, sehr unelegant.
    Wenn sich in der if-Bedingung etwas nur um 1 ändert und im Anweisungsteil dann um 2, wird man wohl eine Formel dafür finden.


  • Banned

    Try this if it works -

    // method for Pascal's Triangle
    void printPascal(int n)
    {
    // An auxiliary array to store
    // generated pscal triangle values
    int arr[n][n];

    // Iterate through every line and print integer(s) in it
    for (int line = 0; line < n; line++)
    {
    // Every line has number of integers
    // equal to line number
    for (int i = 0; i <= line; i++)
    {
    // First and last values in every row are 1
    if (line == i || i == 0)
    arr[line][i] = 1;
    // Other values are sum of values just
    // above and left of above
    else
    arr[line][i] = arr[line-1][i-1] + arr[line-1][i];
    printf("%d ", arr[line][i]);
    }
    printf("\n");
    }
    }
    // Driver code
    int main()
    {
    int n = 5;
    printPascal(n);
    return 0;
    }

    Thanks




  • Banned

    oh, that might not be the case, let me get back to you with a new one. 🙂


Log in to reply