Autorské riešenie
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). 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.
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:
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:
|
|||||||||||||||||
© Univerzita Pavla Jozefa Šafárika v Košiciach, Prírodovedecká fakulta, Ústav informatiky palmaj (zavinac) upjs.sk |