Autorské riešenie Na vyriešenie tejto úlohy bolo potrebné zamyslieť sa nad dvoma dôležitými informáciami zo zadania:
(1) pre každý schod platí podmienka: (2) schodisko začína v ľavom dolnom rohu a končí v pravom hornom rohu miestnosti: počet schodov * šírka schodu = šírka miestnosti. Miestnosť bola zobrazená z bočného pohľadu a jej rozmery sa dali meniť pomocou textových polí uvedených na obrazovke, pričom zo zadania platí, že rozmery môžu byť maximálne 250x200 bodov, aby sa nám celá dvojposchodová budova správne zobrazila na obrazovke. Na to, aby sme vedeli pracovať s podmienkou 2 * výška schodu + šírka schodu = priemerný krok korytnačky, si najprv vypočítame priemerný krok korytnačky ako aritmetický priemer troch hodnôt uvedených v zadaní:
urobTu "muz 75
Ak už máme hodnotu priemerného kroku, potrebujeme vhodne rozvrhnúť šírku a výšku jedného schodu. Z požiadavky (2) postupne platí:
počet schodov = výška miestnosti / výška schodu. Keďže počet schodov musí byť rovnaký, tak: a teda úpravami: Ak sa teda chceme dostať z ľavého dolného rohu miestnosti do pravého horného rohu miestnosti, tak musí platiť, že pomer šírky a výšky jedného schodu sa rovná pomeru šírky a výšky celej miestnosti (aby schody neskončili príliš skoro, prípadne neskončili príliš nízko ako to vidieť na nasledujúcom obrázku). Pomer šírky a výšky miestnosti vypočítame:
urobTu "pomer sirkaMiestnosti/vyskaMiestnosti SirkaMiestnosti a vyskaMiestnosti sú názvy textových polí, v ktorých sú uložené rozmery miestnosti (podľa zadania maximálne 250x200 bodov). A teraz môžeme prejsť na najdôležitejšiu časť. Postupným dosadením do nášho vzorca dostávame
2 * výška schodu + šírka schodu = priemerný krok korytnačky, čo v jazyku korytnačiek znamená:
urobTu "vyska :priemer/(2+:pomer) Ak už máme vypočítanú výšku, tak rovnako odvodením z nášho vzorca dostávame
2 * výška schodu + šírka schodu = priemerný krok korytnačky, čo v jazyku korytnačiek znamená:
urobTu "sirka :priemer - (2*:vyska) Podarilo sa nám teda určiť také rozmery jedného schodu, ktoré vyhovujú pravidlu pri projektovaní schodiska a navyše je možné dostať sa z ľavého dolného rohu miestnosti do pravého horného rohu miestnosti. Výsledný počet schodov potom získame ľahko:
urobTu "pocetSchodov sirkaMiestnosti/:sirka Asi nás neprekvapí, že výsledok nemusí byť celé číslo. Porovnajme si napríklad výpočty:
I. prípad: Ak šírka miestnosti je 250 a výška miestnosti je 200, potom je výsledkom 10,3175 schodov. Ak by sme teda chceli dodržať všetky podmienky zadania, úloha v I. prípade nemá riešenie. V prvom prípade nemôže teda súčasne platiť podmienka pre šírku a výšku jedného schodu a zároveň platiť, aby schodisko začínalo v ľavom dolnom rohu a končilo v pravom hornom rohu. Ak by sme však pripustili, že môže existovať ešte jeden (neúplný) schod, pre ktorý už nebude platiť predpísané pravidlo 2 * výška schodu + šírka schodu = priemerný krok korytnačky, tak v riešení by sme mohli pokračovať nasledovne: Zoberieme celú časť výsledku (až teraz pri poslednom schode!), ktorú vieme získať napríklad takto:
urobTu "pocetSchodov cpodiel sirkaMiestnosti/:sirka*10 10 a neostáva nám nič iné, len rozmery posledného (neúplného) schodu dopočítať:
urobTu "sirkax SirkaMiestnosti - (:pocetSchodov*:sirka) Na záver už len vykreslíme schody pomocou cyklu opakuj podľa vypočítaného počtu schodov a posledný schod prikreslíme, ako to už môžeme vidieť v hlavnej procedúre na nakreslenie celého schodiska, ktorá môže vyzerať nasledovne: viem kresliSchodisko Vaše zaujímavé riešenia: Objavilo sa niekoľko zaujímavých postupov, niektorí ste sa snažili začať kresliť prvý schod vo vhodnej vzdialenosti od ľavého dolného rohu tak, aby boli dodržané požadované podmienky, v inom riešení sa zase vyskytlo napríklad takéto testovanie:
urobtu "PocetSchodov 1
kym[nieje ((2 * :VyskaSchodu) + :SirkaSchodu) <= :PriemerKroku] [ urobtu "VyskaSchodu vyskaMiestnosti / :PocetSchodov urobtu "SirkaSchodu sirkaMiestnosti / :PocetSchodov urobtu "PocetSchodov :PocetSchodov + 1 ] Toto riešenie (ako aj väčšina vašich riešení) však zlyháva na tom, že síce vyjadruje počet schodov ako celé číslo, ale vypočítaná šírka a výška jedného schodu už nespĺňa požadovanú podmienku: 2 * výška schodu + šírka schodu = priemerný krok. Inými slovami, toto riešenie funguje iba v takých prípadoch, ak vyskaMiestnosti / vyskaSchodu je celé číslo. Ďalší nápad bol zameraný na testovanie, či nenarazím na stenu:
kým[
zároveň [k1'ysur+ vyskaSchodu <= vyskaMiestnosti-200] [k1'xsur+ sirka Schodu <= sirkaMiestnosti-150] ] [urobTu "pocetschodov :pocetschodov+1 schod] V tomto riešení však procedúra na vykreslenie schodu nedodržiavala požadovanú podmienku pre priemerný krok a pozícia korytnačky je pevná na pozícii [-150 -200]. Najčastejšie chyby:
| ||||||||||
© Univerzita Pavla Jozefa Šafárika v Košiciach, Prírodovedecká fakulta, Ústav informatiky palmaj (zavinac) upjs.sk |