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 1Wie 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 einerif-else-if
-Kette nimmt man eineswitch
-AnweisungHier 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 erkenntprintf
, 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 schreibenWelche 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 Funktionprintf
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 dannif
An sich habe ich es ja bereits gelöst mittels einer if-else-if-Kette.
Sehr, sehr unelegant.
Wenn sich in derif
-Bedingung etwas nur um 1 ändert und im Anweisungsteil dann um 2, wird man wohl eine Formel dafür finden.
-
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
-
@CPlusPlusWorld sagte in Pascal´sches Dreieck - C-Programmierung - 2D-Array - Symmetrieformatierung:
if it work
Nein. Fail:
@hello443 sagte in Pascal´sches Dreieck - C-Programmierung - 2D-Array - Symmetrieformatierung:
Es geht nur um die Formatierung der Dreieckssymmetrie.
-
oh, that might not be the case, let me get back to you with a new one.