Autorské riešenie
[stiahni pizzeria.py]                                       

  • Počet riešiteľov: 4 / 4 = 100 %

  • Úspešnosť riešenia: 2,8 / 4 = 70 %                   

Máme naprogramovať stroj na rezanie pizze, ktorá podľa zadaných objednávok vypočíta, ako pizzu narezať. V zadaní boli tiež uvedené dva príklady. Na nasledujúcich obrázkoch sú zobrazené postupne Objednávky 1: 450, 900, 450, 1800 a Objednávky 2: 4500, 1350, 1350, 450, 900, 900, 900.

alternatívny text k obrázku

Vidíme, že Objednávky 1 majú v súčte menšiu plochu ako Objednávky 2, preto aj prvá pizza musí byť menšia ako druhá pizza. Teda pri vykresľovaní pizze si potrebujeme vypočítať jej polomer podľa zadaných objednávok.

Ako prvé si spočítame všetky hodnoty objednávok, čo reprezentuje obsah kruhu (pizze). Pomocou obsahu kruhu si vypočítame jeho polomer. Ponúkajú sa nám dve cesty, ako vykreslíme narezanie pizze.

  • Najprv nakreslíme kružnicu, ktorá reprezentuje obvod kruhu (pizze). Potom uskutočníme rezanie tak, že sa vždy presunieme do stredu kruhu a kreslíme čiary o dĺžke polomeru kruhu. Prechádzame zoznamom objednávok a pre každú vypočítame uhol, ktorý prislúcha percentuálnemu podielu danej objednávky podľa vzorca (objednávka / súčet objednávok) * 360.

  • Prechodom zoznamom objednávok postupne vykresľujeme kruhové výseky. Pre každú objednávku spočítame uhol pre kruhový oblúk podľa vzorca (objednávka / súčet objednávok) * 360. Použijeme príkaz circle(polomer, (objednávka / súčet objednávok) * 360). Po vykreslení jedného oblúka sa natočíme smerom do stredu kruhu a urobíme čiaru s dĺžkou polomeru kruhu. Vrátime sa späť a pokračujeme vo vykresľovaní ďalších výsekov.

Výsledný program môže vyzerať napríklad takto:

import turtle
import math


def narez_pizzu(objednavky):
    plocha = sum(objednavky)
    polomer = (plocha / math.pi) ** 0.5
    if (len(objednavky) == 1):
        pero.circle(polomer)
    else:
        for objednavka in objednavky:
            pero.circle(polomer, objednavka / plocha * 360)
            pero.left(90)
            pero.forward(polomer)
            pero.backward(polomer)
            pero.right(90)


tabula = turtle.Screen()
pero = turtle.Turtle()

objednavky = [600, 3600, 1200, 1200, 600]
narez_pizzu(objednavky)

tabula.mainloop()

Táto úloha je zameraná na:

  • použitie stratégií riešenia problémov - nakreslenie obrázku, dekompozícia problému na podproblémy,

  • precvičovanie príkazov volania funkcií s parametrami bez výstupu, for cyklu, korytnačej grafiky.

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

Do riešenia tejto úlohy sa zapojili 4 tímy z kategórie EXPERT. Srdečne gratulujeme všetkým zúčastneným!  Obzvášť blahoželáme tímu reketak za efektívne riešenie a najlepšie bodové skóre :))

Všetky tímy pracovali s korytnačou grafikou. V riešeniach bolo krásne vidieť, ako rôzne členovia tímov rozmýšľajú. Každý z tímov mal jedinečné riešenie. Boli použité vyššie spomínané spôsoby. Jeden tím použil na vykreslenie obvodu kruhu dva kruhy, kde menší biely kruh prekrýval čierny tak, že sa nám vytvorila kružnica. V jednom z riešení bolo použité načítanie vstupov z konzoly. V rámci toho bola práca so vstupom omnoho komplikovanešia. Pri podobných úlohách odporúčame vytvoriť si testovacie dáta a nepoužívať načítanie vstupu z konzoly.

Najčastejšie chyby, ktorých sa riešitelia dopúšťali:

  • určenie veľkosti polomeru kruhu bez výpočtu na základe obsahu kruhu, zadanie vlastnej veľkosti polomeru,

  • nepoužitie funkcie,

  • načítanie vstupu z konzoly, následná príliš komplikovaná práca so vstupom,

  • pri zozname objednávok s 1 prvkom vykresľovanie polomeru (pizza v takom prípade mala ostať nenarezaná),

  • použitie funkcie s viacerými parametrami.