Autor |
Zahlenmuster in C |
|
Inf0rmatiker
Aktiv  Dabei seit: 14.11.2018 Mitteilungen: 30
 |     Themenstart: 2019-11-13 18:07
|
Hallo,
bin dabei ein Programm zu schreiben, was folgendes Zahlenmuster ausgeben soll:
1
1 2
1 2 3 usw.
Hab bis jetzt diese Ausgabe hinbekommen:
1
1 2
1 2 3 usw.
Aber mit den richtigen Leerzeichen funktioniert es noch nicht ganz.
Mein Code:
C #include <stdio.h>
#include <stdlib.h>
int main() {
for (int i = 1; i <= 5; i++) {
for(int leerzeichen = 5; leerzeichen >= i; leerzeichen--) {
printf(" ");
}
for(int j = 1; j <= i; j++) {
printf("%d ", j);
}
printf("\n");
}
return EXIT_SUCCESS;
}
|
|
Profil
Quote
Link |
StrgAltEntf
Senior  Dabei seit: 19.01.2013 Mitteilungen: 5337
Aus: Milchstraße
 |     Beitrag No.1, eingetragen 2019-11-13 18:38
|
2019-11-13 18:07 - Inf0rmatiker im Themenstart schreibt: 1
1 2
1 2 3 usw.
Hab bis jetzt diese Ausgabe hinbekommen:
1
1 2
1 2 3 usw. |
Hallo Inf0rmatiker,
habe deine gewünschte Ausgabe mal in einen Quelltext-Bereich gepackt, damit man besser sehen kann, was du wünschst. Vor der i-ten Zeile sollen also 2r-1, 2r-3, ... 5, 3, 1 Leerzeilen stehen, wobei r die Anzahl der Zeilen ist.
Hilft dir das schon?
|
Profil
Quote
Link |
Inf0rmatiker
Aktiv  Dabei seit: 14.11.2018 Mitteilungen: 30
 |     Beitrag No.2, vom Themenstarter, eingetragen 2019-11-13 18:47
|
noch nicht wirklich...muss ich nur noch die Bedingung für die For-Schleife der Leerzeichen umschreiben oder fehlt sonst noch irgendwas?
|
Profil
Quote
Link |
StrgAltEntf
Senior  Dabei seit: 19.01.2013 Mitteilungen: 5337
Aus: Milchstraße
 |     Beitrag No.3, eingetragen 2019-11-13 19:21
|
Folgendes sollte funktionieren.C #include <stdio.h>
#include <stdlib.h>
int main() {
int r = 7; // Anzahl der Zeilen
for(int i = 1; i <= r; i++) {
for(int leerzeichen = 2*(r-i)+1; leerzeichen > 0; leerzeichen--)
printf(" ");
for(int j = 1; j <= i; j++)
printf("%d ", j);
printf("\n");
}
return EXIT_SUCCESS;
} |
|
Profil
Quote
Link |
Inf0rmatiker
Aktiv  Dabei seit: 14.11.2018 Mitteilungen: 30
 |     Beitrag No.4, vom Themenstarter, eingetragen 2019-11-13 19:46
|
Nein, so wird lediglich der ganze Zahlenblock nach rechts verschoben.
|
Profil
Quote
Link |
StrgAltEntf
Senior  Dabei seit: 19.01.2013 Mitteilungen: 5337
Aus: Milchstraße
 |     Beitrag No.5, eingetragen 2019-11-13 19:52
|
Dann verstehe ich dein "usw" nicht.
|
Profil
Quote
Link |
Inf0rmatiker
Aktiv  Dabei seit: 14.11.2018 Mitteilungen: 30
 |     Beitrag No.6, vom Themenstarter, eingetragen 2019-11-13 20:05
|
Wenn r jetzt 7 ist, dann sollte es so aussehen:
1
1 2
1 2 3
1 2 3 4
1 2 3 4 5
1 2 3 4 5 6
1 2 3 4 5 6 7
|
|
Profil
Quote
Link |
StrgAltEntf
Senior  Dabei seit: 19.01.2013 Mitteilungen: 5337
Aus: Milchstraße
 |     Beitrag No.7, eingetragen 2019-11-13 20:10
|
Ja, das kommt davon, wenn man "blind" programmiert 
Habe den Code ausgebessert. Probier es jetzt mal.
|
Profil
Quote
Link |
Inf0rmatiker
Aktiv  Dabei seit: 14.11.2018 Mitteilungen: 30
 |     Beitrag No.8, vom Themenstarter, eingetragen 2019-11-13 20:59
|
So funktioniert es, danke :)
Wenn ich jetzt das Programm erweitern möchte, dass die Zahlenreihe wieder runterzählt, reicht dann eine weitere For-Schleife?
Sollte dann so aussehen:
C
|
Profil
Quote
Link |
StrgAltEntf
Senior  Dabei seit: 19.01.2013 Mitteilungen: 5337
Aus: Milchstraße
 |     Beitrag No.9, eingetragen 2019-11-13 21:26
|
Profil
Quote
Link |
Inf0rmatiker
Aktiv  Dabei seit: 14.11.2018 Mitteilungen: 30
 |     Beitrag No.10, vom Themenstarter, eingetragen 2019-11-13 21:38
|
Ja, genau, hab mich verschrieben.
|
Profil
Quote
Link |
StrgAltEntf
Senior  Dabei seit: 19.01.2013 Mitteilungen: 5337
Aus: Milchstraße
 |     Beitrag No.11, eingetragen 2019-11-13 21:53
|
Lass die i-Schleife einfach noch einmal rückwärts laufen. Versuch es mal!
|
Profil
Quote
Link |
Inf0rmatiker
Aktiv  Dabei seit: 14.11.2018 Mitteilungen: 30
 |     Beitrag No.12, vom Themenstarter, eingetragen 2019-11-13 22:18
|
Jo, bin grad am probiern.
Aber noch ne Frage zum Code vorhin: Wieso funktioniert der Code nicht mehr richtig, sobald ich Klammern bei der 2. und 3. For-Schleife setze?
Also, so wie du ihn gepostet hast, funktioniert alles, aber wenn ich dann diese Klammern hinzufüge: Hab neben Klammern ein "K" kommentiert.
Mit diesen Klammern wird das ausgegeben:
C C #include <stdio.h>
#include <stdlib.h>
int main() {
int r = 3;
for(int i = 1; i <= r; i++) {
for(int leerzeichen = 2*(r-i)+1; leerzeichen > 0; leerzeichen--) { // K
printf(" ");
} // K
for(int j = i; j <= i; j++) { // K
printf("%d ", j);
} // K
printf("\n");
}
return EXIT_SUCCESS;
}
|
|
Profil
Quote
Link |
StrgAltEntf
Senior  Dabei seit: 19.01.2013 Mitteilungen: 5337
Aus: Milchstraße
 |     Beitrag No.13, eingetragen 2019-11-13 22:38
|
Das ist natürlich nicht richtig:
for(int j = i; j <= i; j++)
|
Profil
Quote
Link |
Inf0rmatiker
Aktiv  Dabei seit: 14.11.2018 Mitteilungen: 30
 |     Beitrag No.14, vom Themenstarter, eingetragen 2019-11-13 22:42
|
Profil
Quote
Link |
Inf0rmatiker
Aktiv  Dabei seit: 14.11.2018 Mitteilungen: 30
 |     Beitrag No.15, vom Themenstarter, eingetragen 2019-11-14 10:09
|
Hab versucht die i-Schleife noch einmal rückwärts laufen zu lassen, aber bekomm da entweder immer eine Endlosschleife oder das Muster:
C 5 1 2 3 4 5
4 1 2 3 4
3 1 2 3
2 1 2
1 1
Das Muster wiederholt sich 5 Mal.
|
Mein Code:
C #include <stdio.h>
#include <stdlib.h>
int main() {
int n = 5;
for(int i = 1; i <= n; i++) {
for(int i = n; i > 0; i--) {
printf("%d ", i);
for(int leerzeichen = 2*(n-i)+1; leerzeichen > 0; leerzeichen--) {
printf(" ");
}
for(int j = 1; j <= i; j++) {
printf("%d ", j);
}
printf("\n");
}
}
return EXIT_SUCCESS;
} |
|
Profil
Quote
Link |
StrgAltEntf
Senior  Dabei seit: 19.01.2013 Mitteilungen: 5337
Aus: Milchstraße
 |     Beitrag No.16, eingetragen 2019-11-14 20:00
|
Eine i-Schleife innerhalb einer i-Schleife. Das ist aber sehr riskant, und man sollte solche Konstrukte nur dann machen, wenn man wirklich versteht, was man da tut. Also besser: Finger weg davon!
Was diese zusätzliche Schleife bewirken soll, habe ich auch nicht verstanden.
Mit "Schleife rückwärts laufen lassen" meinte ich übrigens, dass man i von groß nach klein statt von klein nach groß laufen lässt.
|
Profil
Quote
Link |
Inf0rmatiker
Aktiv  Dabei seit: 14.11.2018 Mitteilungen: 30
 |     Beitrag No.17, vom Themenstarter, eingetragen 2019-11-14 23:40
|
Ja, aber wenn ich das mache, überschreibt sich die 2. i-Schleife ja mit der 1.
Bsp.:
C for(int i = 1; i <= 5; i++) {
for(int i = 5; i >= 1; i--) {
...restlicher Code
}
}
|
So komm ich ja auch immer in eine Endlosschleife.
|
Profil
Quote
Link |
viertel
Senior  Dabei seit: 04.03.2003 Mitteilungen: 26871
Aus: Hessen
 |     Beitrag No.18, eingetragen 2019-11-15 00:37
|
Wenn man 2 Schleifen ineinander schachtelt, dann macht es in der Regel Sinn, unterschiedliche Variablennamen zu wählen. Eben aus dem Grund, den du beschrieben hast: die innere Schleife vermurkst den Wert der äußeren Schleifenvariablen 
Ansonsten macht es Sinn, sich etwas näher mit den möglichen Formaten von printf zu beschäftigen.
Was gibt z.B. dieser Code aus?C for (int i=1; i<=9; i++)
{
printf("%*d%*d\n", i,i,2*(9-i)+1,i);
} | Versuche erst mal, die Ausgabe zu ermitteln, ohne den Code auszuführen!
Die Schleife sieht harmlos aus, aber das Ergebnis dürfte für einen Neuling überraschend sein 
Mit dieser Technik könnte dein Programm deutlich vereinfacht werden 
-----------------

|
Profil
Quote
Link |
zippy
Senior  Dabei seit: 24.10.2018 Mitteilungen: 794
 |     Beitrag No.19, eingetragen 2019-11-15 01:47
|
2019-11-15 00:37 - viertel in Beitrag No. 18 schreibt:
Eben aus dem Grund, den du beschrieben hast: die innere Schleife vermurkst den Wert der äußeren Schleifenvariablen 
Das ist Unsinn: Das "int i " im inneren "for " definiert eine neue Variable i , so dass die gleichnamige Variable in der äußere Schleife nicht verändert wird.
Trotzdem ist es natürlich keine gute Idee, innere und äußere Schleifenvariable gleich zu nennen, weil die innere dann die äußere verdeckt (d.h. man kann in der inneren Schleife nicht auf die äußere Variable zugreifen).
--zippy
|
Profil
Quote
Link |
Inf0rmatiker
Aktiv  Dabei seit: 14.11.2018 Mitteilungen: 30
 |     Beitrag No.20, vom Themenstarter, eingetragen 2019-11-15 16:18
|
Hab das Runterzählen jetzt sogar hinbekommen, aber ich glaube man könnte es sehr viel eleganter lösen^
Mein Code:
C #include <stdio.h>
#include <stdlib.h>
int main() {
int n = 7;
int m = 7;
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= i; j++) {
printf("%d ", j);
}
printf("\n");
}
for(int i = 1; i <= n; i++) {
for(int j = 1; j < m; j++) {
printf("%d ", j);
}
m--;
printf("\n");
}
return EXIT_SUCCESS;
} |
@Viertel: Ohne den Code auszuführen, wär ich da nie draufgekommen. Mir ist, selbst nachdem ich den Code ausgeführt habe, unklar, wie diese Ausgabe zustande kommt^
|
Profil
Quote
Link |
StrgAltEntf
Senior  Dabei seit: 19.01.2013 Mitteilungen: 5337
Aus: Milchstraße
 |     Beitrag No.21, eingetragen 2019-11-15 18:31
|
Ja, natürlich, so geht es. Die Hoch- und die Runterzählschleife dürfen nicht ineinander sondern müssen nacheinander stehen.
Das mit dem m finde ich noch en wenig unschön. Ich hätte es so gemacht:
C #include <stdio.h>
#include <stdlib.h>
int main() {
int n = 7;
for(int i = 1; i <= n; i++) { // hochzählen
for(int j = 1; j <= i; j++) {
printf("%d ", j);
}
printf("\n");
}
for(int i = n-1; i >= 1; i--) { // runterzählen
for(int j = 1; j <= i; j++) {
printf("%d ", j);
}
printf("\n");
}
return EXIT_SUCCESS;
} |
|
Profil
Quote
Link |
Inf0rmatiker
Aktiv  Dabei seit: 14.11.2018 Mitteilungen: 30
 |     Beitrag No.22, vom Themenstarter, eingetragen 2019-11-15 19:27
|
Ja, da ist dein Code ein wenig eleganter :D
|
Profil
Quote
Link |
Inf0rmatiker
Aktiv  Dabei seit: 14.11.2018 Mitteilungen: 30
 |     Beitrag No.23, vom Themenstarter, eingetragen 2019-11-15 22:34
|
Bin gerade da einen Code zu schreiben, welcher dieses Muster ausgeben soll:
C
Bekomme aber nur:
C 3 3 3
2 2
1
oder
1
2 2
3 3 3
hin.
|
Code für das 1. Muster sieht so aus:
C #include <stdio.h>
#include <stdlib.h>
int main() {
int n = 3;
for(int i = n; i > 0; i--) {
for(int leerzeichen = 2*(n-i)+1; leerzeichen > 0; leerzeichen--) {
printf(" ");
}
for(int j = 1; j <= i; j++) {
printf("%d ", i);
}
printf("\n");
}
return EXIT_SUCCESS;
} |
Kann ich durch Ändern des printf auf mein Zielmuster kommen oder muss da generell was an den Schleifen ändern?
|
Profil
Quote
Link |
StrgAltEntf
Senior  Dabei seit: 19.01.2013 Mitteilungen: 5337
Aus: Milchstraße
 |     Beitrag No.24, eingetragen 2019-11-15 23:18
|
2019-11-15 22:34 - Inf0rmatiker in Beitrag No. 23 schreibt:
Kann ich durch Ändern des printf auf mein Zielmuster kommen oder muss da generell was an den Schleifen ändern?
Beides geht. Du kannst etwa den Befehl printf("%d ", i) durch printf("%d ", 4-i) ersetzen. Ich empfehle aber, die Schleifen zu ändern.
|
Profil
Quote
Link |
Inf0rmatiker
Aktiv  Dabei seit: 14.11.2018 Mitteilungen: 30
 |     Beitrag No.25, vom Themenstarter, eingetragen 2019-11-16 15:42
|
So, habs gelöst :D
C #include <stdio.h>
#include <stdlib.h>
int main() {
int n = 7;
for(int i = 1; i <= n; i++) {
for(int leerzeichen = (n-i)+1; leerzeichen < n; leerzeichen++) {
printf(" ");
}
for(int j = i; j <= n; j++) {
printf("%d ", i);
}
printf("\n");
}
return EXIT_SUCCESS;
} |
Könnte man die Schleife für die Leerzeichen noch anders lösen, denn so funktioniert es nur, weil ich beim printf den Abstand von " " um 1 erhöht habe.
|
Profil
Quote
Link |
StrgAltEntf
Senior  Dabei seit: 19.01.2013 Mitteilungen: 5337
Aus: Milchstraße
 |     Beitrag No.26, eingetragen 2019-11-16 17:51
|
Du möchtest ja am Anfang der i-ten Zeile 2(i-1) Leerzeichen haben. Also würde ich einfach schreibenC for(int leerzeichen = 1; leerzeichen <= 2*(i-1); leerzeichen++)
printf(" "); | Genauso gut ist aberC for(int leerzeichen = 1; leerzeichen <= i-1; leerzeichen++)
printf(" "); |
|
Profil
Quote
Link |
Inf0rmatiker
Aktiv  Dabei seit: 14.11.2018 Mitteilungen: 30
 |     Beitrag No.27, vom Themenstarter, eingetragen 2019-11-16 19:15
|
Alles klar, danke :)
Wenn ich jetzt ein Muster ausgeben möchte, das so aussieht:
C 1 1 1 1 1 1
2 2 2 2
3 3
2 2 2 2
1 1 1 1 1 1
oder
1 1
2 2 2 2
3 3 3 3 3 3
2 2 2 2
1 1
|
Bekomme eine Seite des Musters so hin:
C Muster 2
#include <stdio.h>
#include <stdlib.h>
int main() {
int n = 3;
for(int i = 1; i <= n; i++) {
for(int j = i; j > 0; j--) {
printf("%d ", i);
}
printf("\n");
}
for(int i = n-1; i > 0; i--) {
for(int j = i; j > 0; j--) {
printf("%d ", i);
}
printf("\n");
}
return EXIT_SUCCESS;
} |
Ist es möglich, mit 4 Schleifen, die andere Seite auch noch auszugeben oder benötigt es hierfür noch extra Schleifen?
|
Profil
Quote
Link |
viertel
Senior  Dabei seit: 04.03.2003 Mitteilungen: 26871
Aus: Hessen
 |     Beitrag No.28, eingetragen 2019-11-16 20:04
|
2019-11-15 16:18 - Inf0rmatiker in Beitrag No. 20 schreibt:
@Viertel: Ohne den Code auszuführen, wär ich da nie draufgekommen. Mir ist, selbst nachdem ich den Code ausgeführt habe, unklar, wie diese Ausgabe zustande kommt^ Der „Trick“ liegt in dem * in der Formatangabe (variable Ausgabebreite für eine Zahl). Und die solltest du dir beim printf halt mal genauer ansehen. Klick auf printf im Code (durch Unterstreichung hervorgehoben).
Deine Aufgabe,Ausgabe zu erzeugen geht damit elegant:C const int n = 5;
for (int zeile=1; zeile <= n; zeile++)
{
for (int i=n+1-zeile; i > 0; i--)
{
printf("%*d", (i==n+1-zeile) ? (n-i)*2+1 : 2, zeile);
}
printf("\n");
} |
Und noch der Code für das „Fenster“ (ein wenig mathematische Trickserei sei erlaubt mit abs ):C for (int zeile=1; zeile <= 2*n-1; zeile++)
{
// zeile 1,..,5 umrechnen in 1,2,3,2,1
int k = n - abs(n - zeile);
// linker Ziffernblock
for (int i=n+1-k; i>0; i--)
{
printf("%2d", k);
}
// Leerzeichen in der Mitte
printf("%*s", 4*(k-1), "");
// rechter Ziffernblock
for (int i=n+1-k; i>0; i--)
{
printf("%2d", k);
}
printf("\n");
} |
n=5 1 1 1 1 1 1 1 1 1 1
2 2 2 2 2 2 2 2
3 3 3 3 3 3
4 4 4 4
5 5
4 4 4 4
3 3 3 3 3 3
2 2 2 2 2 2 2 2
1 1 1 1 1 1 1 1 1 1 |
Damit kannst du dich an dem Doppelkegel versuchen:Ausgabe 1 1
2 2 2 2
3 3 3 3 3 3
2 2 2 2
1 1 |
|
Profil
Quote
Link |
Inf0rmatiker
Aktiv  Dabei seit: 14.11.2018 Mitteilungen: 30
 |     Beitrag No.29, vom Themenstarter, eingetragen 2019-11-17 11:29
|
Das mag zwar eleganter sein, ist aber für mich viel zu kompliziert..^^
Hab inzwischen ein bisschen mit abs rumprobiert und hab das hinbekommen:
c 1
1 2 1
1 2 3 2 1
1 2 3 4 3 2 1
|
Mein Code:
C #include <stdio.h>
#include <stdlib.h>
int main() {
int n = 4;
int k = 0;
for(int i = 1; i <= n; i++) {
for(int leerzeichen = (n-i)+1; leerzeichen > 0; leerzeichen--) {
printf(" ");
}
for(int j = -k; j <= k; j++) {
printf("%d ", k+1-abs(j));
}
printf("\n");
k++;
}
return EXIT_SUCCESS;
} |
Habs aber nur mit einer zusätzlichen Variable geschafft.
|
Profil
Quote
Link |
Inf0rmatiker
Aktiv  Dabei seit: 14.11.2018 Mitteilungen: 30
 |     Beitrag No.30, vom Themenstarter, eingetragen 2019-11-17 13:34
|
Hab es doch noch mit nur der Variable n hinbekommen:
C #include <stdio.h>
#include <stdlib.h>
int main() {
int n = 4;
for(int i = 1; i <= n; i++) {
for(int leerzeichen = (n-i)+1; leerzeichen > 0; leerzeichen--) {
printf(" ");
}
for(int j = -(i-1); j <= i-1; j++) {
printf("%d ", i-abs(j));
}
printf("\n");
}
return EXIT_SUCCESS;
}
|
|
Profil
Quote
Link |
viertel
Senior  Dabei seit: 04.03.2003 Mitteilungen: 26871
Aus: Hessen
 |     Beitrag No.31, eingetragen 2019-11-17 21:04
|
Kann es sein, daß es dir einfach zu unbequem ist, dich damit zu befassen?
Daran ist nämlich überhaupt nichts Kompliziertes.
Und obendrein kann man dabei auch etwas Programmiertechnik lernen, was für einen Inf0rmatiker ja durchaus nützlich sein kann 
Aber bitte, die Entscheidung, ob du dazu lernen willst, liegt natürlich bei dir.
|
Profil
Quote
Link |
Inf0rmatiker
Aktiv  Dabei seit: 14.11.2018 Mitteilungen: 30
 |     Beitrag No.32, vom Themenstarter, eingetragen 2019-11-17 23:01
|
Ich denke einfach, dass ich generell noch zu wenig kann/Ahnung habe, um mich mit so etwas Spezifisches (aus meiner Sicht), wie den verschiedenen Formatangaben von printf, zu befassen.
|
Profil
Quote
Link |
Inf0rmatiker
Aktiv  Dabei seit: 14.11.2018 Mitteilungen: 30
 |     Beitrag No.33, vom Themenstarter, eingetragen 2019-11-17 23:31
|
Möchte jetzt dieses Muster ausgeben:
C 3
3 2 3
3 2 1 2 1
3 2 3
3 |
Mein Code:
C int main() {
int n = 3;
for(int i = 1; i <= n; i++) {
for(int leerzeichen = 1; leerzeichen <= 2*(n-i); leerzeichen++) {
printf(" ");
}
for(int j = -n; j < (i-n); j++) {
printf("%d ", 1+abs(j)-1);
}
printf("\n");
}
return EXIT_SUCCESS;
}
|
Bekomme nur diese Ausgabe hin:
C
Einzeln bekomm ich auch eine Schleife hin, die 3 2 3 oder 3 2 1 2 3 ausgibt, aber nur wenn ich die Schleife nach einem Durchgang umändere.
Hat jemand einen Tipp?
|
Profil
Quote
Link |
viertel
Senior  Dabei seit: 04.03.2003 Mitteilungen: 26871
Aus: Hessen
 |     Beitrag No.34, eingetragen 2019-11-17 23:54
|
Dann kläre ich dich kurz über den * auf.
• In der Formatangabe %d mit den notwendigen Breite ausgegeben.
• Mit dem Format %5d wird die Zahl in einem 5-stelligen Bereich rechtsbündig ausgegeben.
• Und mit %*d wird die Breite im printf -Befehl mitgegeben, vor der auszugebenden Zahl.C printf("%d", 42);
// Ausgabe: 42
printf("%5d", 42);
// Ausgabe: ~~~42 (die ~ stehen für Leerzeichen)
printf("%*d", 5, 42);
// Ausgabe: ~~~42 |
Wenn ich nun vor einer Zahl eine variable Anzahl Leerzeichen ausgeben will, dann z.B. so:C for (int i=1 ; i<=9 ; i++)
{
printf("%*d", i, i);
} | Damit spare ich mir eine extra Schleife, die nur die benötigten Leerzeichen ausgeben soll.Ausgabe
Und mit einer kleinen Änderung:C for (int i=1 ; i<=9 ; i++)
{
// ___________________ Breite (führende Leerzeichen)
// | ________________ linke Zahl
// | | _____________ Breite (mittlere Leerzeichen)
// | | | __ rechte Zahl
// | | | |
printf("%*d%*d\n", i, i, 2*(9-i)+1, i);
} | Damit bekommt man diese Ausgabe:Ausgabe 1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
99 | Beachte: die Angabe einer Breite ist für die gesamte Ausgabe der Zahl mit führenden Leerzeichen, nicht nur die Anzahl der Leerzeichen zuständig. Um 3 Leerzeichen vor der Zahl 7 auszugeben, muß als Feldbreite eine 4 angegeben werden, nämlich 3+1 für 3 Leerzeichen und eine Stelle für die Zahl 7 . Für 3 Leerzeichen vor der Zahl 24680 ist also eine 8 anzugeben (3 Leerzeichen + 5 Ziffern).
[Die Antwort wurde nach Beitrag No.32 begonnen.]
|
Profil
Quote
Link |
viertel
Senior  Dabei seit: 04.03.2003 Mitteilungen: 26871
Aus: Hessen
 |     Beitrag No.35, eingetragen 2019-11-17 23:55
|
2019-11-17 23:31 - Inf0rmatiker in Beitrag No. 33 schreibt:
Möchte jetzt dieses Muster ausgeben:
C 3
3 2 3
3 2 1 2 1
3 2 3
3 |
Die letzte 1 in der mitleren Zeile soll wohl eher eine 3 sein ?
|
Profil
Quote
Link |
viertel
Senior  Dabei seit: 04.03.2003 Mitteilungen: 26871
Aus: Hessen
 |     Beitrag No.36, eingetragen 2019-11-18 00:27
|
Auch das geht:C for (int zeile=1; zeile<=2*n-1; zeile++)
{
// zeile 1,..,5 umrechnen in 1,2,3,2,1
int k = n - abs(n - zeile);
for (int i=1; i<=2*(k-1)+1; i++)
{
// ______________________________________ Entscheidung, ob gerade die erste Zahl einer Zeile ausgegeben wird
// | ___________________________ Feldbreite für die erste Zahl einer Zeile
// | | ___________________ Feldbreite für die hinteren Zahlen
// _|__ ___|___ |
// / \ / \ |
printf("%*d", (i==1) ? 2*(n-k)+1 : 2, abs(i-k)+(n-k+1));
// \____________________/ \______________/
// | |
// Berechnung der Feldbreite |
// die auszugebende Zahl
}
printf("\n");
} |
Ausgabe für n=5 5
5 4 5
5 4 3 4 5
5 4 3 2 3 4 5
5 4 3 2 1 2 3 4 5
5 4 3 2 3 4 5
5 4 3 4 5
5 4 5
5 | Um die Rechentricks mit abs zu verstehen mußt du das Programm allerdings mal mit einem Schreibtischtest durchgehen 
Ein notwendiges Verfahren beim Programmieren (lernen)!
Ich habe auch ein wenig getüftelt, um die Rechenausdrücke korrekt hinzubekommen 
|
Profil
Quote
Link |
Inf0rmatiker
Aktiv  Dabei seit: 14.11.2018 Mitteilungen: 30
 |     Beitrag No.37, vom Themenstarter, eingetragen 2019-11-18 21:03
|
Ok, das mit der Formatangabe in printf ist tatsächlich nicht so schwer^^
Dann versuch ich mich jetzt mal an:
C 1 1
2 2 2 2
3 3 3 3 3 3
2 2 2 2
1 1
|
Danke für die ausführliche Antwort :)
|
Profil
Quote
Link |
viertel
Senior  Dabei seit: 04.03.2003 Mitteilungen: 26871
Aus: Hessen
 |     Beitrag No.38, eingetragen 2019-11-19 02:40
|
Gutes Gelingen 
Die Rechentricks mit abs sind da in der Tat schon kniffliger. Dabei wird immer ausgenutzt, daß die Betragsfunktion einen Knick produziert, den man an eine gewünschte Stelle verschieben kann.
 
\green\ abs(x) \blue\ abs(x-2)+1 \red\ -abs(x+1)-1 \geo ebene(300,300) x(-3,3) y(-3,3) print(1,0.95,-0.1) print(1,0.17,1.15) pen(2) color(green) plot(abs(x)) color(blue) plot(abs(x-2)+1) color(red) plot(-abs(x+1)-1) \geooff geoprint()
|
Profil
Quote
Link |
viertel
Senior  Dabei seit: 04.03.2003 Mitteilungen: 26871
Aus: Hessen
 |     Beitrag No.39, eingetragen 2019-11-19 03:13
|
<offtopic>
In C wird vieles mit Schleifen realisiert.
Was, wenn eine Sprache schon die Fähigkeit mitbringt, mit Feldern umzugehen?
Dann kann dein letztes Beispiel etwa so umgesetzt werden:
Beispiel mit Dyalog APL
Das produziert tatsächlich mit dem Aufruf F 5 dieses Bild:Ausgabe F 5
1 1
2 2 2 2
3 3 3 3 3 3
4 4 4 4 4 4 4 4
5 5 5 5 5 5 5 5 5 5
4 4 4 4 4 4 4 4
3 3 3 3 3 3
2 2 2 2
1 1 |
Das funktioniert hier sogar für n>9 (in C müßte man auch noch mit der Anzahl Ziffern von n arbeiten):Ausgabe für n=11 F 11
1 1
2 2 2 2
3 3 3 3 3 3
4 4 4 4 4 4 4 4
5 5 5 5 5 5 5 5 5 5
6 6 6 6 6 6 6 6 6 6 6 6
7 7 7 7 7 7 7 7 7 7 7 7 7 7
8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8
9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9
10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10
11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11
10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10
9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9
8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8
7 7 7 7 7 7 7 7 7 7 7 7 7 7
6 6 6 6 6 6 6 6 6 6 6 6
5 5 5 5 5 5 5 5 5 5
4 4 4 4 4 4 4 4
3 3 3 3 3 3
2 2 2 2
1 1 |
</offtopic>
|
Profil
Quote
Link |