Autorské riešenie
Úlohu o opakovanom meraní hmotnosti 16 hárkov A4 papiera na hodine fyziky je užitočné rozdeliť si na tieto časti:
Načítanie je možné vykonať rôznymi spôsobmi, prehľadný spôsob je tento:
urobtu "zoznam [] Rýchlo by sme však zistili, že aj keď na prvý pohľad je to zápis pekný, pri veľkom počte hodnôt nie je veľmi efektívny. Isté vylepšenie nám ponúka príkaz veta, ktorý nám umožní tento zápis skrátiť takýmto spôsobom:
urob "hodnoty (veta meranie1'hodnota meranie2'hodnota meranie3'hodnota meranie4'hodnota Opäť ale vidíme, že pri veľkom počte prvkov aj táto možnosť zlyhá. Ukážme si teda jedno z riešení, v ktorom využijeme na načítavanie prvkov cyklus opakuj.
urobtu "zoznam [] Nájdenie najmenšej a najväčšej hodnoty a výpočet priemeru zo zvyšných hodnôt - prvý spôsob: Ak už máme namerané hodnoty načítané v zozname, postup pri hľadaní najmenšej a najväčšej hodnoty môže byť taký, že za najmenší a najväčší prvok najprv označíme hneď prvý prvok zoznamu. Postupne však potrebujeme skontrolovať ďalšie prvky. Ak sme zistili, že niektorý ďalší prvok je menší alebo väčší, tak jeho hodnotu označíme za najmenší alebo najväčší prvok a navyše si zapamätáme jeho pozíciu v zozname. Je to možné naprogramovať takto:
urobtu "najmensi prvok 1 :hodnoty Ak poznáme pozíciu najmenšieho a najväčšieho prvku, tak pri spočítavaní hodnôt (aby sme vypočítali priemer) tento najmenší a najväčší prvok vynecháme. Dosiahneme to pomocou podmienky ak, v ktorej budeme kontrolovať, či nie sme na pozícii najmenšieho alebo najväčšieho prvku. Ak áno, tak danú hodnotu do súčtu nezarátame.
urobtu "sucet 0 Tým máme vypočítanú priemernú hodnotu ôsmich meraní (nie však hmotnosť jedného hárku!) Nájdenie najmenšej a najväčšej hodnoty a výpočet priemeru zo zvyšných hodnôt - druhý spôsob: Druhý, rovnako správny, postup využíva to, že hodnoty zoznamu utriedíme od najmenšieho po najväčší pomocou príkazu utried a z utriedeného zoznamu odstránime prvý a posledný prvok:
urobTu "zoznam utried :zoznam Alebo to isté vieme spraviť aj v jednom riadku:
urobTu "zoznam bezPr bezPo utried :zoznam Takýto príkaz najprv zoznam utriedi, potom vytvorí zoznam bez posledného prvku a nakoniec vytvorí zoznam bez prvého prvku. Následne budeme počítať priemer už všetkých prvkov zoznamu (lebo najmenší a najväčší sme už vymazali). Ak bolo najmenších a najväčších hodnôt viac, tak sme vymazali len jednu.
urobtu "sucet 0
urobtu "priemer aplikuj "sucet :zoznam / pocet :zoznam Výpočet jedného hárku papiera: Na záver ešte potrebujeme priemernú hodnotu meraní predeliť 16timi, keďže sme pre lepšiu presnosť merali hmotnosť 16 papierov naraz a výsledok vypísať do textového poľa.
vysledok'nechHodnota :priemer / 16 Zhrnutím všetkých možných vylepšení môžeme prekvapujúco dospieť až k takémuto krátkemu zápisu procedúry počítaj:
viem počítaj Vaše zaujímavé riešenia: Viacero tímov použilo správne príkaz utried :zoznam, iný zase hľadali najmenší prvok cez cyklus. Niektoré tímy si vytvorili aj pomocné procedúry, ktoré riešili čiastkové úlohy - nájdi, vymaž, vylúč a podobne. Vyskytlo sa aj jedno riešenie, ktoré najmenší a najväčší prvok zarátalo aj do súčtu, ale na záver ho z toho súčtu (ešte pred vyrátaním priemeru) odrátalo:
urob "najmensie 1000 Najčastejšie nedostatky:
| ||||||||||
© Univerzita Pavla Jozefa Šafárika v Košiciach, Prírodovedecká fakulta, Ústav informatiky palmaj (zavinac) upjs.sk |