Autorské riešenie
[stiahni py]

  • Počet riešiteľov: 16/18 = 88,89 %

  • Úspešnosť riešenia: 4,31 / 5 = 86,25 %

Pri riešení tejto grafickej úlohy si pomôžeme náčrtom obrázka. Parazól pozostáva z hornej časti (striešky) a dolnej časti (rúčky).

Parazól s počiatkom a koncom vykresľovania

Strieška pozostáva z radu polkružníc v jej dolnej časti a veľkej polkružnice v jej hornej časti. Rúčka pozostáva z úsečky a polkružnice.

Na vykresľovanie polkružníc použijeme príkaz circle s dvomi parametrami. Prvý parameter reprezentuje polomer kružnicového oblúku a druhý parameter uhol kružnicového oblúku. Ak je hodnota prvého parametra kladná, kreslíme kružnicový oblúk ľavotočivo. Ak je záporná, kreslíme oblúk pravotočivo. Ak je hodnota druhého parametra kladná, kreslíme smerom vpred. Ak je záporná, kreslíme smerom vzad. Pre lepší prehľad uvedené informácie zobrazíme aj v tabuľke, pričom počiatok kreslenia je označený červenou korytnačkou a koniec kreslenia zelenou korytnačkou.

circle(20, 180) circle(20, -180) circle(-20, 180) circle(-20, -180)

Striešku parazóla vykrelíme sprava doľava ako rad ľavotočivých polkružníc a veľkej pravotočivej polkružnice (funkcia vrch_parazola). Rúčku vykreslíme vzad ako úsečku a ľavotočivú polkružnicu (funkcia spodok_parazola). Celý parazol vykreslíme natočením sa o zadaný  úhol, presunutím sa na pravú stranu striešky, vykreslením striešky a rúčky parazóla (funkcia parazol). Celé kreslenie ukončíme v rovnakom bode, z ktorého sme začali kresliť. 

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


def vrch_parazola(pocet, polomer):
    pero.pendown()
    for i in range(pocet):
        pero.circle(polomer, 180)
        pero.left(180)
    pero.circle(-pocet * polomer, 180)
    pero.penup()
    pero.right(90)
    pero.forward(pocet * polomer)
    pero.right(90)


def spodok_parazola(dlzka, polomer):
    pero.pendown()
    pero.forward(-dlzka)
    pero.circle(polomer, -180)
    pero.circle(polomer, 180)
    pero.forward(dlzka)
    pero.penup()


def parazol(pocet, polomer, uhol):
    pero.left(uhol)
    pero.forward(pocet * polomer)
    pero.left(90)
    vrch_parazola(pocet, polomer)
    spodok_parazola(pocet * polomer, polomer)


tabula = turtle.Screen()
pero = turtle.Turtle()
pero.width(2)
pero.penup()
pero.hideturtle()

parazol(8, 15, 15)

tabula.mainloop()

Pri vykresľovaní vrchu parazóĺa môžeme namiesto príkazu pero.left(180) použiť príkaz pero.circle(-polomer, -180) a zmeniť počet opakovaní cyklu fro na polovicu, t. j. pocet // 2.

Táto úloha je zameraná na: 

  • použitie rôznych stratégii riešenia problémov (dekompozície problému na podproblémy, vykreslenie obrázka),

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

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 až 10 tímov (bobuxáci, Doma, File-Open, GLSTN BOYZ, Krvorion, Master, mk-234, Oliver Seman,  ShadowProgramers a symtax-error), ktorým gratulujeme.

Súťažiaci vykresľovali časti parazóla rôznym spôsobom a poradí. Niektorí začali strieškou, iní rúčkou parazóla; niektorí kreslili spodok striešky naraz, iní na dvakrát; niektorí kreslili jedným ťahom; niektorí sa na konci kreslenia vrátili do počiatku vykresľovania. Vo väčšine riešení súťažiaci použili len kreslenie ľavotočivých polkružníc. Len 6 tímov použilo vo svojich riešeniach komentáre (byg, File-Open, GLSTN BOYZ, GLŠTN masters, HFD, Master a Oliver Seman), 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 parazóla - vykreslenie rúčky parazóla na opačnú stranu, nepoužitie funkcie circle a použitie málo presnej hodnoty 3.14,

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

  • namiesto požadovaných vstupných parametrov použitie náhody,

  • použitie modulu tkinter namiesto modulu turtle, ktorý je vhodnejší na riešenie tejto grafickej úlohy,

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