Die Mathe-Redaktion - 13.12.2019 08:23 - Registrieren/Login
Auswahl
ListenpunktHome
ListenpunktAktuell und Interessant ai
ListenpunktArtikelübersicht/-suche
ListenpunktAlle Links / Mathe-Links
ListenpunktFach- & Sachbücher
ListenpunktMitglieder / Karte / Top 15
ListenpunktRegistrieren/Login
ListenpunktArbeitsgruppen
Listenpunkt? im neuen Schwätz
ListenpunktWerde Mathe-Millionär!
ListenpunktFormeleditor fedgeo
Schwarzes Brett
Aktion im Forum
Suche
Stichwortsuche in Artikeln und Links von Matheplanet
Suchen im Forum
Suchtipps

Bücher
Englische Bücher
Software
Suchbegriffe:
Mathematik bei amazon
Naturwissenschaft & Technik
In Partnerschaft mit Amazon.de
Kontakt
Mail an Matroid
[Keine Übungsaufgaben!]
Impressum

Bitte beachten Sie unsere Nutzungsbedingungen, die Distanzierung, unsere Datenschutzerklärung und
die Forumregeln.

Sie können Mitglied werden. Mitglieder können den Matheplanet-Newsletter bestellen, der etwa alle 2 Monate erscheint.

Der Newsletter Okt. 2017

Für Mitglieder
Mathematisch für Anfänger
Wer ist Online
Aktuell sind 502 Gäste und 8 Mitglieder online.

Sie können Mitglied werden:
Klick hier.

Über Matheplanet
 
Zum letzten Themenfilter: Themenfilter:
Matroids Matheplanet Forum Index
Moderiert von matph
Informatik » Programmieren » Zahlenmuster in C
Druckversion
Druckversion
Antworten
Antworten
Autor
Universität/Hochschule Zahlenmuster in C
Inf0rmatiker
Aktiv Letzter Besuch: im letzten Monat
Dabei seit: 14.11.2018
Mitteilungen: 30
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Themenstart: 2019-11-13


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 auf diesen Beitrag Link
StrgAltEntf
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 19.01.2013
Mitteilungen: 5341
Aus: Milchstraße
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.1, eingetragen 2019-11-13


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 auf diesen Beitrag Link
Inf0rmatiker
Aktiv Letzter Besuch: im letzten Monat
Dabei seit: 14.11.2018
Mitteilungen: 30
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.2, vom Themenstarter, eingetragen 2019-11-13


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 auf diesen Beitrag Link
StrgAltEntf
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 19.01.2013
Mitteilungen: 5341
Aus: Milchstraße
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.3, eingetragen 2019-11-13


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 auf diesen Beitrag Link
Inf0rmatiker
Aktiv Letzter Besuch: im letzten Monat
Dabei seit: 14.11.2018
Mitteilungen: 30
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.4, vom Themenstarter, eingetragen 2019-11-13


Nein, so wird lediglich der ganze Zahlenblock nach rechts verschoben.




  Profil  Quote  Link auf diesen Beitrag Link
StrgAltEntf
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 19.01.2013
Mitteilungen: 5341
Aus: Milchstraße
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.5, eingetragen 2019-11-13


Dann verstehe ich dein "usw" nicht.



  Profil  Quote  Link auf diesen Beitrag Link
Inf0rmatiker
Aktiv Letzter Besuch: im letzten Monat
Dabei seit: 14.11.2018
Mitteilungen: 30
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.6, vom Themenstarter, eingetragen 2019-11-13


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 auf diesen Beitrag Link
StrgAltEntf
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 19.01.2013
Mitteilungen: 5341
Aus: Milchstraße
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.7, eingetragen 2019-11-13


Ja, das kommt davon, wenn man "blind" programmiert  eek

Habe den Code ausgebessert. Probier es jetzt mal.



  Profil  Quote  Link auf diesen Beitrag Link
Inf0rmatiker
Aktiv Letzter Besuch: im letzten Monat
Dabei seit: 14.11.2018
Mitteilungen: 30
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.8, vom Themenstarter, eingetragen 2019-11-13


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
r = 3
 
        1
      1 2 
    1 2 3
      2 3
        1
 



  Profil  Quote  Link auf diesen Beitrag Link
StrgAltEntf
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 19.01.2013
Mitteilungen: 5341
Aus: Milchstraße
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.9, eingetragen 2019-11-13


Meinst du das?
        1
      1 2 
    1 2 3
      1 2
        1



  Profil  Quote  Link auf diesen Beitrag Link
Inf0rmatiker
Aktiv Letzter Besuch: im letzten Monat
Dabei seit: 14.11.2018
Mitteilungen: 30
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.10, vom Themenstarter, eingetragen 2019-11-13


Ja, genau, hab mich verschrieben.




  Profil  Quote  Link auf diesen Beitrag Link
StrgAltEntf
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 19.01.2013
Mitteilungen: 5341
Aus: Milchstraße
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.11, eingetragen 2019-11-13


Lass die i-Schleife einfach noch einmal rückwärts laufen. Versuch es mal!



  Profil  Quote  Link auf diesen Beitrag Link
Inf0rmatiker
Aktiv Letzter Besuch: im letzten Monat
Dabei seit: 14.11.2018
Mitteilungen: 30
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.12, vom Themenstarter, eingetragen 2019-11-13


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
r = 3 
 
          1
        2
      3
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 auf diesen Beitrag Link
StrgAltEntf
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 19.01.2013
Mitteilungen: 5341
Aus: Milchstraße
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.13, eingetragen 2019-11-13


Das ist natürlich nicht richtig:

for(int j = i; j <= i; j++)



  Profil  Quote  Link auf diesen Beitrag Link
Inf0rmatiker
Aktiv Letzter Besuch: im letzten Monat
Dabei seit: 14.11.2018
Mitteilungen: 30
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.14, vom Themenstarter, eingetragen 2019-11-13


Ops, mein Fehler...



  Profil  Quote  Link auf diesen Beitrag Link
Inf0rmatiker
Aktiv Letzter Besuch: im letzten Monat
Dabei seit: 14.11.2018
Mitteilungen: 30
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.15, vom Themenstarter, eingetragen 2019-11-14


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 auf diesen Beitrag Link
StrgAltEntf
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 19.01.2013
Mitteilungen: 5341
Aus: Milchstraße
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.16, eingetragen 2019-11-14


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 auf diesen Beitrag Link
Inf0rmatiker
Aktiv Letzter Besuch: im letzten Monat
Dabei seit: 14.11.2018
Mitteilungen: 30
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.17, vom Themenstarter, eingetragen 2019-11-14


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 auf diesen Beitrag Link
viertel
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 04.03.2003
Mitteilungen: 26873
Aus: Hessen
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.18, eingetragen 2019-11-15


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 wink

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 eek

Mit dieser Technik könnte dein Programm deutlich vereinfacht werden cool


-----------------
Bild



  Profil  Quote  Link auf diesen Beitrag Link
zippy
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 24.10.2018
Mitteilungen: 799
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.19, eingetragen 2019-11-15


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 wink

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 auf diesen Beitrag Link
Inf0rmatiker
Aktiv Letzter Besuch: im letzten Monat
Dabei seit: 14.11.2018
Mitteilungen: 30
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  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 auf diesen Beitrag Link
StrgAltEntf
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 19.01.2013
Mitteilungen: 5341
Aus: Milchstraße
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  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 auf diesen Beitrag Link
Inf0rmatiker
Aktiv Letzter Besuch: im letzten Monat
Dabei seit: 14.11.2018
Mitteilungen: 30
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.22, vom Themenstarter, eingetragen 2019-11-15 19:27


Ja, da ist dein Code ein wenig eleganter :D



  Profil  Quote  Link auf diesen Beitrag Link
Inf0rmatiker
Aktiv Letzter Besuch: im letzten Monat
Dabei seit: 14.11.2018
Mitteilungen: 30
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.23, vom Themenstarter, eingetragen 2019-11-15 22:34


Bin gerade da einen Code zu schreiben, welcher dieses Muster ausgeben soll:
C
1 1 1 
  2 2 
    3
 

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 auf diesen Beitrag Link
StrgAltEntf
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 19.01.2013
Mitteilungen: 5341
Aus: Milchstraße
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  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 auf diesen Beitrag Link
Inf0rmatiker
Aktiv Letzter Besuch: im letzten Monat
Dabei seit: 14.11.2018
Mitteilungen: 30
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  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 auf diesen Beitrag Link
StrgAltEntf
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 19.01.2013
Mitteilungen: 5341
Aus: Milchstraße
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  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 schreiben
C
for(int leerzeichen = 1; leerzeichen <= 2*(i-1); leerzeichen++)
  printf(" ");
Genauso gut ist aber
C
for(int leerzeichen = 1; leerzeichen <= i-1; leerzeichen++)
  printf("  ");




  Profil  Quote  Link auf diesen Beitrag Link
Inf0rmatiker
Aktiv Letzter Besuch: im letzten Monat
Dabei seit: 14.11.2018
Mitteilungen: 30
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  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 auf diesen Beitrag Link
viertel
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 04.03.2003
Mitteilungen: 26873
Aus: Hessen
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  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
1 1 1
  2 2
    3
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 auf diesen Beitrag Link
Inf0rmatiker
Aktiv Letzter Besuch: im letzten Monat
Dabei seit: 14.11.2018
Mitteilungen: 30
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  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 auf diesen Beitrag Link
Inf0rmatiker
Aktiv Letzter Besuch: im letzten Monat
Dabei seit: 14.11.2018
Mitteilungen: 30
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  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 auf diesen Beitrag Link
viertel
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 04.03.2003
Mitteilungen: 26873
Aus: Hessen
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  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 wink
Aber bitte, die Entscheidung, ob du dazu lernen willst, liegt natürlich bei dir.



  Profil  Quote  Link auf diesen Beitrag Link
Inf0rmatiker
Aktiv Letzter Besuch: im letzten Monat
Dabei seit: 14.11.2018
Mitteilungen: 30
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  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 auf diesen Beitrag Link
Inf0rmatiker
Aktiv Letzter Besuch: im letzten Monat
Dabei seit: 14.11.2018
Mitteilungen: 30
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  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
    3
  3 2 
3 2 1
 

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 auf diesen Beitrag Link
viertel
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 04.03.2003
Mitteilungen: 26873
Aus: Hessen
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  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
1
 2
  3
   4
    5
     6
      7
       8
        9

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 auf diesen Beitrag Link
viertel
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 04.03.2003
Mitteilungen: 26873
Aus: Hessen
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  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 auf diesen Beitrag Link
viertel
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 04.03.2003
Mitteilungen: 26873
Aus: Hessen
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  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 cool
Ein notwendiges Verfahren beim Programmieren (lernen)!
Ich habe auch ein wenig getüftelt, um die Rechenausdrücke korrekt hinzubekommen biggrin



  Profil  Quote  Link auf diesen Beitrag Link
Inf0rmatiker
Aktiv Letzter Besuch: im letzten Monat
Dabei seit: 14.11.2018
Mitteilungen: 30
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  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 auf diesen Beitrag Link
viertel
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 04.03.2003
Mitteilungen: 26873
Aus: Hessen
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  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.
fed-Code einblenden



  Profil  Quote  Link auf diesen Beitrag Link
viertel
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 04.03.2003
Mitteilungen: 26873
Aus: Hessen
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  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 auf diesen Beitrag Link
Inf0rmatiker hat die Antworten auf ihre/seine Frage gesehen.
Inf0rmatiker wird per Mail über neue Antworten informiert.
Neues Thema [Neues Thema] Antworten [Antworten]    Druckversion [Druckversion]

 


Wechsel in ein anderes Forum:
 Suchen    
 
All logos and trademarks in this site are property of their respective owner. The comments are property of their posters, all the rest © 2001-2019 by Matroids Matheplanet
This web site was made with PHP-Nuke, a web portal system written in PHP. PHP-Nuke is Free Software released under the GNU/GPL license.
Ich distanziere mich von rechtswidrigen oder anstößigen Inhalten, die sich trotz aufmerksamer Prüfung hinter hier verwendeten Links verbergen mögen.
Lesen Sie die Nutzungsbedingungen, die Distanzierung, die Datenschutzerklärung und das Impressum.
[Seitenanfang]