Autorské riešenie
Riešenie úlohy môžeme rozdeliť na dve časti:
Poďme najprv vyriešiť zjednodušenú verziu prvej podúlohy - vykreslenie jednofarebných dielikov teplomera s hodnotami teplót od 34.0 °C do 42.0 °C s krokom 0.1 °C so zadanou dĺžkou vykreslených dielikov a zadaným rozstupom medzi dielikmi. Pri vykresľovaní dielikov od dolnej po hornú hranicu teploty, si treba uvedomiť, že vykreslíme spolu horná - dolná + 1 dielikov. Je to podobne ako pri počítaní prstov od prveho po piaty prst, že počet medzier medzi prstami je 5 - 1, ale počtov prstov je o jeden viac ako počtu medzier medzi prstami, t. j. (5 - 1) + 1 = 5. Procedúra kresliDieliky0 v jazyku Imagine Logo môže vyzerať nasledovne: ;Imagine Logo A funkcia kresliDieliky0 v jazyku Python môže vyzerať, napr. takto: # Python V zadaní úlohy máme však vykresliť farebné dieliky s farbou závislou od hodnoty. V riešení tejto prvej podúlohy do cyklu vložíme príkaz vetvenia. V riešení jazyka Imagine Logo doplníme tri do seba vnorené príkazy ak2. V riešení jazyka Python doplníme príkaz viacnásobného vetvenie pomocou konštrukcie if - elif - else. Procedúra kresliDieliky v jazyku Imagine Logo môže vyzerať nasledovne: ;Imagine Logo Funkcia kresliDieliky v jazyku Python môže vyzerať, napr. takto: # Python def kresliDieliky(dlzka, rozstup): ''' Vykresli dieliky teplomera od 34.0 do 42.0 stupnov so zadanou dlzkou :param dlzka: dlzka ciary dielika teplomera :type dlzka: float :param rozstup: dlzka rozstupu medzi ciarami dielikov teplomera :type rozstup: float :rtype: None ''' for t in range(340, 420 + 1): if t > 385: #horúčka kor.color('red') elif t > 370: #zvýšená teplota kor.color('orange') elif t > 360: #normálna teplota kor.color('yellow') else: #podchladenie kor.color('green') kor.down() kor.forward(dlzka) kor.forward(-dlzka) kor.up() kor.right(90) kor.forward(rozstup) kor.right(-90) kor.right(-90) kor.forward((420 - 340 + 1) * rozstup) kor.right(90) Druhá podúloha je celkom ľahká, potrebujeme sa presunúť na hodnoty hraničných teplôt a vypísať ich na obrazovku. Pritom si musíme uvedomiť rozdiel medzi jazykmi Imagine Logo a Python, lebo v Imagine Logo korytnačka je štandardne nasmerovaná na sever a výpis hodnôt do plochy je pod korytnačkou. V jazyku Python je korytnačka štandardne nasmerovaná na východ a výpis hodnôt do plochy je nad korytnačkou. Procedúra kresliCisla v jazyku Imagine Logo môže vyzerať nasledovne: ;Imagine Logo Funkcia kresliCisla v jazyku Python môže vyzerať, napr. takto: # Python def kresliCisla(dlzka, rozstup): ''' Vypise hranicne teploty 34.0, 36.0, 37.0 a 38.5 stupna na poziciu 30% dlzky dielika teplomera :param dlzka: dlzka ciary dielika teplomera :type dlzka: float :param rozstup: dlzka rozstupu medzi ciarami dielikov teplomera :type rozstup: float :rtype: None ''' kor.up() kor.color('black') kor.forward(dlzka / 2) kor.write(34.0) kor.right(90) kor.forward((360 - 340) * rozstup) kor.right(-90) kor.write(36.0) kor.right(90) kor.forward((370 - 360) * rozstup) kor.right(-90) kor.write(37.0) kor.right(90) kor.forward((385 - 370) * rozstup) kor.right(-90) kor.write(38.5) kor.right(-90) kor.forward((385 - 340) * rozstup) kor.right(90) kor.forward(-dlzka / 2) Napokon v jazyku Imagine Logo napíšeme procedúru kresli, ktorá vyvolá procedúry kresliDieliky a kresliCisla: ;Imagine Logo V jazyku Python na začiatku výsledného programu importujeme modul turtle, doplníme funkciu kresli bez výstupov, ktorá vyvolá funkcie kresliDieliky, kresliCisla: # Python import turtle kor = turtle.Turtle() plocha = turtle.Screen() def kresliDieliky(dlzka, rozstup): ... def kresliCisla(dlzka, rozstup): ... def kresli(dlzka, rozstup): ''' Nakresli stupnicu teplomera aj s vyznacenim hranicnych hodnot. :param dlzka: dlzka ciary dielika teplomera :type dlzka: float :param rozstup: dlzka rozstupu medzi ciarami dielikov teplomera :type rozstup: float :rtype: None ''' kresliDieliky(dlzka, rozstup) kresliCisla(dlzka, rozstup) kor.speed(0) kor.left(90) kor.hideturtle() kresli(50, 4) plocha.mainloop() Táto súťažná úloha je zameraná na použitie stratégie riešenia problému rozdelenie problému do podproblémov, na prácu s procedúrami (resp. funkciami bez výstupov) s parametrami, príkazmi opakovania a viacnásobného vetvenia, príkazmi korytnačej grafiky, na presný výpočet počtu dielikov na základe počtu hodnôt hraničných teplôt. Vaše zaujímavé riešenia a najčastejšie chyby Do riešenia tejto úlohy pre kategóriu PROFÍK sa zapojilo 28 z 38 prihlásených tímov. Všetkých 28 tímov riešilo úlohu v jazyku Imagine Logo. Jazyk Python si nevybral na riešenie žiaden tím. Celkový priemer úspešnosti odovzdaných riešení bol 3,2 bodu z maximálneho počtu 6 bodov (53,0% úspešnosť). V riešeniach sme zaregistrovali nasledovné nedostatky:
Štyri tímy z kategórie expert, ktoré riešili túto úlohu si nevšimli, že úloha je určená len pre kategóriu profík. Podľa pravidiel súťaže sme im nemohli za túto úlohu udeliť žiaden bod. |
||||||||||
© Univerzita Pavla Jozefa Šafárika v Košiciach, Prírodovedecká fakulta, Ústav informatiky palmaj (zavinac) upjs.sk |