Autorské riešenie
[stiahni imp : py]                                       

  • Počet riešiteľov: 19 / 21 = 90%

  • Úspešnosť riešenia: 3,45 / 5 = 69%

Pri riešení úlohy môžeme postupovať dvomi spôsobmi:

  • pre zadaný objem čaju vypočítame zvlášť počet použitých vozíkov, počet 10-litrových a počet 20-litrových bandasiek,

  • pre zadaný objem čaju vypočítame zvlášť náklady pre plne naložené vozíky a náklady pre čiastočne naložený vozík.

Pri druhom spôsobe riešenia najprv vypočítame náklady na použitie plných vozíkov. Počet plných vozíkov vypočítame ako celočíselný podiel objemu čaju číslom 30. Náklady na použitie jedného vozíka je súčet nákladov za vozík, za 10-litrovú a za 20-litrovú bandasku, čo je 5+2+1 €. Náklady na použitie plných vozíkov je súčinom uvedených vypočítaných hodnôt.

Pri výpočte nákladov na použite čiastočne naloženého vozíka, rozlišujeme nasledovné situácie, ktoré ilustrujeme schémou:

 bandasky

Ak zvyšný objem čaju je nenulový a zároveň nanajvýš 10 litrov včítane, tak pri nákladoch započítame náklady na vozík 5 € a náklady na 10-litrovú bandasku 1 €.

Ak zvyšný objem čaju je viac ako 10 litrov a zároveň nanajvýš 20 litrov včítane, tak pri nákladoch započítame náklady na vozík 5 € a náklady na 20-litrovú bandasku 2 €.

Ak zvyšný objem čaju je viac ako 20 litrov, tak pri nákladoch započítame náklady na vozík 5 €, náklady na 10-litrovú bandasku 1 € a náklady na 20-litrovú bandasku 2 €.

Výsledné riešenie dostaneme ako súčet nákladov na použitie plných vozíkov a nákladov na použitie čiastočne naloženého vozíka.

Riešenie v programovacom jazyku Imagine Logo môže vyzerať nasledovne:

;Imagine logo
viem kalkulacia :objem
  urobTu "pocet_plnych_vozikov cPodiel :objem 30
  urobTu "naklady_na_plne_voziky (5 + 2 + 1) * :pocet_plnych_vozikov 
  urobTu "zvysny_objem :objem - 30 * :pocet_plnych_vozikov  
  ak2 :zvysny_objem > 20 [
    urobTu "naklady_na_posledny_vozik 5 + 2 + 1
  ][
    ak2 :zvysny_objem > 10 [
      urobTu "naklady_na_posledny_vozik 5 + 2
    ][
      ak2 :zvysny_objem > 0 [
        urobTu "naklady_na_posledny_vozik 5 + 1
      ][
        urobTu "naklady_na_posledny_vozik 0
      ]
    ]
  ]
  výsledok :naklady_na_plne_voziky + :naklady_na_posledny_vozik
koniec			
Riešenie v programovacom jazyku Python môže vyzerať nasledovne:
#Python
def kalkulacia(objem):
    pocet_plnych_vozikov = objem // 30
    naklady_na_plne_voziky = (5 + 2 + 1) * pocet_plnych_vozikov
    zvysny_objem = objem - 30 * pocet_plnych_vozikov
    if zvysny_objem > 20:
        naklady_na_posledny_vozik = 5 + 2 + 1
    elif zvysny_objem > 10:
        naklady_na_posledny_vozik = 5 + 2
    elif zvysny_objem > 0:
        naklady_na_posledny_vozik = 5 + 1
    else:
        naklady_na_posledny_vozik = 0
    return naklady_na_plne_voziky + naklady_na_posledny_vozik

Táto úloha je zameraná na dôslednú analýzu matematického problému, na použitie dekompozície ako strsatégie riešenia problému, na precvičenie aritmetických operácii, príkazu vetvenia a funkcie s parametrom a výstupom.

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

Do riešenia tejto úlohy sa zapojilo 19 tímov z kategórie EXPERT. Oproti predchádzajúcim kolám je zreteľný posun k programovaciemu jazyku Python, v ktorom programovalo až 14 tímov. Zvyšných 5 tímov použilo programovacie prostredie Imagine Logo. Až 8 tímov dosiahlo plný počet bodov.

Veľmi stručné riešenie uviedol tím File-Open, ktorý použil prvý spôsob riešenia úlohy, v ktorom šikovne využili funkciu ceil (najbližšia vyššia celá časť čísla) z modulu math:

#Python
math import ceil
def kalkulacia (objem_caju):
    pocet_vozikov = ceil(objem_caju / 30)
    cena_za_voziky = pocet_vozikov * 5
    cena_za_bandasky = ceil(objem_caju / 10)
    print(objem_caju, cena_za_voziky, cena_za_bandasky)
    return cena_za_voziky + cena_za_bandasky

V riešeniach sme zaregistrovali nasledovné nedostatky, vychádzajúce najčastejšie z nedôslednej analýzy problému či z pretrvajúcich programátorských zlozvykov:

  • výpočet nákladov len pre celočíselný objem čaju,

  • namiesto vrátenia hodnoty vo funkcii (pomocou prákazu return) bol použitý príkaz výstupu print,

  • použitie nemnemonických jednopísmekových identifikátorov premenných,

  • namiesto použitia logických spojok sa dali použiť zápisy logických výrazov s viac ako jednou relačnou oparáciou.

  • rovnaký opakujúci sa programový kód vo viacerých vetvách programu,

  • namiesto funkcie s parametrom použitie globálnej premennej a funkcie bez parametra.