eine Pyramide programmieren auf Python?

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:

Bild zum Beitrag

Ich denke die Nutzereingabe kriegst du selbst hin :D

Woher ich das weiß:Hobby – Programmieren ist mein Hobby & Beruf
 - (programmieren, Informatik)
sergio1106sea 
Fragesteller
 07.04.2022, 17:16

Aber ich muss die höhe und wellen eingeben. Sind Sie sicher das es stimmt?

0
MrAmazing2  07.04.2022, 17:16
@sergio1106sea

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.

0
sergio1106sea 
Fragesteller
 07.04.2022, 17:34
@MrAmazing2

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)

0
MrAmazing2  07.04.2022, 17:51
@sergio1106sea

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)
1
Uepaa  07.04.2022, 17:54
@MrAmazing2

AHAAAAAAA ej wie kann ich Ihnen Danke sagen? Ich verstehe jetztt!!!!!!!!

0
MrAmazing2  07.04.2022, 17:54
@Uepaa

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

2
Uepaa  07.04.2022, 17:57
@MrAmazing2

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.

1
MrAmazing2  07.04.2022, 18:09
@Uepaa

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)
0
MrAmazing2  07.04.2022, 18:12
@sergio1106sea

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

0
xxxcyberxxx  07.04.2022, 17:29

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

0
MrAmazing2  07.04.2022, 17:31
@xxxcyberxxx

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.

0
xxxcyberxxx  07.04.2022, 17:35
@MrAmazing2
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 :^)

1
xxxcyberxxx  07.04.2022, 17:57
@Uepaa
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

1
sergio1106sea 
Fragesteller
 07.04.2022, 18:01
@xxxcyberxxx

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.

0
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.

sergio1106sea 
Fragesteller
 07.04.2022, 14:18

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!!

0
sergio1106sea 
Fragesteller
 07.04.2022, 14:25
@xxxcyberxxx
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.

0
xxxcyberxxx  07.04.2022, 14:59
@sergio1106sea
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()
1
sergio1106sea 
Fragesteller
 07.04.2022, 15:26
@xxxcyberxxx

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!!!!

0
xxxcyberxxx  07.04.2022, 15:27
@sergio1106sea

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

0
xxxcyberxxx  07.04.2022, 16:09
@sergio1106sea
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.

🤷‍♂️

0
sergio1106sea 
Fragesteller
 07.04.2022, 16:15
@xxxcyberxxx

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.

0
xxxcyberxxx  07.04.2022, 16:18
@sergio1106sea
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

0
sergio1106sea 
Fragesteller
 07.04.2022, 17:10
@xxxcyberxxx

k=int(input("Enter the number of rows"))

for i in range(1,k):

print(' '*(k-i),'* '*(i))

*

* *

* * *

* * * *

* * * * *

* * * * * *

* * * * * * *

0
sergio1106sea 
Fragesteller
 07.04.2022, 17:14
@xxxcyberxxx

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.

0
xxxcyberxxx  07.04.2022, 17:14
@sergio1106sea

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

0
xxxcyberxxx  07.04.2022, 17:15
@sergio1106sea
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

0
sergio1106sea 
Fragesteller
 07.04.2022, 17:20
@xxxcyberxxx

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

0
xxxcyberxxx  07.04.2022, 17:23
@sergio1106sea
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

0
sergio1106sea 
Fragesteller
 07.04.2022, 17:25
@xxxcyberxxx

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.

0