Autorské riešenie
[stiahni py]

  • Počet riešiteľov: 16/17 = 94 %

  • Úspešnosť riešenia: 4,11 / 5 = 82,19 %

Rovnako ako pri iných grafických úlohách aj pri tejto je veľmi dôležité začať riešenie náčrtom obrázku s vyznačením jeho vybraných rozmerov.

Podľa zadania každé poschodie tvorí rovnoramenný lichobežník, ktorého dolná základňa je o dĺžku bočného ramena dlhšia ako horná základňa. Dĺžky dotýkajúcich sa základní susedných lichobežníkov sa líšia o polovicu dĺžky bočného ramena lichobežníka.

Strom s pomocnými čiarami

Problém vykreslenia celého stromčeka si rozdelíme na viaceré podproblémy:

  • vykreslenie jedného lichobežníka,

  • presun pera na ďalšie poschodie,

  • návrat pera do počiatku vykresľovania.

Stromček môžeme vykresľovať zhora nadol aj zdola nahor. Vyberieme si vykresľovanie zhora nadol. Na vykreslenie každého poschodia použijeme funkciu kresli_obdlznik, vykresľujúcu (v smere otáčania hodinových ručičiek) rovnoramenný lichobežník so zadanou dĺžkou hornej a dolnej základne a bočných ramien. Vrchný trojuholník vykreslíme tiež pomocou tejto funkcie, ak nastavíme nulovú dĺžku hornej základne lichobežníka.

Na presunutie pera na pozíciu lichobežníka na nižšom podlaží (označenú na obrázku odtlačeným červeným tvarom pera) použijeme funkciu posun_dole.

Na presunutie pera na počiatočnú pozíciu kreslenia stromčeka (označenú na obrázku odtlačeným čiernym tvarom pera) použijeme funkciu posun_nahor.

Celý stromček vykreslíme pomocou funkcie kresli_stromcek, v ktorej pred cyklom nastavíme nulovú dĺžku hornej základne a v cykle pre každé poschodie vykreslíme rovnoramenný lichobežník so zväčšujúcimi sa dĺžkami oboch jeho základní a posunieme pero na nižšie poschodie. Na konci presunieme pero na počiatočnú pozíciu kreslenia. 

Výsledné riešenie úlohy zapísané v programovacom jazyku Python môže vyzerať nasledovne:
import turtle


def kresli_lichobeznik(horna_zakladna, dolna_zakladna, rameno):
    ''' Vykreslí rovnoramenný lichobežník so zadanými dĺžkami
    hornej a dolnej základne a ramena '''
    pero.forward(horna_zakladna)
    pero.right(60)
    pero.forward(rameno)
    pero.right(120)
    pero.forward(dolna_zakladna)
    pero.right(120)
    pero.forward(rameno)
    pero.right(60)


def posun_dole(rameno):
    ''' Presunie pero na pozíciu kreslenia nižšieho lichobežníka '''
    pero.left(60)
    pero.forward(-rameno)
    pero.right(60)
    pero.forward(rameno / 4)


def posun_nahor(pocet_poschodi, rameno):
    ''' Presunie pero na počiatočnú pozíciu kreslenia '''
    for poschodie in range(pocet_poschodi):
        pero.forward(-rameno / 4)
        pero.left(60)
        pero.forward(rameno)
        pero.right(60)


def kresli_stromcek(pocet_poschodi, rameno):
    ''' Vykreslí stromček so zadaným počtom poschodí a dĺžkou ramena '''
    horna_zakladna = 0
    for podlazie in range(pocet_poschodi):
        kresli_lichobeznik(horna_zakladna, horna_zakladna + rameno, rameno)
        horna_zakladna = horna_zakladna + rameno / 2
        posun_dole(rameno)
    posun_nahor(pocet_poschodi, rameno)


tabula = turtle.Screen()
pero = turtle.Turtle()
kresli_stromcek(5, 70)
tabula.mainloop()

Ďalšie riešenia úlohy vykresľujúce stromček zdola nahor môžu využívať:

  • vykresľovanie lichobežníkov zo stredu ich dolnej základne,

  • vykresľovanie rovnostranných trojuholníkov vyplnených bielou farbou.

Táto úloha je zameraná na: 

  • použitie viacerých stratégii riešenia problémov (dekompozície problému na podproblémy, vykreslenie obrázka, použitie pomocného prvku),

  • precvičenie príkazov opakovania, volania funkcií s parametrami, príkazov korytnačej grafiky.

  • použitie matematických výpočtov s uhlami a dĺžkami rovinných útvarov.

Vaše zaujímavé riešenia a najčastejšie chyby

Do riešenia tejto úlohy sa zapojilo 16 tímov z  kategórie EXPERT.  Plný počet bodov dosiahlo 6 tímov (bobuxáci, Doma, File-Open, HFD, Master a ShadowProgramers), ktorým gratulujeme.

9 tímov vykresľovalo stromček zhora a 7 tímov zdola. Korytnačiu grafiku (modeul turtle) použilo 13 tímov a len 3 tímy použilo karteziánsku grafiku (modul tkinter). Len 3 tímy použili vo svojich riešeniach komentáre (File-Open, HFD a Predators), za čo ich chválime.

V riešeniach sme zaregistrovali nasledovné nedostatky, vychádzajúce najčastejšie z nedôslednej analýzy problému, tvorby menej efektívneho riešenia či z pretrvávajúcich programátorských zlozvykov:

  • nepresné vykresľovanie stromčeka - kreslenie trojuholníka navyše, kreslenie zbytočných čiar navyše, rôzna výška poschodí stromčeka, nezarovnanie lichobežníkov pod sebou na stred, použitie celočíselného delenia namiesto desatinného, pri kreslení použitie konštánt namiesto zadaných parametrov,

  • namiesto použitia funkcií s parametrami použitie globálnych premenných s príkazom input a funkciami bez parametrov,

  • namiesto 2 vstupných parametrov použitie 1 alebo 4 parametrov,

  • neprehľadné použitie súbežne korytnačej aj karteziánskej grafiky,

  • namiesto plnovýznamových identifikátorov premenných použitie málohovoriacich jednopísmenových identifikátorov,

  • zbytočné použitie chvostovej rekurzie, kde stačí jednoduchý cyklus.