Autorské riešenie
[stiahni]

V úlohe bolo potrebné navrhnúť postup, pomocou ktorého vypíšeme odchody autobusu v pravidelných rozostupoch (intervaloch). Vieme, že prvý autobus odíde presne o siedmej hodine a posledný čo najneskôr pred sedemnástou hodinou. Medzi siedmou a sedemnástou hodinou uplynie 600 minút. Celkový počet odchodov je uvedený v textovom poli text1. Chceme preto zistiť, aké veľké rozostupy medzi dvoma odchodmi zvoliť tak, aby bol zachovaný celkový počet odchodov a zároveň posledný autobus odišiel čo najneskôr pred sedemnástou (rozostupy preto chceme zvoliť čo najväčšie). Nakreslíme si takýto obrázok.

rozostupy

Z obrázka je jasné, že počet odchodov je o 1 väčší ako počet intervalov (rozostupov) medzi prvým a posledným odchodom. Preto veľkosť rozostupov určíme pomocou nasledujúceho príkazu:

   urobtu "rozostup cpodiel 10*60 text1-1

Ak poznáme veľkosť jedného rozostupu, ľahko zistíme, že posledný autobus niekedy odíde aj oveľa skôr ako o 17:00. Výpočtom si môžeme overiť, že presne o 17:00 odíde posledný autobus len v prípade, ak celkový počet odchodov je 21, 25, 26, 31 alebo 41 (celkový počet odchodov v projekte nadobúda len hodnoty od 20 do 49). V spomínaných prípadoch výraz 10*60/(text1-1) predstavuje celé číslo. Overte si tiež, že časový rozdiel medzi posledným odchodom a časom 17:00 môže byť väčší ako veľkosť rozostupu! V časti Vaše zaujímavé riešenia ponúkame správne vysvetlenie, ktoré zaslal vo svojom riešení jeden z tímov.

Ak máme zistenú veľkosť rozostupov, ostáva nám správne vypočítať čas jednotlivých odchodov. V tejto časti môže byť postup rôzny. V našom riešení postupne zvyšujeme pomocnú premennú pomocna a po každom zvýšení o hodnotu rozostupu prevedieme čas na hodiny a minúty pomocou príkazov cpodiel a zvyšok. Treba si tiež uvedomiť, že hodiny začíname počítať od hodnoty 7.

   urobtu "pomocna 0
   opakuj text1 [
      urobtu "hodina cpodiel :pomocna 60
      urobtu "hodina 7 + :hodina
      urobtu "minuta zvysok :pomocna 60
      urobtu "pomocna :pomocna+:rozostup
   ]

Ostáva nám naprogramovať výpis všetkých odchodov na pracovnú plochu. Je potrebné mať na pamäti tieto skutočnosti:

  • pred jednociferný počet hodín a jednociferný počet minút sa zvykne pridávať nula,
  • pri prechode na novú hodinu vieme použiť procedúru pridajRiadokDoVypisu.
Opäť sa to dá riešiť rôznymi spôsobmi. My sme si vytvorili premennú retazec, do ktorej si budeme ukladať odchody v rámci jednej hodiny. V takom prípade pridanie nuly pred jednociferný počet hodín a jednociferný počet minút vieme vyriešiť podmienkou ak a pripísaním nuly do premennej retazec.

   urobtu "retazec "
   ak (:hodina<10)[
      urobtu "retazec (slovo :retazec 0)
   ]
   urobtu "retazec (slovo :retazec :hodina)
   urobtu "retazec (slovo :retazec ":)
   ak (:minuta<10)[
      urobtu "retazec (slovo :retazec 0)
   ]
   urobtu "retazec (slovo :retazec :minuta)
   urobtu "retazec (slovo :retazec |" |)

Prechod na novú hodinu si vieme kontrolovať pomocou premennej staraHodina, v ktorej si budeme pamätať hodinu predchádzajúceho odchodu. Ak sa hodina nového odchodu bude líšiť, premennú reťazec vypíšeme pomocou procedúry pridajRiadokDoVypisu a vymažeme všetko, čo v nej bolo.

   ak (:staraHodina <> :hodina) [
      pridajRiadokDoVypisu :retazec
      urobtu "retazec "
   ]

Výsledná procedúra vypisOdchodov môže vyzerať nasledovne:

viem vypisOdchodov
   urobtu "rozostup cpodiel 10*60 text1-1
   urobtu "retazec "
   urobtu "hodina 7
   urobtu "staraHodina 7
   urobtu "pomocna 0
   opakuj text1 [
     urobtu "staraHodina :hodina
     urobtu "hodina cpodiel :pomocna 60
     urobtu "minuta zvysok :pomocna 60
     ak (:staraHodina <> :hodina) [
       pridajRiadokDoVypisu :retazec
       urobtu "retazec "
     ]
     ak (:hodina<10)[
       urobtu "retazec (slovo :retazec 0)
     ]
     urobtu "retazec (slovo :retazec :hodina)
     urobtu "retazec (slovo :retazec ":)
     ak (:minuta<10)[
       urobtu "retazec (slovo :retazec 0)
     ]
     urobtu "retazec (slovo :retazec :minuta)
     urobtu "retazec (slovo :retazec |" |)
     urobtu "pomocna :pomocna+:rozostup
   ]
   pridajRiadokDoVypisu :retazec
koniec

Pozrite si príklad cestovného plánu pre 46 celkových odchodov bez grafických efektov:

odchody

Vaše cestovné plány vrátane grafických efektov sú v galérii obrázkov k tejto úlohe.

Vaše zaujímavé riešenia:

Každé riešenie bolo svojím spôsobom zaujímavé a aj keď sa niekde objavil malý nedostatok, vynahradili ste ho pekným spracovaním v inej časti úlohy. Pripájame jeden zaujímavý komentár, ktorý nám zaslal vo svojom riešení jeden z tímov. Uvádzame ho doslovne tak, ako bol uvedený v zdrojovom kóde:

;------ Odchody autobusov sa normalne pisu v minutach. Preto by aj intervaly mali byt v minutach. Moze vsak nastat situacia, ze autobusy prestanu chodit prilis skoro. Napriklad v pripade kde pocet odchodov je 43, interval vychadza 13.95.. v minutach. Nemoze to vsak byt 14 minut, najviac 13. Zaokruhlujeme na minuty, pretoze casy autobusov sa bezne uvadzaju v minutach a intervaly maju byt rovnake. V tomto pripade by autobusy namiesto 10 hodin jazdili iba 13*43/60 = 9.32 hodin.

Odchody v rámci jednej hodiny niektorí z Vás overovali takýmto príkazom:

   kym [zaroven :minuta < 60 :pocet < :odchody]

Na spájanie reťazcov v rámci jedného riadku ste využívali príkazy slovo a veta:

   urobtu "retazec (veta :retazec (veta :hodina ": :minuta) ",)

alebo takisto aj príkaz vlozpo:

   urobtu "retazec vlozpo :hodina :retazec

Niektorí z Vás nevyužívali pripravenú procedúru pridajRiadokDoVypisu, ale odchody vypisovali do vytvoreného textového poľa pomocou príkazov pisaniedotextu a pripis:

   pisaniedotextu "text5 pripis :hodiny

Jeden z tímov vytvoril navyše špeciálnu procedúru generujNazov, ktorá pre každý riadok vo výpise vygenerovala názov autobusu:

   viem generujNazov
     urobTu "nazvy [Chopok Kofolka Klávesnica Poháriček Cukríček Košíček Klávesnička Palmôčka]
     vysledok ?prvok :nazvy
   koniec

Objavili sa aj krátke riešenia len cez textovú plochu výpisov v Imagine, iní z Vás však precízne zapracovali aj na grafickom riešení, čo hodnotíme pozitívne v akomkoľvek prevedení.

Najčastejšie nedostatky:

  • na výpočet veľkosti rozostupov ste využili vzorec 600/text1, čo nemusí nájsť ideálnu veľkosť rozostupu,
  • celkový počet odchodov vo vašom cestovnom poriadku nesedel (buď tam bol o jeden odchod viac, alebo niektoré odchody chýbali, väčšinou tie prvé odchody v rámci každej hodiny).
  • namiesto 600 minút, ktoré uplynú medzi 7. a 17. hodinou, ste počítali s hodnotou 660 minút,
  • výpis odchodov len cez textovú plochu výpisov,
  • odchody generované náhodne,
  • chýbajúci názov, číslo linky a grafické spracovanie cestovného poriadku.