Mario

Aufgabe
So ist die Pyramide aufgebaut
Gegen Ende von Welt 1-1 in Nintendos Super Mario Bros. muss Mario eine solche Pyramide aus Steinen erklimmen. Im Terminal wird jeder Stein zu einem #.

Für eine Pyramide der Höhe gilt:
- Die Pyramide hat Zeilen.
- In Zeile (von oben gezählt, beginnend bei 1) stehen Steine
#. - Davor stehen Leerzeichen. So ist jede Zeile genau Zeichen breit, und die Steine stehen rechtsbündig.
- Nach dem letzten
#einer Zeile folgt nur der Zeilenumbruch, kein Leerzeichen.
Beispiel mit Höhe (· steht hier für ein Leerzeichen):
| Zeile | Leerzeichen | Steine | Ausgabe |
|---|---|---|---|
| 1 | 3 | 1 | ···# |
| 2 | 2 | 2 | ··## |
| 3 | 1 | 3 | ·### |
| 4 | 0 | 4 | #### |
Demo
Ordner und Datei anlegen
Wie bei Hello, It’s Me, nur mit anderem Namen. Mit cd kommen Sie zuerst aus dem Ordner me zurück in Ihr Homeverzeichnis (Eingabeaufforderung $):
cd
mkdir mario
cd mario
code mario.cHilfestellung
Klicken Sie auf die folgenden Tipps, um einige Ratschläge zu erhalten. Versuchen Sie aber zunächst, selbst so weit wie möglich zu kommen.
Nützliche Funktionen
- Einen
intvom Benutzer bekommen Sie mitget_int, deklariert incs50.h(siehe manual.cs50.io). Wie verhält sich die Funktion laut Handbuch, wenn keininteingegeben wird? - Einen
stringgeben Sie mitprintfaus, deklariert instdio.h.
Beginnen Sie mit Code, der kompilierbar ist
Auch wenn dieses Programm noch nichts tut, sollte es zumindest mit make kompiliert werden können!
#include <cs50.h>
#include <stdio.h>
int main(void)
{
}Denken Sie daran, dass Sie jetzt cs50.h und stdio.h eingebunden haben, zwei „Header-Dateien“, die Ihnen Zugang zu Funktionen geben, die Ihnen bei der Lösung dieses Problems helfen könnten.
Versuchen Sie das Problem in Pseudocode zu beschreiben
Wenn Sie unsicher sind, wie Sie das eigentliche Problem lösen können, unterteilen Sie es in kleinere Probleme, die Sie wahrscheinlich einfacher lösen können. Im Kern besteht diese Aufgabe eigentlich aus zwei Problemen:
- Die Aufforderung an den Benutzer, die Höhe der Pyramide einzugeben.
- Das Ausgeben einer Pyramide mit dieser Höhe.
Fügen Sie die identifizierten Probleme nun in Form von Pseudocode als Kommentare ein, um sie dann nacheinander bearbeiten zu können.
#include <cs50.h>
#include <stdio.h>
int main(void)
{
// Prompt the user for the pyramid's height
// Print a pyramid of that height
}Wandeln Sie den Pseudocode in Code um
Überlegen Sie zunächst, wie Sie den Benutzer nach der Höhe der Pyramide fragen können. Erinnern Sie sich daran, dass eine do while-Schleife hilfreich ist, wenn Sie etwas mindestens einmal und möglicherweise immer wieder tun wollen, wie in dem folgenden Beispiel:
#include <cs50.h>
#include <stdio.h>
int main(void)
{
// Prompt the user for the pyramid's height
int height;
do
{
height = get_int("Height: ");
}
while (height < 1);
// Print a pyramid of that height
}Überlegen Sie sich nun, wie Sie eine Pyramide mit dieser Höhe von oben nach unten ausgeben könnten. Beachten Sie, dass die erste Reihe (von oben betrachtet) aus einem Stein bestehen sollte, die zweite Reihe aus zwei Steinen und so weiter. Wahrscheinlich denken Sie bereits an eine Schleife, auch wenn Sie (noch!) nicht wissen, was Sie in diese Schleife einfügen sollen. Fügen Sie also erst einmal etwas mehr Pseudocode als Kommentar hinzu:
#include <cs50.h>
#include <stdio.h>
int main(void)
{
// Prompt the user for the pyramid's height
int height;
do
{
height = get_int("Height: ");
}
while (height < 1);
// Print a pyramid of that height
for (int i = 0; i < height; i++)
{
// Print row of bricks
}
}Wie kann man diese Reihe von Steinen ausdrucken? Nun, wäre es nicht schön, wenn es eine Funktion namens print_row gäbe, die genau das tun könnte? Nehmen wir an, es gäbe sie (vergessen Sie nicht den Funktionsprototypen oberhalb der main-Funktion einzufügen, wenn Sie die Funktion unterhalb der main-Funktion definieren):
#include <cs50.h>
#include <stdio.h>
void print_row(int bricks);
int main(void)
{
// Prompt the user for the pyramid's height
int height;
do
{
height = get_int("Height: ");
}
while (height < 1);
// Print a pyramid of that height
for (int i = 0; i < height; i++)
{
// Print row of bricks
}
}
void print_row(int bricks)
{
// Print row of bricks
}Wir können diese Funktion dann von main aus innerhalb der for-Schleife aufrufen, wie im Folgenden gezeigt:
#include <cs50.h>
#include <stdio.h>
void print_row(int bricks);
int main(void)
{
// Prompt the user for the pyramid's height
int height;
do
{
height = get_int("Height: ");
}
while (height < 1);
// Print a pyramid of that height
for (int i = 0; i < height; i++)
{
// Print row of bricks
print_row(i + 1);
}
}
void print_row(int bricks)
{
// Print row of bricks
}Warum aber i + 1?
Versuchen wir zuerst einmal print_row zu implementieren:
#include <cs50.h>
#include <stdio.h>
void print_row(int bricks);
int main(void)
{
// Prompt the user for the pyramid's height
int height;
do
{
height = get_int("Height: ");
}
while (height < 1);
// Print a pyramid of that height
for (int i = 0; i < height; i++)
{
// Print row of bricks
print_row(i + 1);
}
}
void print_row(int bricks)
{
for (int i = 0; i < bricks; i++)
{
printf("#");
}
printf("\n");
}Wissen Sie, wofür ein \n am Ende ausgegeben wird?
Leider gibt dieser Code eine linksbündige Pyramide aus. Wir wollen aber eine rechtsbündige! Vielleicht könnten wir vor einige der Steine ein paar Leerzeichen setzen, um sie nach rechts zu verschieben? Ergänzen wir also print_row wie folgt (vergessen Sie nicht den Funktionsprototypen oberhalb der main-Funktion entsprechend zu ergänzen):
#include <cs50.h>
#include <stdio.h>
void print_row(int spaces, int bricks);
int main(void)
{
// Prompt the user for the pyramid's height
int height;
do
{
height = get_int("Height: ");
}
while (height < 1);
// Print a pyramid of that height
for (int i = 0; i < height; i++)
{
// Print row of bricks
}
}
void print_row(int spaces, int bricks)
{
// Print spaces
// Print bricks
}Überlegen Sie sich nun also noch, wie Sie möglichst geschickt die Leerzeichen übergeben und ausgeben können. Und überlegen Sie sich zusätzlich, ob Sie nicht auch einen Teil des Codes in main in eine get_height-Funktion auslagern könnten, die den benötigten int zurückgibt!
Testen
Testen Sie Ihr Programm von Hand mit diesen Eingaben:
| Eingabe | erwartetes Verhalten |
|---|---|
-1 oder eine andere negative Zahl | fragt erneut nach der Höhe |
0 | fragt erneut nach der Höhe |
Buchstaben oder Wörter, z. B. cat | fragt erneut nach der Höhe |
| gar nichts, nur Enter | fragt erneut nach der Höhe |
1 | eine Zeile: # |
8 | die Pyramide unten |
Height: 8
#
##
###
####
#####
######
#######
########Korrektheit
Führen Sie in Ihrem Terminal den folgenden Befehl aus, um die Korrektheit Ihrer Arbeit zu überprüfen:
check50 -l inf-zone/exercises/2026/marioStyle
Führen Sie den folgenden Befehl aus, um den Stil Ihres Codes mit style50 zu analysieren:
style50 mario.cAbgeben
Geben Sie im Ordner mario ab:
inf upload marioDanach sehen Sie, welche Tests Ihr Programm besteht und ob die Übung für die Bonuspunkte zählt. Wie Sie inf installieren und sich anmelden, steht unter Abgeben mit inf.
Diese Seite als Markdown: ansehen herunterladen