Autorské riešenie
[stiahni]

Pri výpočte výslednej sumy musíme zohľadniť cenu za dopravu a ceny včítane zliav za jednotlivé druhy tovaru. Postup výpočtu výslednej ceny pre jednotlivé druhy tovaru je v podstate pre každý druh tovaru rovnaký. Líši sa len počtom kusov a cenou za kus. Na výpočet ceny jedného druhu tovaru je teda výhodné si vytvoriť procedúru, napr. cenaZaTovar.

Procedúra cenaZaTovar má dva parametre :kusy a :cenaZaKus. Najskôr si vypočítame cenu za všetky kusy bez akejkoľvek zľavy (:kusy * :cenaZaKus). Ak sme nakúpili viac kusov ako je hranica1, tak od tejto ceny potom odpočítame 10 % zľavu, ktorú sme dostali na kusy nad hranicou 1 ((:kusy-:hranica1) * :cenaZaKus * 0.1). Akpočet kusov je väčší ak ohranica 2, tak od tejto ceny ešte odpočítame 10 % zľavu, ktorú sme dostali na kusy nad hranicou 2 ((:kusy-:hranica2) * :cenaZaKus * 0.1). Je síce pravda, že na tieto kusy je zľava 20 %, ale uvedomme si, že na tieto kusy sme si už raz 10 % zľavu uplatnili. Viac zrejme napovie obrázok:

Výsledná procedúra vyzerá nasledovne:

viem cenaZaTovar :kusy :cenaZaKus
 urobTu "cena :kusy * :cenaZaKus
 ak :kusy > :hranica1 [
  urobTu "cena :cena - (:kusy-:hranica1) * :cenaZaKus * 0.1
  ak :kusy > :hranica2 [
   urobTu "cena :cena - (:kusy-:hranica2) * :cenaZaKus * 0.1
  ]
 ]
koniec

Ďalšia možnosť ako vypočítať cenu za daný druh tovaru je nasledovná. Vypočítame cenu za tie kusy tovaru, na ktoré nie je žiadna zľava (:kusy * :cenaZaKus). K nej pripočítame cenu za tie kusy, na ktorú máme zľavu 10 % a cenu za tie kusy, na ktoré máme zľavu 20 %.

Procedúra cenaZaTovar môže vyzerať teda aj takto:

viem cenaZaTovar :kusy :cenaZaKus
 ak2 :kusy <= :hranica1 [
  urobTu "cena :kusy * :cenaZaKus
 ][
  urobTu "cena :hranica1 * :cenaZaKus
  ak2 :kusy <= :hranica2 [
   urobTu "cena :cena + (:kusy - :hranica1) * :cenaZaKus * 0.9
  ][
   urobTu "cena :cena + (:hranica2 - :hranica1) * :cenaZaKus * 0.9
   ak :kusy > :hranica2 [
    urobTu "cena :cena + (:kusy - :hranica2) * :cenaZaKus * 0.8
   ]
  ]
 ]
 vysledok :cena
koniec

Musíme si však dať pozor na to, či počet kusov prekročil zadané hranice alebo nie. Počítať môžeme len s tým počtom kusov, ktoré si zákazník objednal.

Nakoniec sa pozrime na procedúru vypocitajCenu. Jej naprogramovanie je už v podstate jednoduché. Spočíta cenu dopravy a ceny sa jednotlivé druhy tovaru.

viem vypocitajCenu :doprava
 cenaCelkom'nechHodnota :doprava +
                        (cenaZaTovar kusy1'hodnota cena1'hodnota) +
                        (cenaZaTovar kusy2'hodnota cena2'hodnota) +
                        (cenaZaTovar kusy3'hodnota cena3'hodnota)
koniec

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

Úlohu riešilo 10 tímov, dva tímy túto úlohu vyriešili správne.

  • Niektorí žiaci nebrali vôbec do úvahy zľavu na tovar. Vypočítali iba celkovú cenu tovarov bez zľavy plus dopravu.

  • Výpis výslednej ceny nefungoval po stlačení tlačidla dopravy. Výslednú cenu sme museli získať volaním procedúry cez príkazový riadok.

  • Väčšina počítala zľavu, ktorá sa vzťahovala na všetky kusy tovaru, nie iba na tie ktoré sú nad hranicou1 respektíve nad hranicou2.

  • Niektorí žiaci nevedeli získať hodnotu z textového poľa.