Autorské riešenie
[stiahni]

Veľmi užitočnou pmôckou pri riešení tejto úlohy je obrázok. Nakreslíme si kruh s rôznymi hodnotami uhlov - násobkami 90 stupňového uhla a potom násobkami 45 stupňového uhla.

Najprv určime aké uhly odpovedajú svetovým stranám. Sever prislúcha k uhlu 0 stupňov, východ k uhlu 90 stupňov, juh k uhlu 180 stupňov a západ k uhlu 270 stupňov. Ďalším smerom prislúchajú nasledovné uhly - severovýchodu 45, juhovýchodu 135, juhozápadu 225 a severozápadu 315 stupňov.

Pozor na zadanie úlohy, kde sa hovorí, nie KAM fúka vietor, ale ODKIAĽ fúka vietor. Preto, napr. vetru, ktorý fúka zo severu na juh ("severáku") s uhlom 180 stupňov, priradíme označenie severný vietor alebo skratku S.

8 smerov

Ak by sme na vstupe mali zadané uhly len ako násobky 45 stupňového uhla, tak riešenie úlohy by bolo veľmi jednoduché. Na základe hodnoty uhla uloženej v premennej "uhol by sme pomocou príkazu vetvenia akJe určili patričné označenie vetra. Procedúra určiSmer by vyzerala, napr. takto:

viem urciSmer
  akJe :uhol [
      0 [text2'nechHodnota "J ]
     45 [text2'nechHodnota "JZ]
     90 [text2'nechHodnota "Z ]
    135 [text2'nechHodnota "SZ]
    180 [text2'nechHodnota "S ]
    225 [text2'nechHodnota "SV]
    270 [text2'nechHodnota "V ]
    315 [text2'nechHodnota "JV]
  ]
koniec

Uhol vetra vo všeobecnosti nemusí byť len celočíselným násobkom 45 stupňového uhla. Ako prevedieme ľubovoľný uhol od 0 do 360 stupňov na jeden z ôsmich požadovaných smerov vetra? Ako určíme hranice medzi, napr. južným a juhozápadným smerom vetra? Prirodzené je určiť hranice v polovici uhlov medzi susednými dvojicami požadovaných smerov. Potom napr. južnému vetru budú odpovedať hodnoty uhla od 337,5 do 22,5 stupňa, juhozápadného vetru hodnoty uhla od 22,5 do 67,5, atď. Jednou možnosťou riešenia je zistiť, do ktorého z ôsmich vypísanych rozsahov uhlov patrí zadaný uhol a následne vypísať jeden z ôsmich smerov vetra.

smery vetra 2

Inou možnosťou je očíslovať si požadované smery vetra, napr. číslami od 0 do 7. Pre zadaný uhol vypočítať číslo oblasti, do ktorej patrí daný úhol. A napokon, pre zadané číslo oblasti vypísať odpovedajúci smer vetra. Najprv skúsme uvažovať, ako by sme určili roblasť pre zadaný uhol podľa dolného pomocného obrázka a potom riešenie upravíme, aby vyhovovalo zadaniu úlohy podľa obrázka nad týmto textom.

smery vetra 1

Číslo oblasti na pomocnom obrázku určíme tak, že predelíme zadaný uhol hodnotou 45. Dostaneme desatinné číslo, ktoré je potrebné previesť na celé číslo pomocou funkcie celá. Číslo oblasti na pomocnom obrázku, do ktorej patrí zadaný uhol, určíme pomocou výrazu: (celá :uhol /45). Číslo oblasti v obrázku nad pomocným obrázkom určíme miernou úpravou výrazu: (celá (:uhol + 22.5)/45). Pre hodnoty uhlov nad 337,5 by sme dostali číslo oblasti 8 namiestom 0. Preto výraz na výpočet oblasti upravíme pomocou funkcie zvyšok nasledovne: (zvyšok (celá (:uhol+22.5)/45) 8). Na základe tejto úvahy napokon vytvoréme procedúru urciSmer:

viem urciSmer
  urobTu "oblast zvyšok (celá (:uhol+22.5)/45) 8
  akJe :oblast [
    0 [text2'nechHodnota "J]
    1 [text2'nechHodnota "JZ]
    2 [text2'nechHodnota "Z]
    3 [text2'nechHodnota "SZ]
    4 [text2'nechHodnota "S]
    5 [text2'nechHodnota "SV]
    6 [text2'nechHodnota "V]
    7 [text2'nechHodnota "JV]
  ]
koniec

Riešitelia, ktorí vedia pracovať so zoznamami, môžu uvedené riešenie skrátiť nasledovne:

viem urciSmer1
  urobTu "smery [J JZ Z SZ S SV V JV]
  urobTu "oblast zvyšok (celá (:uhol+22.5)/45) 8
  text2'nechHodnota prvok :oblast+1 :smery
koniec

Táto úloha je zameraná na dôsledný rozbor situácie, precvičenie si príkazov vetvenia, prípadne výpočtov s využitím funkcií (celá, zvyšok).

Vaše zaujímavé riešenia a najčastejšie chyby

Úlohu riešilo spolu 28 tímov, bohužiaľ žiaden tím nezískal plný pošet bodov. Len 5 tímov pochopilo, že smer vetra sa určuje podľa toho ODKIAĽ fúka vietor. nie KDE fúka vietor. Až 21 tímov použilo príkaz vetvenia neefektívne, kde sa zbytočne veľakrát zisťovala platnosť podmienok. Ukázalo sa, že veľmi málo tímov pozná príkaz vetvenia AKJE alebo vnorené príkazy AK2. Pri určovaní hraníc oblastí sa vyskytli rôzne chyby - posunuté hranice (presne ako sú uvedené na našom pomocnom obrázku), určenie smeru vetra na jednu presnú hodnotu, nie na rozsah čísel, zabudnutie na určenie smeru vetra pre hranice oblastí. Pri tejto a aj pri iných úlohách odporúčame riešiteľom, aby si najprv nakreslili obrázok a na ňom určili hranice oblasti. Zopár tímov použilo pri riešení úlohy zoznamy.