Pyramidenausgabe programmieren?

2 Antworten

Aber wie zum Teufel kriege ich es hin, auf solche Logiken selber zu kommen?

Indem du versuchst, das Problem erst zu verstehen und anschließend in Einzelprobleme zu zerlegen.

Im Fall der Pyramide kennst du die Endform:

1
1 2
1 2 3
1 2 3 4
1 2 3 4 5

Man kann zunächst feststellen, dass du n Zeilen brauchst, wobei n der Pyramidenhöhe entspricht.

Teilproblem 1: Ausgabe aller Pyramidenzeilen

n = Pyramidenhöhe

wiederhole n-mal:
  gib Zeile aus

Nun fehlt noch eine Überlegung, wie eine Zeile aufgebaut werden muss. Jede Zeile zählt von 1 an bis zur jeweiligen Zeilenhöhe (die erste Zeile zählt bis 1, die zweite Zeile zählt bis zwei, die dritte Zeile zählt bis drei, ...).

Teilproblem 2: Ausgabe einer einzelnen Pyramidenzeile

m = Zeilenhöhe
spalte = 1

wiederhole m-mal:
  gib Spalte aus
  spalte = spalte + 1

gib Zeilenumbruch aus

Beide Schritte werden in Folge miteinander kombiniert:

n = Pyramidenhöhe
zeile = 1

wiederhole n-mal:
  m = zeile
  spalte = 1

  wiederhole m-mal:
    gib Spalte aus
    spalte = spalte + 1

  gib Zeilenumbruch aus
  zeile = zeile + 1

Ich habe das soweit in Pseudocode formuliert. Struktogramme oder Programmablaufpläne würden sich dafür aber ebenso eignen. Die Hauptsache ist, dass die Lösungsschritte erst einmal mit möglichst einfachen Mitteln beschrieben werden.

Nach ein paar erfolgreichen Tests (via Testeinsetzungen) kann die tatsächliche Übersetzung in die jeweilige Programmiersprache erfolgen. Mache nicht den Fehler, schon von Anfang an deine Algorithmen in Programmcode von C (o.ä.) formulieren zu wollen, denn tendentiell lässt du dich so mehr von Syntaxregeln ablenken und machst es dir somit nur schwerer.

Eine Eins-zu-eins-Übersetzung könnte zunächst so aussehen:

int hoehe = 5;
int zeile = 1;

while (zeile <= hoehe) {
  int m = zeile;
  int spalte = 1;

  while (spalte <= m) {
    printf("%d ", spalte);
    spalte = spalte + 1;
  }

  printf("\n");
  zeile = zeile + 1;
}

Im Anschluss kann man noch schauen, ob der Code (z.B. in seiner Formulierung) optimierbar ist:

int hoehe = 5;

for (int zeile = 1; zeile <= hoehe; ++zeile) {
  for (int spalte = 1; spalte <= zeile; ++spalte) {
    printf("%d ", spalte);
  }

  printf("\n");
}

Es macht Sinn, dieses Prinzip für das Bilden von Algorithmen möglichst viel zu üben. In einigen meiner Beiträge auf GF habe ich schon einmal Aufgaben vorgeschlagen (siehe hier, hier und hier), die du bearbeiten könntest. Auf Webseiten wie CodingBat, Edabit, Exercism oder Projekt Euler findest du weitere Ideen.

(...) aber wieso kann ich die Variante in C nicht in Python nutzen (...)

C und Python sind zwei unterschiedliche Programmiersprachen mit eigenen Syntaxregeln. In Python gibt es nicht diese Art an Zählschleife mit Bedingungsausdruck, so wie in C.

Alternativ zu for...in könntest du allerdings eine while-Schleife einsetzen. Die ist in diesem Kontext der while-Schleife von C wieder ähnlicher.

spalte = 1

while spalte <= zeile:
  print(spalte + " ")
  spalte += 1

1. Also um selbst darauf zu kommen brauchst du erstmal ein grundsätzliches Logikverständnis. Lernen, wie man Algorithmen schreibt tust du am besten mit einem Buch. Und mit ein bisschen üben wird das schon.

2. Das liegt einfach daran, dass C und Python völlig verschiedene Sprachen sind. Vom Prinzip her tun sie aber dasselbe, wie du ja auch schon gemerkt hast.

Woher ich das weiß:eigene Erfahrung – Ich habe schon mal einen PC gestartet