Autorské riešenie
[stiahni imp : py]

  • Počet riešiteľov: 28 / 31 =  90%

  • Úspešnosť riešenia: 3,2 / 6 = 53%

Riešenie úlohy môžeme rozdeliť na dve časti:

  1. vykreslenie dielikov teplomera,
  2. vykreslenie hodnôt hraničných teplôt.

Poďme najprv vyriešiť zjednodušenú verziu prvej podúlohy - vykreslenie jednofarebných dielikov teplomera s hodnotami teplót od 34.0 °C do 42.0 °C s krokom 0.1 °C so zadanou dĺžkou vykreslených dielikov a zadaným rozstupom medzi dielikmi.

Pri vykresľovaní dielikov od dolnej po hornú hranicu teploty, si treba uvedomiť, že vykreslíme spolu horná - dolná + 1 dielikov. Je to podobne ako pri počítaní prstov od prveho po piaty prst, že počet medzier medzi prstami je 5 - 1, ale počtov prstov je o jeden viac ako počtu medzier medzi prstami, t. j. (5 - 1) + 1 = 5.

Procedúra kresliDieliky0 v jazyku Imagine Logo môže vyzerať nasledovne:

;Imagine Logo

viem kresliDieliky0 :dlzka :rozstup
  preČísla "t [34.0 42.0 0.1] [
    peroDolu
    dopredu :dlzka
    dopredu -:dlzka
    peroHore
    vpravo 90
    dopredu :rozstup
    vpravo -90
  ]
  vpravo -90
  dopredu ((42.0 - 34.0) * 10 + 1) * :rozstup
  vpravo 90
koniec

A funkcia kresliDieliky0 v jazyku Python môže vyzerať, napr. takto:

# Python
def kresliDieliky0(dlzka, rozstup): ''' Vykresli dieliky teplomera od 34.0 do 42.0 stupnov so zadanou dlzkou :param dlzka: dlzka ciary dielika teplomera :type dlzka: float :param rozstup: dlzka rozstupu medzi ciarami dielikov teplomera :type rozstup: float :rtype: None ''' for t in range(340, 420 + 1): kor.down() kor.forward(dlzka) kor.forward(-dlzka) kor.up() kor.right(90) kor.forward(rozstup) kor.right(-90) kor.right(-90) kor.forward((420 - 340 + 1) * rozstup) kor.right(90)

V zadaní úlohy máme však vykresliť farebné dieliky s farbou závislou od hodnoty.

digitalny teplomer

V riešení tejto prvej podúlohy do cyklu vložíme príkaz vetvenia. V riešení jazyka Imagine Logo doplníme tri do seba vnorené príkazy ak2. V riešení jazyka Python doplníme príkaz viacnásobného vetvenie pomocou konštrukcie if - elif - else.

Procedúra kresliDieliky v jazyku Imagine Logo môže vyzerať nasledovne:

;Imagine Logo

viem kresliDieliky :dlzka :rozstup
  preČísla "t [34.0 42.0 0.1] [
    ak2 :t > 38.5 [
      ;horúčka
      nechFarbaPera "červená
    ][
      ak2 :t > 37.0 [
        ;zvýšená teplota
        nechFarbaPera "oranžová
      ][
        ak2 :t > 36.0 [
          ;normálna teplota
          nechFarbaPera "zlta
        ][
          ;podchladenie
          nechFarbaPera "zelena
        ]
      ]
    ]
    peroDolu
    dopredu :dlzka
    dopredu -:dlzka
    peroHore
    vpravo 90
    dopredu :rozstup
    vpravo -90
  ]
  vpravo -90
  dopredu ((42.0 - 34.0) * 10 + 1) * :rozstup
  vpravo 90
koniec

Funkcia kresliDieliky v jazyku Python môže vyzerať, napr. takto:

# Python

def kresliDieliky(dlzka, rozstup):
    '''
    Vykresli dieliky teplomera od 34.0 do 42.0 stupnov so zadanou dlzkou

    :param dlzka: dlzka ciary dielika teplomera
    :type dlzka: float
    :param rozstup: dlzka rozstupu medzi ciarami dielikov teplomera
    :type rozstup: float
    :rtype: None
    '''
    for t in range(340, 420 + 1):
        if t > 385:
            #horúčka
            kor.color('red')
        elif t > 370:
            #zvýšená teplota
            kor.color('orange')
        elif t > 360:
            #normálna teplota
            kor.color('yellow')
        else:
            #podchladenie
            kor.color('green')
        kor.down()
        kor.forward(dlzka)
        kor.forward(-dlzka)
        kor.up()
        kor.right(90)
        kor.forward(rozstup)
        kor.right(-90)
    kor.right(-90)
    kor.forward((420 - 340 + 1) * rozstup)
    kor.right(90)

Druhá podúloha je celkom ľahká, potrebujeme sa presunúť na hodnoty hraničných teplôt a vypísať ich na obrazovku.

Pritom si musíme uvedomiť rozdiel medzi jazykmi Imagine Logo a Python, lebo v Imagine Logo korytnačka je štandardne nasmerovaná na sever a výpis hodnôt do plochy je pod korytnačkou. V jazyku Python je korytnačka štandardne nasmerovaná na východ a výpis hodnôt do plochy je nad korytnačkou.

Procedúra kresliCisla v jazyku Imagine Logo môže vyzerať nasledovne:

;Imagine Logo

viem kresliCisla :dlzka :rozstup
  peroHore
  nechFarbaPera "cierna
  dopredu :dlzka / 2
  text "34.0

  vpravo 90
  dopredu ((36.0 - 34.0) * 10 * :rozstup)
  vpravo -90
  text "36.0

  vpravo 90
  dopredu ((37.0 - 36.0) * 10 * :rozstup)
  vpravo -90
  text "37.0

  vpravo 90
  dopredu ((38.5 - 37.0) * 10 * :rozstup)
  vpravo -90
  text "38.5

  vpravo -90
  dopredu ((38.5 - 34.0) * 10 * :rozstup)
  vpravo 90
  dopredu -:dlzka / 2
koniec

Funkcia kresliCisla v jazyku Python môže vyzerať, napr. takto:

# Python

def kresliCisla(dlzka, rozstup):
    '''
    Vypise hranicne teploty 34.0, 36.0, 37.0 a 38.5 stupna 
    na poziciu 30% dlzky dielika teplomera

    :param dlzka: dlzka ciary dielika teplomera
    :type dlzka: float
    :param rozstup: dlzka rozstupu medzi ciarami dielikov teplomera
    :type rozstup: float
    :rtype: None
    '''
    kor.up()
    kor.color('black')
    kor.forward(dlzka / 2)
    kor.write(34.0)

    kor.right(90)
    kor.forward((360 - 340) * rozstup)
    kor.right(-90)
    kor.write(36.0)

    kor.right(90)
    kor.forward((370 - 360) * rozstup)
    kor.right(-90)
    kor.write(37.0)

    kor.right(90)
    kor.forward((385 - 370) * rozstup)
    kor.right(-90)
    kor.write(38.5)

    kor.right(-90)
    kor.forward((385 - 340) * rozstup)
    kor.right(90)
    kor.forward(-dlzka / 2)

Napokon v jazyku Imagine Logo napíšeme procedúru kresli, ktorá vyvolá procedúry kresliDieliky a kresliCisla:

;Imagine Logo

viem kresli :dlzka :rozstup
  kresliDieliky :dlzka :rozstup
  kresliCisla :dlzka :rozstup
koniec

V jazyku Python na začiatku výsledného programu importujeme modul turtle, doplníme funkciu kresli bez výstupov, ktorá vyvolá funkcie kresliDieliky, kresliCisla:

# Python

import turtle
kor = turtle.Turtle()
plocha = turtle.Screen()

def kresliDieliky(dlzka, rozstup): ...

def kresliCisla(dlzka, rozstup): ...

def kresli(dlzka, rozstup):
    '''
    Nakresli stupnicu teplomera aj s vyznacenim hranicnych hodnot.

    :param dlzka: dlzka ciary dielika teplomera
    :type dlzka: float
    :param rozstup: dlzka rozstupu medzi ciarami dielikov teplomera
    :type rozstup: float
    :rtype: None
    '''
    kresliDieliky(dlzka, rozstup)
    kresliCisla(dlzka, rozstup)

kor.speed(0)
kor.left(90)
kor.hideturtle()
kresli(50, 4)
plocha.mainloop()

Táto súťažná úloha je zameraná na použitie stratégie riešenia problému rozdelenie problému do podproblémov, na prácu s procedúrami (resp. funkciami bez výstupov) s parametrami, príkazmi opakovania a viacnásobného vetvenia, príkazmi korytnačej grafiky, na presný výpočet počtu dielikov na základe počtu hodnôt hraničných teplôt.

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

Do riešenia tejto úlohy pre kategóriu PROFÍK sa zapojilo 28 z 38 prihlásených tímov. Všetkých 28 tímov riešilo úlohu v jazyku Imagine Logo. Jazyk Python si nevybral na riešenie žiaden tím. Celkový priemer úspešnosti odovzdaných riešení bol 3,2 bodu z maximálneho počtu 6 bodov (53,0% úspešnosť).

V riešeniach sme zaregistrovali nasledovné nedostatky:

  • iba jeden tím (ZuzanaKE) použil pri vykresľovaní parameter (dĺžku dielika), ostatné tímy vykresľovanli dieliky s pevnou dĺžkou a pevným rozstupom dielikov,
  • v piatich riešeniach súťažiaci použili aj príkazy korytnačej aj karteziánskej grafiky,
  • v štyroch riešeniach súťažiaci nastavovali farbu pera v tele cyklu (neefektívne) namiesto jedného nastavenia farby pera pred cyklom,
  • nepresné vykresľovanie dielikov, napr. nedodržanie hornej hranice 42.0 °C, nepresné počty dielikov v oblastiach určenými hraničnými hodnotami teplôt,
  • nepresné vykreslenie hodnôt teplôt, napr. len na základe odhadu pozície alebo pomocou textových polí.

Štyri tímy z kategórie expert, ktoré riešili túto úlohu si nevšimli, že úloha je určená len pre kategóriu profík. Podľa pravidiel súťaže sme im nemohli za túto úlohu udeliť žiaden bod.