Autorské riešenie
Cieľom úlohy je vykresliť obláčik podľa nasledovných pravidiel:
V tele funkcie stačí použiť 1 cyklus s pevným počtom opakovaní. Počet opakovaní určuje počet kruhov v obláčiku. V každom opakovaní cyklu potrebujeme vo vhodnom rozsahu náhodne vygenerovať polomer kruhu a rozostup medzi 2 kruhmi. Pre náhodné generovanie čísiel môžeme použiť funkciu b>random.randint() alebo random.uniform(). Kruhu nastavíme farbu a vykreslíme ho. Keďže s určitosťou vieme, že minimálny polomer kruhu má byť 10 a maximálny je zadaný v parametri funkcie (napr. max_polomer), môžeme to zapísať ako random.randint(10, max_polomer). Máme vypočítaný polomer nového kruhu, ktorý chceme vykresliť. Teraz potrebujeme vypočítať vzdialenosť, o ktorú sa musí korytnačka posunúť tak, aby sa nový kruh s predošlým čiastočne prekrývali. Rozsah pre náhodné generovanie rozostupu vieme určiť nasledovne. Minimálnou hodnotou bude rozdiel medzi polomerom starého a nového kruhu v absolútnej hodnote. K tomu ešte pripočítame 1 pre prípad, keby boli polomery rovnaké (aby sa kruhy úplne neprekrývali). Maximálnou hodnotou bude súčet polomerov starého a nového kruhu. Od toho ešte odpočítame 1 preto, aby sa kruhy nedotýkali, ale prekrývali. Zápis bude vyzerať takto: random.randint(abs(stary_polomer-novy_polomer)+1, stary_polomer+novy_polomer-1).
Ostalo nám už len vyriešiť striedanie 2 rôznych farieb kruhov. Ako pomocné počítadlo môžeme využiť premennú i z cyklu. Za pomoci operácie % zistíme, či je poradie vykresľovaného obláčika párne alebo nepárne. Ak je párne, vykreslí sa obláčik vo farbe1 (napr. modrá), ak je nepárne, vykreslí sa obláčik vo farbe2 (napr. sivá). Riešenie úlohy v jazyku Python môže vyzerať nasledovne: #Python def kresli_oblacik(pocet, max_polomer): stary_polomer = 10 for i in range(pocet): novy_polomer = random.randint(10, max_polomer) posun = random.randint(abs(stary_polomer-novy_polomer)+1, stary_polomer+novy_polomer-1) pero.forward(posun) if i % 2 == 0: pero.dot(novy_polomer * 2, 'skyblue') else: pero.dot(novy_polomer * 2, 'lightgrey') stary_polomer = novy_polomer Vaše zaujímavé riešenia a najčastejšie chyby Plný počet bodov za riešenie tejto úlohy získalo 11 tímov. V súťažných riešeniach sa kruhy vykresľovali nie len pomocou funkcie turtle.dot(), ale aj pomocou funkcie turtle.circle() či canvas.create_oval(). Častou chybou bola mylná predstava o vstupných parametroch týchto funkcií. Zatiaľ čo pre funkciu circle() je vstupným parametrom polomer kruhu, pre funkciu dot() to je priemer kruhu. Najčastejšou chybou bolo určenie nesprávneho rozsahu čísel pre generovanie náhodného rozostupu medzi 2 susednými kruhmi. Niektoré kruhy sa preto buď úplne prekrývali, alebo vôbec neprekrývali. Medzi zaujímavé riešenia patrilo aj náhodné generovanie 2 rôznych farieb kruhov, vďaka čomu sa pri každom spustení programu vykreslil zaujímavý, pestrofarebný obláčik :) |
||||||||||
© Univerzita Pavla Jozefa Šafárika v Košiciach, Prírodovedecká fakulta, Ústav informatiky palmaj (zavinac) upjs.sk |