Autorské riešenie
Skôr než začneme programovať, poďme sa poriadne pozrieť na to, ako sa kódujú čísla do obdĺžnikov. V zadaní je ukážka dvoch čísiel: 152 a -35. Z ukážok vieme, že:
Z ukážok nevieme, ako sa zobrazí cifra 0. Z textu "Šírka obdĺžnikov zodpovedala číslam, ktoré reprezentujú jednotlivé cifry čísla." môžeme dedukovať, že cifra 0 sa zobrazí ako obdĺžnik s "nulovou" šírkou. Čísla 150023 alebo -12300 by sa teda mohli zobraziť nasledovne:
Každej cifra teda zodpovedná jedna hrubá čiarka v obrázku. Poslednou otázkou ostáva, ako sa zobrazí samotné číslo 0. Odpoveď ale už máme. Šírka obdĺžnika zodpovedá cifre. Teda bude "nulová".
Keď sme si ujasnili, ako sa čísla kódujú do obrázkov, poďme sa pozrieť ako takéto vykresľovanie obrázkov naprogramovať. Podľa pokynov by bodka v čísle mala byť tam, kde bolo na začiatku umiestnené kresliace pero. Bolo by teda rozumné, vykresľovať obdĺžnikový kód čísla od bodky. Pri bodke sa nachádzajú obdĺžniky pre koncové cifry čísla. Cifry čísla teda budeme spracovávať odzadu. Myšlienka vykresľovania obdĺžnikového kódu čísla môže byť nasledovná:
# Python import turtle def kresli_obdlznik(vyska, sirka): pero.forward(vyska) pero.right(90) pero.forward(sirka) pero.right(90) pero.width(4) pero.forward(vyska) pero.right(90) pero.width(1) pero.forward(sirka) pero.right(90) def kresli_cislo(cislo, zvacsenie): if cislo < 0: znamienko = -1 else: znamienko = 1 cislo = abs(cislo) predchadzajuca_cifra = 10 pocet_posunov = 0 if cislo == 0: kresli_obdlznik(zvacsenie, 0) else: while cislo > 0: aktualna_cifra = cislo % 10 if aktualna_cifra >= predchadzajuca_cifra: pero.forward(zvacsenie) pocet_posunov += 1 kresli_obdlznik(zvacsenie, znamienko * zvacsenie * aktualna_cifra) predchadzajuca_cifra = aktualna_cifra cislo = cislo // 10 pero.backward(pocet_posunov * zvacsenie) pero.dot(10) plocha = turtle.Screen() pero = turtle.Turtle() pero.left(90) kresli_cislo(-12300, 20) plocha.mainloop() Všimnime si, ako sme vyriešili kreslenie obdĺžnikov vpravo alebo vľavo. Na kreslenie obdĺžnika sme definovali funkciu kresli_obdlznik() Ak bolo číslo kladné, voláme ju s dĺžkami strán. Ak bolo číslo záporné, pošleme jej zápornú šírku. Namiesto pohybu dopredu sa tak pero pohne vzad. Vo funkcii kresli_cislo() sme definovali parameter navyše - zvacsenie. Jeho zmenou môžeme kresliť rôzne veľké obrázkové kódy čísel. Vo funkcii kresli_cislo() sme špeciálne ošetrili prípad, ak zadané číslo je 0. Číslo 0 má jednu cifru a mal by sa teda vykresliť jeden obdĺžnik. Podmienka v cykle while by to neumožnila. Dobrým zvykom pri kreslení je, aby grafické pero skončilo v rovnakej pozícii ako bolo na začiatku. Pri kreslení jedného obdĺžnika tomu tak je. Keďže obdĺžniky kreslíme v niekoľkých radoch, počítame si, koľko krát sme sa perom posunuli do vyššieho radu. Po vykreslení všetkých obdĺžnikov sa s perom vrátime do východiskovej pozície. Vaše zaujímavé riešenia a najčastejšie chyby Vačšina z vás na túto úlohu išla správne. V riešeniach ste však mali drobné nedostatky. Zabudli ste kresliť bodku alebo zvýrazniť jednu stranu obdĺžnika. Niektorým z vás robila problém cifra 0, ktorú ste vykreslovali v samostanom obdĺžniku, pričom sa dala vykresliť v tom istom riadku ako obdĺžniky iných cifier. |
||||||||||
© Univerzita Pavla Jozefa Šafárika v Košiciach, Prírodovedecká fakulta, Ústav informatiky palmaj (zavinac) upjs.sk |