Autorské riešenie
Úlohou bolo vytvoriť procedúru, ktorá dokáže určiť moment, v ktorom je nutné vypnúť vypúšťacie čerpadlo a zapnúť napúšťacie čerpadlo pre bazén. Vieme, že objem bazéna pred a po napúšťaní môže byť rôzny a tiež, že prietok vypúšťacieho a napúšťacieho čerpadla môže byť rôzny. Na začiatku si musíme uvedomiť, aké rôzne situácie môžu nastať:
V prvom prípade, máme na začiatku tak veľa vody v bazéne, alebo taký úzky prietok čerpadla, že vodu nestihenme vypustiť na požadovanú úroveň vody na konci. Vypočítame teda, na akú úroveň by sme sa dostali, ak by sme všetok čas venovali iba vypúšťaniu. Ak na konci stále zostane viac vody, ako požadujeme, vieme, že úloha nemá riešenie. ;Imagine
logo
ak :vodaZ-(:prietokVyp*:cas)>:vodaK [ pis [Uloha nema riesenie] ukonci ] V druhom prípade, máme na konci požiadavku na tak veľa vody v bazéne, alebo taký úzky prietok čerpadla, že vodu nestihenme napustiť na požadovanú úroveň vody na konci. Vypočítame teda, na akú úroveň by sme sa dostali, ak by sme všetok čas venovali iba napúšťaniu. Ak na konci stále budeme mať menej vody, ako požadujeme, vieme, že úloha nemá riešenie. ;Imagine
logo
ak :vodaZ+(:prietokNap*:cas)<:vodaK [ pis [Uloha nema riesenie] ukonci ] Tretí a štvrtý prípad vieme vybaviť naraz. Predstavme si, že stihneme vypustiť a napustiť všetku vodu v bazéne. Spočítame, ako dlho nám bude trvať vypúšťanie a napúšťanie celého bazénu. Potom si overíme, či to naozaj stihneme urobiť v zadanom čase. Ak áno, vypíšeme hodnotu kedy je nutné zapnúť napúšťacie čerpadlo. ;Imagine
logo
urobTu "vypust :vodaZ/:prietokVyp urobTu "napust :vodaK/:prietokNap pis [Pocet minut po ktorom zapneme napustaci ventil:] ak :vypust+:napust<=:cas [ pis :cas-:napust ukonci ] Posledný prípad je najnáročnejší. Najlepšie si ho ukážeme, keď použijeme rovnice lineárnych funkcií, ktorými si znázorníme vypúšťanie a napúšťanie bazéna. V bode, v ktorom sa tieto funkcie pretnú, je potom nutné vypnúť vypúšťacie čerpadlo a zapnúť napúšťacie čerpadlo.
Odvodením predpisov týchto funkcií a následným hľadaním ich prieniku dostaneme rovnicu jednoduchú rovnicu: div class="code"> ;Imagine logourobTu "citatel :vodaZ-:vodaK+(:prietokNap*:cas) urobTu "menovatel :prietokNap+:prietokVyp urobTu "priesecnik :citatel/:menovatel Tým sme pokryli všetky potenciálne prípady. Celý kód v Imagine a Pythone vyzerá nasledovne. ;Imagine
logo
Pythonviem vymenVodu :vodaZ :prietokVyp :vodaK :prietokNap :cas ak :vodaz-(:prietokVyp*:cas)>:vodaK [ pis [Uloha nema riesenie] ukonci ] ak :vodaZ+(:prietokNap*:cas)<:vodaK [ pis [Uloha nema riesenie] ukonci ] urobTu "vypust :vodaZ/:prietokVyp urobTu "napust :vodaK/:prietokNap pis [Pocet minut po ktorom zapneme napustaci ventil:] ak :vypust+:napust<=:cas [ pis :cas-:napust ukonci ] urobTu "citatel :vodaZ-:vodaK+(:prietokNap*:cas) urobTu "menovatel :prietokNap+:prietokVyp urobTu "priesecnik :citatel/:menovatel pis :priesecnik koniec def vymenVodu(vodaZ, prietokVyp, vodaK, prietokNap, cas): if(vodaZ-(prietokVyp*cas) > vodaK): print("Uloha nema riesenie.") elif(vodaZ+(prietokNap*cas) < vodaK): print("Uloha nema riesenie.") elif(vodaZ/prietokVyp+vodaK/prietokNap <= cas): print('Napustaci ventil zapneme po'+repr(cas-vodaK/prietokNap)+'minutach.') else: citatel = vodaZ-vodaK+(prietokNap*cas) menovatel = prietokNap+prietokVyp print('Napustaci ventil zapneme po ' + repr(citatel/menovatel) + ' minutach.') Vaše zaujímavé riešenia a najčastejšie chyby Najväčší problém robil riešiteľom posledný spomenutý prípad v riešení, čo bolo aj očakávané. Niektorí riešitelia úlohu zrejme nepochopili dobre, pretože za riešenie považovali iba tie prípady, v ktorých vieme vypustiť celý bazén a nie len jeho časť. Ďalším problémom bolo určenie prípadov, keď úloha nemá riešenie. Niektorí riešitelia napríklad uvádzali záporné čísla, prípadne časy, ktoré presahovali povolený časový rozsah, no neuviedli pri tom, že to je vlastne zlé, resp. nerealizovateľné riešenie. Niektorí riešitelia zvolili prístup v ktorom si najprv vyriešili problém s rozdielomm medzi objemom vody na konci a na začiatku a potom už riešili akoby redukovanú úlohu, v ktorej bol objem na konci aj na začiatku rovnaký. |
||||||||||
© Univerzita Pavla Jozefa Šafárika v Košiciach, Prírodovedecká fakulta, Ústav informatiky palmaj (zavinac) upjs.sk |