Autorské riešenie
[stiahni imp : gui_spotreba.py, spotreba.py]

  • Počet riešiteľov: 11 / 27 = 41 %

  • Úspešnosť riešenia: 3,09 / 5 = 62 %

V tejto úlohe je našim cieľom priebežne vypočítavať dve hodnoty: celkovú priemernú spotrebu auta a priemernú spotrebu od posledného tankovania.

Pre celkovú spotrebu potrebujeme vedieť:

  • Koľko km auto prešlo celkom - tento údaj je na počítadle prejdených km.

  • Koľko litrov paliva auto spotrebovalo - tento údaj si musíme priebežne aktualizovať pri každom tankovaní tak, že budeme postupne spočítavať množstvo natankovaného paliva. Tento udaj si musíme uchovávať počas celého výpočtu.

Pre priemernú spotrebu paliva medzi dvoma tankovaniami potrebujeme vedieť:

  • Koľko km auto prešlo od posledného tankovania - tento údaj získame tak, že pri každom tankovaní od hodnoty na počítadle prejdených kilometrov odpočítame hodnotu prejdených km pri predchádzajúcom tankovaní. Počet prejdených km pri predchádzajúcom tankovaní si musíme priebežne aktualizovať a uchovávať počas celého výpočtu.

  • Koľko litrov paliva auto spotrebovalo od predchádzajúceho tankovania - toto množstvo je zhodné s množstvom práve natankovaného paliva. Ak natankujeme plnú nádrž, dotankovali sme presne toľko, koľko auto spotrebovalo od posledného tankovania (pretože aj vtedy sme natankovali plnú nádrž).

Z predchádzajúceho textu vieme, že niektoré hodnoty (celkové množstvo paliva, počet km od posledného tankovania) si musíme uchovávať počas celého výpočtu. Pre túto potrebu si môžeme vytvoriť dve globálne premenné. Na začiatku budú mať obidve hodnotu 0. 

;Imagine logo
viem noveAuto
  urob "celkomL 0
  urob "posledneTankovanieKM 0
koniec

#Python
celkomL = 0
posledneTankovanieKM = 0

Pri každom tankovaní:

  •  prečítame hodnoty, ktoré majiteľ auta zadal do okienok aplikácie - stav na počítadle km a množstvo natankovaného paliva,

  • aktualizujeme hodnoty o celkovom množstve spotrebovaného paliva a o počte prejdených km od posledného tankovania,

  • vypočítame priemernú spotrebu celkovú aj od posledného tankovania,

  • vypočítané hodnoty zapíšeme do príslušných okienok aplikácie,

  • všetko zrealizujeme v procedúre, resp. vo funkcii pocitajPriemer.

Výsledná verzia môže vyzerať nasledovne:

;Imagine logo
viem noveAuto
  urob "celkomL 0
  urob "posledneTankovanieKM 0
koniec

viem pocitajPriemer
  urobTu "pocetKM km'hodnota
  urobTu "pocetL l'hodnota
  urobTu "aktualnaPriemernaSpotreba 100*:pocetL/(:pocetKM -  :posledneTankovanieKM)
  urob "celkomL :celkomL + :pocetL
  urob "posledneTankovanieKM :pocetKM
  urobTu "celkovaPriemernaSpotreba 100 * :celkomL / :posledneTankovanieKM
  priemer'nechHodnota :aktualnaPriemernaSpotreba
  priemerCelkom'nechHodnota :celkovaPriemernaSpotreba
koniec

#Python - - spotreba.py
import gui_spotreba as gui

celkomL = 0
posledneTankovanieKM = 0
 
def pocitajPriemer():
    global celkomL
    global posledneTankovanieKM
    pocetKM = float(gui.km.get())
    pocetL = float(gui.l.get())
    aktualnaPriemernaSpotreba = 100 * pocetL / (pocetKM - posledneTankovanieKM)
    celkomL = celkomL + pocetL
    posledneTankovanieKM = pocetKM
    celkovaPriemernaSpotreba = 100 * celkomL / posledneTankovanieKM
    gui.priemer.set(str(aktualnaPriemernaSpotreba))
    gui.priemerCelkom.set(str(celkovaPriemernaSpotreba))

Všimnime si dva zaujímavé rozdiely.

V Imagine logu sú globálne premenné ("celkomL, "posledneTankovanieKM) priamo prístupné aj v procedúre. V jazyku Python ich musíme vo funkcii sprístupniť pomocou kľúčového slova global.

Imagine logo do projektu uloží aj hodnoty globálnych premenných. Preto musíme pri spustení nastaviť počiatočné hodnoty na 0. Využijeme na to procedúru noveAuto, ktorú spustíme keď začíname počítať spotrebu pre nové auto. Python hodnoty premenných do skriptov neukladá. Tu len nastavíme počiatočné hodnoty na 0. Vždy po spustení začíname teda automaticky počítať údaje pre nové auto.

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

Najviac problémov ste mali s výpočtom celkového priemeru a s pamätaním si celkového počtu km a litrov.

Niektorí z vás brali hodnotu na počítadle km ako počet km od posledného tankovania. To ale nie je problém, ak sa ostatné hodnoty počítajú správne.

Bonus pre fajnšmekrov

Pozrime sa bližšie na riešenie v jazyku Python. Aplikácia pracuje správne. Porušili sme však niekoľko pravidiel a výsledok nie je veľmi "pekný".

  • Jedna časť aplikácie sa stará o grafické rozhranie a druhá o čítanie, spracovanie a zápis dát. Bolo by šikovnejšie aby obidve časti boli pod jednou strechou.

  • Vo funkcii pocitajPriemer() pracujeme s globálnymi premennými. Pracovať s globálnymi premennými sa neodporúča, pretože to môže viesť k ťažko odhaliteľným chybám.

  • Reakciou na stlačenie tlačidla je volanie funkcie na výpočet priemernej spotreby, ktorá sa nachádza súbore spotreba.py. Volaná funkcia pracuje s políčkami, ktoré sú zase naopak definované v súbore gui_spotreba.py. Aby sme aplikáciu spustili, musíme tieto súbory importovať navzájom.

Upravme preto celý návrh aplikácie tak, aby sme sa porušeniu týchto pravidiel vyhli. Dajme všetko pod jednu strechu - vytvorme si triedu.  (pre zjednodušenie uvádzame len časť skriptu, celý skript priemernaspotreba.py):

#Python - priemernaspotreba.py
import tkinter
class PriemernaSpotreba(tkinter.Tk):
    """
    Graficka aplikacia pre vypocet priemernej spotreby auta
    """
    def __init__(self, *args, **kwargs):
        """
        Vytvori graficke rozhranie aplikacie
        """
        ...


        tkinter.Button(self, text ="Vypočítaj priemernú spotrebu",\
        command = self.pocitajPriemer).grid(row = 2, column = 0, columnspan = 2)
         ...

        self.mainloop()

    def priemernaSpotreba(self, l, km):
        """
        Vypocita priemernu spotrebu v l/100 km
        ...
        """
        return 100 * l / km

    def pocitajPriemer(self):
        """
        Precita vstupne hodnoty z fomulara a zapise vysledne hodnoty o 
        priemernej spotrebe do formulara
        """
        pocetKM = float(self.km.get())
        pocetL = float(self.l.get())
        aktualnaPriemernaSpotreba = self.priemernaSpotreba\
                                     (pocetL, pocetKM - self.posledneTankovanieKM)
        self.celkomL = self.celkomL + pocetL
        self.posledneTankovanieKM = pocetKM
        celkovaPriemernaSpotreba = self.priemernaSpotreba\
                                    (self.celkomL, self.posledneTankovanieKM)
        self.priemer.set(str(aktualnaPriemernaSpotreba))
        self.priemerCelkom.set(str(celkovaPriemernaSpotreba))

Spustenie aplikácie vyriešime v ďalšom skripte, ktorý vďaka zapúzdreniu celej funkcionality do jednej triedy bude veľmi jednoduchý (spotrebaAplikacia.py).

#Python
import priemernaspotreba as ps
aplikacia = ps.PriemernaSpotreba()