eine Pyramide programmieren auf Python?
Waves stellt in der Konsole eine Welle aus Gatterzeichen (#) dar. Der Benutzer wird am Anfang des Programms gefragt, wie hoch eine Welle aussehen soll und wie viele Wellen gemalt werden sollen. Eine Beispielausgabe für Wellenhöhe 3 und Wellenzahl 2 würde so aussehen:
# #
### ###
#########
kann mir jemand den Quellcode zeigen?
2 Antworten
def waves(h,n):
for i in range(h):
print((" "*(h-i-1) + "#"*(i*2+1) + " "*(h-i-1))*n)
Der Aufruf waves(3,2) liefert dann zum Beispiel folgendes Bild:
Ich denke die Nutzereingabe kriegst du selbst hin :D

Stimmt, hätte ich vielleicht erklären sollen, dafür war ich zu faul, dachte das hättest du bereits gemacht. Er war bei eurem Gespräch schon sehr nah dran.
Aber ja, ist die Frage, ob er's versteht.
Aber ja, ist die Frage, ob er's versteht.
Ich bezweifel, um ehrlich zu sein, dass er es komplett verstanden hat. Mein Fehler war, dass ich selbst Code zu früh gezeigt hab - und er hat am Ende alles 1:1 kopiert und die beiden Zeilen, die ich explizit erwähnt hab, nicht mal angepasst :^)
EJ das ist keine Hausaufgabe!!!!!!!!!!!
Wofür der neue Account? Schämst du dich so sehr für deinen Account?
Und es klingt schon sehr stark nach Hausaufgabe, daher werde ich auch weiter davon ausgehen - egal, was du sagst
Der 2Konto ist weil erste geflogen wurde. Das ist eine Aufgabe die ich von meinem Kolleg bekomme habe der ein Buch hat für Anfänger.
Aber ich muss die höhe und wellen eingeben. Sind Sie sicher das es stimmt?
h=Höhe, n=Wellenanzahl
Du kannst die Variablen natürlich benennen wie du willst.
Beim Funktionsaufruf übergibst du dann die entsprechenden Zahlen.
waves(3,2)
zum Beispiel, dann ist die Höhe 3, und es gibt 2 Wellen.
Kann ich auch so machen?
h = input("Geben Sie die Wellenhöhe ein: ") #EINGABEn
n = input("Geben Sie die Wellenzahl ein: ") #EINGABE
def waves(h,n):
for i in range(h):
print((" "*(h-i-1) + "#"*(i*2+1) + " "*(h-i-1))*n)
Da fehlt noch der Methodenaufruf. So könntest du es machen:
def waves(h,n):
for i in range(h):
print((" "*(h-i-1) + "#"*(i*2+1) + " "*(h-i-1))*n)
h = input("Geben Sie die Wellenhöhe ein: ") #EINGABE
n = input("Geben Sie die Wellenanzahl ein: ") #EINGABE
waves(h, n) # Methode mit den eingegebenen Werten aufrufen
Oder einfach ohne Methode:
h = input("Geben Sie die Wellenhöhe ein: ") #EINGABE
n = input("Geben Sie die Wellenanzahl ein: ") #EINGABE
for i in range(h):
print((" "*(h-i-1) + "#"*(i*2+1) + " "*(h-i-1))*n)
AHAAAAAAA ej wie kann ich Ihnen Danke sagen? Ich verstehe jetztt!!!!!!!!
Zweitaccount von sergio1106sea? xD
Oder hattet ihr die selbe Aufgabe?
Bedanken kannst du dich, indem du bei meiner Antwort auf "Hilfreich" und "Danke" klickst :D
Und für ein großes Dankeschön gäb's hier noch "Komplimente", dafür muss man auf das Profil des Nutzers gehen, und dann "Kompliment machen "auswählen
ja der andere funktioniert nicht.
Ich habe nur vor 4 Tagen angefangen zu programmieren und ich habe 4 Aufgaben auf Internet geschaut für Anfänger und 3 habe ich geschafft aber das letzte schaffe ich nicht. Ich habe sogar meinen Lehrer heute gefragt, aber er sagte er hat schon lange nicht mehr solche Sachen programmiert.
Also ich kann dir erklären wie ich vorgegangen bin.
Zuerst habe ich einfach versucht, nur eine Welle zu machen. Um mehrere Wellen kann man sich später noch kümmern, erstmal sollte man eine einzige Schaffen.
So sieht eine Welle ja aus:
#
###
#####
Ich habe mir überlegt, das einfach Zeile für Zeile auszugeben. Ich brauche also eine for-Schleife "for i in range(h)", die jede Zeile durchgeht.
Ich habe dann gezählt, wieviele Leerzeichen gefolgt von wievielen # ich in jeder Zeile brauche:
# //zwei Leerzeichen, ein Hashtag, Zwei Leerzeichen
### //ein Leerzeichen, drei Hashtags, ein Leerzeichen
##### //null Leerzeichen, fünf Hashtags, null Leerzeichen
Wie du siehst:
Man braucht vorne eine gewisse Anzahl an Leerzeichen, dann eine gewissen Anzahl an Hashtags, dann hinten eine gewisse Anzahl an Leerzeichen (genausoviele wie vorne).
In der ersten Zeile zwei Leerzeichen, in der nächsten Zeile eins, und in der untersten garkeins.
Bei einer Höhe von 3 beginnt man also mit 2 Leerzeichen. Bei einer Höhe von 4 würde man mit 3 Leerzeichen beginnen. Usw. Also:
In der ersten Zeile: Höhe-1 Leerzeichen.
In der nächsten Zeile: Höhe-2 Leerzeichen.
In der nächsten: Höhe-3 Leerzeichen. Usw.
Das kann man mit einer For-Schleife machen:
for i in range(h):
" "*(h-i-1)
Dann dasselbe für die Anzahl an Hashtags überlegen. Wieviele braucht man in jeder Zeile, abhängig von der Zeilen-Nummer i.
Da kommt man auf 2*i + 1.
Wenn ich jetzt noch hinten mit der selben Anzahl an Leerzeichen auffülle wie vorne, ist das ganze in einem schönen rechteckigen Bereich.
for i in range(h):
print(" "*(h-i-1) + "#"*(i*2+1) + " "*(h-i-1))
Um mehrere Wellen zu machen muss man dann einfach nur jede Zeile n mal wiederholen.
Aus
#
###
wird zum Beispiel, wenn man jede Zeile doppelt schreibt,
# #
### ###
Also einfach noch jede Zeile mal n.
Fertig ist die Formel:
for i in range(h):
print((" "*(h-i-1) + "#"*(i*2+1) + " "*(h-i-1))*n)
Klick auf meinen Namen, dann bist du auf meinem Profil.
Da sind rechts so drei Punkte, auf die Klickst du drauf.
Da kannst du dann "Kompliment machen" auswählen
Aber trotzdem mega Lieb von Ihnen das sie ein Code direkt schreiben! 🙏🏼🙏🏼
kann mir jemand den Quellcode zeigen?
Ja, aber das ist nicht der Sinn dahinter. Das ist DEINE Hausaufgabe und du sollst damit lernen, wie man solche Aufgaben auch in Zukunft angeht.
Teile das Problem doch in kleine Schritte auf und bearbeite sie nach und nach:
- wie mache ich die Nutzereingabe
- wie mache ich eine einzelne Welle mit entsprechender Höhe
- wie lasse ich diese Wellen x mal hintereinander erscheinen?
Wenn du bei etwas konkrete Probleme hast - nicht nur "ich will/kann das nicht" - kannst du gerne fragen.
Das ist keine Hausaufgabe das ist eine Aufgabe für mich, die ich selber lösen will. Aber ich schaffe es nicht. Ich bin schon das zweite Tag dran!!
Zahl1 = input("Geben Sie die Wellenhöhe ein: ") #EINGABE
Zahl2 = input("Geben Sie die Form ein: ") #EINGABE
def pattern(n):
k = 2 * n - 2
for i in range(0, n):
for j in range(0, k):
print(end=" ")
k = k - 1
for j in range(0, i + 1):
print("#", end=" ")
print("\r")
pattern(5)
Aber das alles ist alles Falsch nur input ist richtig.
k = 2 * n - 2
was erhoffst du dir hiervon? Wenn du damit die Breite der "Basis" einer Welle haben willst, ist es nicht ganz korrekt
for i in range(0, n):
soweit okay, wir wollen ja n Höhen einzeichnen lassen
for j in range(0, k):
wie gesagt: warum k mit 2*n - 2.
Klar, du willst von der Spitze an anfangen und dann immer ein Leerzeichen weniger produzieren, um eben die Welle darzustellen.
Wie sehen denn die Wellen **genau** aus. In deiner Fragestellung sind die Leerzeichen weg, weshalb das nicht ganz so ersichtlich ist. Nutz doch für die Wellen auch mal die Code-Umgebung
for j in range(0, i + 1):
print("#", end=" ")
ist mit dem vorherigen Code auch okay, wenn man die Welle weiter ausfüllen will.
Damit hast du jedoch nur die eine Hälfte einer Welle dargestellt, die zweite Hälfte fehlt. Zudem ist es so schwierig, Wiederholungen einzubauen
print("\r")
wofür nutzt du das?
-----
wie ich es angegangen wäre:
wie mache ich eine einzelne Welle mit entsprechender Höhe
Ich würde eine Liste erstellen, die als Einträge die verschiedenen Höhen einer einzelnen Welle beinhaltet.
Die Leerzeichen vor und nach der Welle selbst würde ich - abhängig von der momentanen Höhe - jeweils berechnen. Je nachdem, wie die Wellen genau aussehen sollen, sieht die Berrechnung da etwas anders aus
Da eine List Comprehension vermutlich zu unübersichtlich wäre, könnte das auch mit einer normalen Schleife gelöst werden - so vom Prinzip:
def single_wave(height: int) -> list:
base = height * 2 - 1
result = []
for i in range(height):
whitespace = "." * WHITESPACE_SIZE
wave = "#" * WAVE_SIZE
result.append(whitespace + wave + whitespace)
return result
Um dir nicht alles direkt zu präsentieren, hab ich mal WAVE_SIZE und WHITESPACE_SIZE offen gelassen. Hier darfst du gerne eine Formel herausfinden, um die entsprechende Breite in Abhängigkeit von der Höhe zu bekommen :)
Ich hab übrigens mal "." statt " " genommen, das ist aber am Ende rein optional
wie lasse ich diese Wellen x mal hintereinander erscheinen?
Mit der Vorarbeit ist es relativ trivial. Es ist nett zu wissen, dass du Strings einfach wiederholen kannst, indem du sie mit einer Zahl multiplizierst.
>>> 'Hallo' * 3
'HalloHalloHallo'
Da du die einzelnen Ebenen der Welle nun in einer Liste als Strings gespeichert hast, kannst du diese einfach mehrmals wiedergeben lassen. Du könntest z.B. das so realisieren - hier werden die einzelnen Strings der Liste jeweils n mal wiederholt und das Ergebnis davon anschließend über New Line verbunden. ZU guter Letzt wird diese neue Liste über New Line (\n) zu einem String verbunden, der ausgegeben werden kann
def concat_waves(wave: list, repeat: int) -> str:
return "\n".join(layer * repeat for layer in wave)
alternativ kannst du natürlich auch hier eine klassische Schleife nehmen und es direkt ausgeben - hier in zwei Ausführungen
def print_wave_1(wave: list, repeat: int) -> None:
for layer in wave:
print(layer * repeat)
def print_wave_2(wave: list, repeat: int) -> None:
for layer in wave:
for _ in range(repeat):
print(layer, end = "")
print()
Danke für die grosse Erklärung!
Ich habe jetzt den Code so geschriben
k = input("Geben Sie die Wellenhöhe ein: ") #EINGABE
n = input("Geben Sie die Wellenzahl ein: ") #EINGABE
from Tools.demo.beer import n
k = 2 * n - 2
for i in range(0, n):
for j in range(0, k):
for j in range(0, i + 1):
print("#", end=" ")
print("\r")
def single_wave(height: int, WHITESPACE_SIZE=None, WAVE_SIZE=None) -> list:
base = height * 2 - 1
result = []
for i in range(height):
whitespace = "." * WHITESPACE_SIZE
wave = "#" * WAVE_SIZE
result.append(whitespace + wave + whitespace)
return result
def concat_waves(wave: list, repeat: int) -> str:
return "\n".join(layer * repeat for layer in wave)
def print_wave_1(wave: list, repeat: int) -> None:
for layer in wave:
print(layer * repeat)
def print_wave_2(wave: list, repeat: int) -> None:
for layer in wave:
for _ in range(repeat):
print(layer, end="")
print()
Aber wenn ich es los starte zeigt er über Million #.
Aber ej DANKE IHNEN!!!!
Du sollst den Code auch nicht 1:1 kopieren, sondern VERSTEHEN und anwenden.
Und lies doch nochmal, was ich geschrieben habe:
Um dir nicht alles direkt zu präsentieren, hab ich mal WAVE_SIZE und WHITESPACE_SIZE offen gelassen. Hier darfst du gerne eine Formel herausfinden, um die entsprechende Breite in Abhängigkeit von der Höhe zu bekommen :)
Das musst du natürlich auch noch anwenden
whitespace = "." * (k – 1)
Nein. Beschreib es doch mal in Woten:
Du nimmst die Breite der Basis, entfernst die Anzahl der Zeichen in der Mitte (mit #) und teilst das durch zwei - Links und rechts ...
wave = "#" * (n * 2 - 1)
warum minus?
Ich sprech mal von meiner Funktion: Die Schleife iteriert i über range(height), dh von 0 bis height - 1.
Dh in der ersten Iteration wäre i = 0, du hast aber offensichtlich ein #
In der zweiten Iteration ist i = 1, du hast aber 3 #.
Egal ich gib auf. Habs nicht geschafft.
🤷♂️
Sry versteh nicht was sie jetzt meinen. Hab nur angefangen zu programmieren und check schon das nicht. Was kann ich machen wenn ich es nicht verstehe? Wenn ich den Code hab dann verstehe ich es.
Sry versteh nicht was sie jetzt meinen. Hab nur angefangen zu programmieren und check schon das nicht. Was kann ich machen wenn ich es nicht verstehe?
Arbeite an deinem logischen Verständnis.
Programmierung ist sehr viel nachdenken und logisch handeln. Sie befolgt strenge Regeln
Aber okay, machen wir es mal nicht allein mit Worten, sondern mit einer Grafik:
..X..
.XXX.
XXXXX
Wie wir sehen, ist die Höhe 3 und die Basis hat eine Breite von 5 Zeichen.
Beachten wir die oberste Zeile:
Links zwei Punkte, in der Mitte die Welle, rechts zwei Punkte.
Von deinen 5 Zeichen Breite geht also ein Zeichen für die Welle selbst weg, der Rest wird links und rechts aufgeteilt - insgesamt bleiben 4 Zeichen, von denen zwei Links und zwei Rechts sind
In der mittleren Reihe haben wir 3 Zeichen für die Welle selbst. Die restlichen Zeichen (2) werden auf links und rechts verteilt.
Du kannst natürlich auch iterativ arbeiten und die "Welle" jedes mal um zwei wachsen und die Breite der Punkte um jeweils 1 pro Seite verkleinern lassen
Wenn ich den Code hab dann verstehe ich es.
Bezweifel ich, ich hab es ja quasi schon auf dem SIlbertablett präsentiert
Also die formal die ich brauch, ist sie lang?
k=int(input("Enter the number of rows"))
for i in range(1,k):
print(' '*(k-i),'* '*(i))
*
* *
* * *
* * * *
* * * * *
* * * * * *
* * * * * * *
das geht auch oder was ich geschrieben habe? Ej nein so lange an dieser Aufgabe. Und die Formel die ich brauch verstehe ich leider nicht.
Kleiner Tipp: Wenn du Dinge mit Leerzeichen darstellen willst, nutz doch die Code-Umgebung. Sonst ist nicht ersichtlich, dass da eigentlich Leerzeichen davor zu haben sind.
Zudem passt das zwar prinzipiell für eine einfache Pyramide, wenn man die "abschließenden Zeichen nicht braucht und jeweils um ein Zeichen erhöht.
Das sieht aber anders aus als das, was du präsentiert hast
Und die Formel die ich brauch verstehe ich leider nicht.
Dann mach es ohne Formel, sondern mit zusätzlichen Variablen - und zähle diese entsprechend hoch oder runter. hab ich ja auch erwähnt gehabt
Aber ich will den Code erfahren. Wenn mich was interessiert, dann will ich es hahaah. 😅😅😅 ich habe gerade meinen Lehrer gefragt. Er wusste es sogar nicht 😭hahahahha
Aber ich will den Code erfahren. Wenn mich was interessiert, dann will ich es hahaah. 😅😅😅
Dann finde ihn heraus, ich hab schon genug Code gegeben und du hast den Code 1:1 kopiert, statt ihn zu verstehen, anzupassen und selbst zu nutzen.
Du hast sogar ALLE drei Ausgabe-Methoden kopiert.
ich habe gerade meinen Lehrer gefragt. Er wusste es sogar nicht 😭hahahahha
Also doch eine Schulaufgabe und du hast mich angelogen?
Oder der Lehrer hat selbst keine Ahnung von der Materie, denn das sind Grundlagen und einfache Logik
das ist keine Schulaufgabe! Das ist nur eine Übung für mich selbst. Und ich habe jetzt den Lehrer gefragt ob er mir den gefällten Code erklären könnte! Ich bedanke mich trotzdem für die lange Erklärung. Ich wünsche Ihnen einen schönen Tag noch. Danke.
auch wenn das natürlich eine Möglichkeit ist, das einfach darzustellen, bin ich der Meinung, dass man den Code nicht einfach so präsentieren sollte - besonders, wenn der Fragesteller wie hier keine Ahung vom Coden hat und den Code anschließend einfach für die Hausaufgaben kopieren wird