Autorské riešenie
Riešenie tejto úlohy je založené na počiatočnej analýze tvaru rodokruhu, ktorý je popísaný a znázornený v zadaní. Obrázok rodokruhu je zložený zo zadaného počtu kružníc (generácií), ktoré spĺňajú dve podmienky:
Počet lúčov, ktoré rozdeľujú jednotlivé medzikružia je v každej ďalšej generácii dvojnásobný (to znamená, že jednému potomkovi v prvej generácií prislúchajú dvaja rodičia v druhej generácii, štyria starí rodičia v tretej generácií, 8 parodičov, 16 praprarodičov, 32 prapraprarodičov a tak ďalej). Každý šikovný programátor dokáže takéto kružnice vykresliť. Vykresľovanie čiar už vyzerá byť náročnejšie. Riešenie nám môže uľahčiť postup, pri ktorom postupne prekresľujeme kruhy od najväčšieho po najmenší, pričom pri každom kruhu ho rozdelíme príslušným počtom lúčov (lúč je úsečka vedená od stredu kruhu po bod na jeho obvode). Počet lúčov pri najväčšom kruhu bude rovný n-1-tej mocnine čísla 2, ak vstupom je n generácií. Pri kreslení menšieho kruhu tak ostanú viditeľné len tie časti lúčov, ktoré zodpovedajú príslušnej generácii (medzikružiu). Nasleduje možný zdrojový kód v jazykoch Imagine a Python ;Imagine
logo
viem kresliLuce :dlzka :pocet opakuj :pocet [ do :polomer vz :polomer vp 360 / :pocet ] koniec viem kresli :pocetGeneracii nechFP "cierna nechFV "biela pd urobTu "polomer :pocetGeneracii * 50 urobTu "pocetCasti 1 opakuj :pocetGeneracii - 1 [ urobTu "pocetCasti :pocetCasti * 2 ] opakuj :pocetGeneracii [ kruh 2 * :polomer ak :pocetCasti > 1 [ kresliLuce :polomer :pocetCasti ] urobTu "pocetCasti :pocetCasti / 2 urobTu "polomer :polomer - 50 ] koniec #Python import turtle def kresli_luce(dlzka, pocet): for i in range(pocet): pero.forward(dlzka) pero.backward(dlzka) pero.right(360 / pocet) def rodokruh(pocet_generacii): polomer = pocet_generacii * 50 pocet_casti = 2 ** (pocet_generacii - 1) for i in range(pocet_generacii): pero.dot(2 * polomer, 'black') pero.dot(2 * polomer - 2, 'white') if pocet_casti > 1: kresli_luce(polomer, pocet_casti) pocet_casti = pocet_casti // 2 polomer = polomer - 50 pero = turtle.Turtle() plocha = turtle.Screen() rodokruh(5) plocha.mainloop() Vaše zaujímavé riešenia a najčastejšie chyby Úlohu riešilo 29 tímov, 9 z nich v jazyku Imagine a 20 v jazyku Python. Väčšina riešení v jazyku Imagine používalo vykreslenie zadaného počtu sústredných kružníc. Po vykreslení jednotlivých kružníc, korytnačka počas cesty po príslušnej kružnici vykresľovala úsečky, ktoré oddeľujú časti medzikružia. Vyskytlo sa aj jedno správne riešenie, v ktorom boli použité kruhy a lúče. Najčastejšie chyby v jazyku Imagine boli spôsobené zlým vykresľovaním kružníc, rôznymi stredmi kružníc, vykreslením nesprávneho počtu úsečiek. V jazyku Python riešitelia často používali funkciu circle() v module turtle. Dve riešenia vykresľovali rodokruh aj pomocou modulu tkinter. Väčšina riešení v jazyku Python bola správna. Objavili sa len občasné chyby pri nesprávnom určení počtu častí v jednotlivých generáciách, napríklad rozdelenie medzikruží na 1, 2, 4, 6, a 8 častí.
|
||||||||||
© Univerzita Pavla Jozefa Šafárika v Košiciach, Prírodovedecká fakulta, Ústav informatiky palmaj (zavinac) upjs.sk |