Autorské riešenie
[stiahni]

Túto úlohu môžeme riešiť rôznymi spôsobmi. Jedným z nich je nasledovný postup:

  • postupne prejdeme všetky objednávky, tie sú uložené v zozname "objednavky,*
  • z každej objednávky zistíme, aký šalát a koľko porcií z neho si zákazníci objednali,
  • pre každý šalát sa pozrieme do cenníka (premenná "cennik), aby sme zistili cenu tohto šalátu,
  • ak vieme, koľko stojí jedna porcia šalátu a vieme koľko porcií si zákazníci objednali, vieme zistiť koľko zaplatili zákazníci za túto objednávku,
  • ceny všetkých objednávok budeme postupne sčítavať, celková suma predstavuje aj hotovosť, ktorá by mala v pokladni byť.
* Poznámka: Všimnime si, že by sme mohli úlohu riešiť aj tak, že postupne prejdeme každou položkou cenníka a potom v objednávke zistíme, koľko porcií si z daného šalátu zákazníci objednali. Toto riešenie je však menej výhodné, pretože vždy pre každú položku cenníka musíme prejsť všetky položky objednávky. V postupe, ktorý uvádzame ďalej, pre každú položku objednávky prechádzame cenníkom len dovtedy, kým príslušný šalát nenájdeme.

Najskôr vyriešme to, ako prejsť všetkými objednávkami. Samotný kód môžeme umiestniť do procedúry vypocitajHotovost:

viem vypocitajHotovost
 urobTu "hotovost 0
 prePrvky "objednavka :objednavky [
  urobTu "hotovost :hotovost + (zistiCenu prvok 1 :objednavka) * (prvok 2 :objednavka)
 ]
 pis (slovo "|Hotovosť v pokladni: | :hotovost "| EUR.|)
koniec

Výslednú sumu si budeme postupne vypočítavať v premennej "hotovost. Na začiatku jej hodnotu nastavíme na 0. V cykle prePrvky postupne spracujeme všetky objednávky. Každá objednávka je dvojprvkový zoznam. Prvý prvok je názov šalátu (prvok 1 :objednavka) a druhý prvok je počet objednaných porcií (prvok 2 :objednavka). Na zistenie ceny konkrétneho šalátu sme si vytvorili procedúru zistiCenu:

viem zistiCenu :nazovJedla
 prePrvky "polozka :cennik [
  ak prvok 1 :polozka = :nazovJedla [
   vysledok prvok 2 :polozka
  ]
 ]
koniec

Pomocou cyklu prePrvky postupne prechádzame položkami cenníka. Každá položka je dvojprvkový zoznam. Prvý prvok je názov šalátu (prvok 1 :polozka) a druhý prvok je jeho cena (prvok 2 :polozka). Ak v zozname nájdeme položku, ktorá obsahuje náš hľadaný šalát (prvok 1 :polozka = :nazovJedla), procedúra vráti jeho cenu (vysledok prvok 2 :polozka). Všimnime si ešte jednu vec, že nemusíme vždy prechádzať celým cenníkom. Stačí ak nájdeme požadované jedlo. Príkaz vysledok prvok 2 :polozka ukončí celú procedúru a vráti cenu hľadaného šalátu (a to aj napriek tomu, že sme neprehľadali celý cenník).

Tým sme celú úlohu vyriešili.

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

Vaše riešenie by sa dali rozdeliť do dvoch. Do prvej skupiny patria riešenie tých, ktorí poznajú dátovú štruktúru zoznam a vedia s ňou pracovať. Títo úlohu vyriešili väčšinou správne. Do druhej skupiny patri tí z vás, ktorý zoznamy nepoznajú. Títo z vás z úlohy nevyriešili takmer nič.

V správnych riešeniach ste často používali množstvo premenných, ktorým ste dávali "nelogické" mená a tak sa váš program stal ťažšie čitateľný.