Choinka w pythonie - pomoc w błędzie kodu

0

Zadanie hobbistyczne, tak jak moja zabawa z Pythonem.
Chcę narysować choinkę. Znalazłem w sieci kod, który zmodyfikowałem.

m=4
n=1

for i in range(1,5):
    print( m* " " +"#"*n)
    m=m-1
    n=n+2

Program rysuje trójkąt. Problem pojawia się, gdy tworzę drzewko składające się z kilku elementów.
Na początku umieszczam instrukcję, której zadaniem jest powtórzenie zagnieżdżonej pętli „for i in range (1,5):” trzy razy


m=4
n=1

for j in range (3):
    for i in range(1,5):
        print( m* " " +"#"*n)
        m=m-1
        n=n+2

Dla połówki trójkąta kod działa:


for i in range (3):
    for j in range (1,5):
        print(j*"#")

Z góry dziękuję za wszelką pomoc.

2

Czy mógłbyś w paintcie lub notatniku narysować jaki efekt chcesz uzyskać?
Nie wiem co kryje się pod słowem "choinka"

3

Po narysowaniu choinki w zeszycie policz ile jest znaków w kolejnych rzędach (spacji i gwiazdek/hashy).
Następnie skonfrontuj wyniki z kodem.

1

Domyślam się że chcesz narysować 3 razy to samo?
Jeśli tak to problem polega u Ciebie na tym że nie ustawiasz zmiennej m i n na początkowe wartości za każdym razem.
Coś takiego? Nie jestem pewien, bo tak jak pisały inne osoby, nie wiemy jaki chcesz uzyskać wynik.

for j in range (3):
    m=4
    n=1

    for i in range(1,5):
        print( m* " " +"#"*n)
        m=m-1
        n=n+2
2

Lepiej jakby zaczął od rysowania jednej choinki definiując na to funkcję:

def print_pine(size, fill='#'):
    for i in range(size):
        print(' ' * (size - i - 1) + fill * (2 * i + 1))
    
for j in range (3):
    print_pine(3)

pisanie monolitycznego kodu jest plagą, a czym skorupka za młodu nasiąknie, ... .

0

Dziękuję serdecznie za rady. @MarekR22 do funkcji w Pythonie jeszcze nie doszedłem, a zajmuje się nim hobbistycznie, od czasu do czasu. Dlatego pomimo długiego czasu na forum, jestem nadal początkujący.

W PyScripter 4.0.0 i Pythonie 3.9 kod @Arthan wykonuje się prawidłowo, dając w efekcie pożądany efekt. Gdy jednak uruchamiam go na stronie https://www.onlinegdb.com/online_python_interpreter
Pojawia się komunikat, którego nie rozumiem:




                            Online Python Interpreter.
                Code, Compile, Run and Debug python program online.
Write your code in this editor and press "Run" button to execute it.

for j in range (3):
    m=4
    n=1

    for i in range(1,5):
        print( m* " " +"#"*n)
        m=m-1
        n=n+2

File "main.py", line 15
n=n+2
^
SyntaxError: EOF while scanning triple-quoted string literal

Pozdrawiam

0

Jeszcze jedno pytanie. W sieci znalazłem takie zadanie: napisać kod, który narysuje połowę choinki złożonej z 3 trójkątów, a kolejny trójkąt będzie miał podstawę o +1 dłuższą niż poprzedni. Zadanie można rozwiązać przez użycie 3 pętli for. "Lepsze" rozwiązanie problemu znalazłem sam. Chodziło o zwiększanie zakresu pętli for o jeden w każdej iteracji pętli, tak by zmniejszyć liczbę pętli do minimum . Nie potrafiłem jednak zapisać tego w kodzie Pythona. nie wiedziałem, że można zastosować taki zapis in range(liczba, zmienna), operowałem na liczbach. Dlatego posiłkowałem się kodem znalezionym w sieci.
Od siebie dołożyłem jeszcze jeden warunek: wyświetlać choinkę złożoną z n trójkątów, gdzie n jest liczbą podaną przez użytkownika.

W trakcie eksperymentowania z kodem z sieci (instrukcja input +pierwsza pętla for moje), zauważyłem pewną prawidłowość

Przy takim kodzie:



liczba_segmentow_choinki=int(input("podaj liczbe segmentow choinki"))

m=3
for i in range (liczba_segmentow_choinki):
    for j in range (1,m):
        print(j*"#")
        m=m+1

Przykładowo podaje 3 na liczba_segmentow_choinki
Przy takim zapisie program wyświetla 3 trójkąty, pierwszy o wysokości 2 , drugi 4, trzeci 8 "haszy"
Wygląda to jak jakiś ciąg geometryczny
Przy poniższym kodzie, osiągam wynik zamierzony, czyli 3 trójkąty pierwszy o wysokości 2, drugi 3, trzeci 4 "haszy"


liczba_segmentow_choinki=int(input("podaj liczbe segmentow choinki"))

m=3
for i in range (liczba_segmentow_choinki):
    for j in range (1,m):
        print(j*"#")
    m=m+1

Różnica związana jest chyba z tym fragmentem kodu:


for j in range (1,m):                        
        print(j*"#")                                
m=m+1                                             

for i m takie samo wcięcie

for j in range (1,m):
    print(j*"#")
    m=m+1

instrukcja przypisana m=m+1 równa z wcięciem print

Skąd się bierze taka różnica w wyświetlaniu trójkątów ?
Dziękuje z góry za każde wyjaśnienie problemu.

0

Naucz się używać breakpointów lub jeśli środowisko, w którym pracujesz nie obsługuje breakpointów to postaraj się prześledzić co się dzieje w kodzie w każdej iteracji pętli. Możesz sobie ułatwić wyświetlając wartość zmiennej m, tuż po tym jak ją zmieniasz w obu przypadkach.
Każdy segment ma wysokość m-1 (tak działa range). Tylko, że w pierwszym przykładzie za każdym razem gdy wyświetlasz wiersz gwiazdek dodajesz 1 do m. Czyli po pierwszym bloku m = 5, po drugim m = 9 itd.
W drugim przykładzie m zwiększasz nie po narysowaniu pojedynczego wiersza, a całego bloku, więc po pierwszym bloku m = 4, po drugim m = 5 itd.

1 użytkowników online, w tym zalogowanych: 0, gości: 1