Autorské riešenie
[stiahni imp : py]

  • Počet riešiteľov: 24 / 31 =  77 %                       

  • Úspešnosť riešenia: 2,92 / 4 = 73%                   

Úlohou bolo vytvoriť takú procedúru, ktorej keď zadám do vstupu (prirodzené) číslo, tak vykreslí strom podľa predpísaných požiadaviek s daným počtom vetvičiek. Dôležité teda bolo definovať si nejaký vstupný parameter pre našu procedúru. My sme použili premennú s názvom pocetVetiev.

Samotné kreslenie je potom možné rozdeliť do dvoch fáz: kreslenie kmeňa stromu a kreslenie vetvičiek. Niektorí z riešiteľov si nevšimli, že kmeň je za vetvičkami schovaný, čo spôsobilo, že stratili bod. Pozrime sa teda na tieto dve fázy postupne:

Kmeň stromu

  Pri kreslení kmeňa je dôležité správne určiť jeho dĺžku. Medzi každými dvoma vetvičkami je 30 krokov a v časti pod poslednou vetvičkou je 60 krokov. Výšku kmeňa teda vieme ľahko vypočítať ako: (pocetVetiev*30)+30. Zo zadania bolo dané, že hrúbka pera má byť nastavená na 10 a farba pera na hnedú. Kód na vykreslenia kmeňa by teda mohol vyzerať nasledovne:

;Imagine logo
viem kresliStrom :pocetVetiev
  nechfp "hneda
  nechhp 10
  do (pocetVetiev*30)+30
koniec

 

#Python
def kresliStrom(pocetVetiev):
    turtle.pendown()
    turtle.pensize(10)
    turtle.left(90)
    turtle.color('brown')
    turtle.forward(30 + 30 * pocetVetiev)

Keď máme nakreslený strom, môžeme sa pustiť do kreslenia vetvičiek. Na nakreslenie vetvičky zadanej dĺžky sme si vytvorili pomocnu proceduru vetva. V tejto procedúre sa nastaví farba pera korytnačky na zelenú, následne korytnačka nakreslí jednu časť vetvy a hneď za tým druhú časť vetvy. Obe časti vetvy majú rovnaký uhol medzi vetvou a kmeňom. Na veľkosti zvoleného uhla nezáležalo. My sme si zvolili 60 stupňový uhol. Procedúra na kreslenie vetvy zadanej dĺžky by mohla vyzerať takto:

;Imagine logo
viem vetva :dlzkaVetvy
  nechfp "zelena
  pd
  vl 120
  do :dlzkaVetvy
  do -:dlzkaVetvy
  vp 240
  do :dlzkaVetvy
  do -:dlzkaVetvy
  vl 120
koniec

 

#Python
def vetva(dlzkaVetvy):
    turtle.pendown()
    turtle.color('green')
    turtle.left(120)
    turtle.forward(dlzkaVetvy)
    turtle.backward(dlzkaVetvy)
    turtle.right(240)
    turtle.forward(dlzkaVetvy)
    turtle.backward(dlzkaVetvy)
    turtle.left(120)
 

Teraz už len potrebujeme zakomponovať rpocedúru na kreslenie vetiev do procedúry kresliStrom, ktorá nám zatiaľ vykreslila iba kmeň. V prvom rade si vytvoríme premennú, v ktorej si budeme pamätať, akú dlhú vetvičku máma nakresliť. Veľkosť vetvičky sa zvyšuje o 5 krokov smerom k dolným vetvičkám. Teda nižšia vetva je o 5 krokov dlhšia ako jej horná suseda. My sme si zvolili premennú dlzkaVetvy, do ktorej si na začiatku uložím číslo 30 - keďže najvrchnejšia vetva má mať dĺžku 30 krokov.

Teraz použijem príkaz opakuj,pretože potrebujem nakresliť vetvičku presne toľko krát, koľko mi udáva číslo v premennej pocetVetiev. V každej iterácii cyklu nakreslím vetvu (pomocou porcedúry vetva) s dĺžkou, ktorú mám aktuálne uloženú v premennej dlzkaVetvy a potom zvýšim číslo v premennej dlzkaVetvy o 5 krokov. Celá procedúra kresliStrom potom vyzerá nasledovne.

;Imagine logo
viem strom :pocetVetiev
  znovu
  pd
  nechFarbaPera "hneda
  nechhp 10
  do 30*:pocetVetiev
  do 30
  urobTu "dlzkaVetvy 30
  opakuj :pocetVetiev [
    vetva :dlzkaVetvy
    ph
    do -30
    urobTu "dlzkaVetvy :dlzkaVetvy+5
   ]
koniec

 

#Python
def kresliStrom(pocetVetiev):
    turtle.pendown()
    turtle.pensize(10)
    turtle.left(90)
    turtle.color('brown')
    turtle.forward(30 + 30 * pocetVetiev)
    dlzkaVetvy = 30
    for i in range(0, pocetVetiev):
        vetva(dlzkaVetvy)
        turtle.penup()
        turtle.backward(30)
        dlzkaVetvy = dlzkaVetvy + 5
 

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

Najčastejšie sa stávalo, že riešitelia nakreslili kmeň stromu tak, že čiastočne alebo úplne prekrýval vetvičky. Tiež sa objavilo niekoľko nepozorností pri práci s dĺžkami kmeňa, či vetiev.

Zaujímavé riešenie zvolil jeden z tímov, ktorý sa vybral cestou rekurzívneho prístupu.