Autorské riešenie
Pri riešení úlohy najprv overíme, či zadané vstupné hodnoty a1, a2, a3, n1, n2 spĺňajú podmienky podľa zadania, t. j. a1 > a2 > a3, n1 > n2. Ak je splnená uvedená podmienka, potom môžu nastať 5 rôznych situácií:
Procedúra vypocet s 5 parametrami (dĺžkami krídla, trupu a chvostu pôvodného lietadla, dlžkami dlhšej a kratšej paličky nového lietadla), môže v jazyku Imagine Logo vyzerať napríklad takto: ;Imagine Logo A riešenie úlohy v jazyku Python môže vyzerať napríklad takto: #Python def vypocet(a1, a2, a3, n1, n2): ''' Pre zadane dĺžky a1, a2, a3, n1, n3 vypočíta dĺžku n3 tretej paličky pre nové lietadlo :param a1: dĺžka krídla (najdlhšej paličky) :type a1: float :param a2: dĺžka trupu (prostrednej paličky) :type a2: float :param a3: dĺžka chvostu (najkratšej paličky) :type a3: float :param n1: dĺžka dlhšej novej paličky :type n1: float :param n2: dĺžka kratšej novej paličky :type n2: float :rtype: list ''' if n1 / n2 == a1 / a2 == a2 / a3 : return "krídlo (1. palička)", n1 * a1 / a2, "chvost (3. palička)", n2 * a3 / a2 elif n1 / n2 == a2 / a3: return "krídlo (1. palička)", n1 * a1 / a2 elif n1 / n2 == a1 / a2: return "chvost (3. palička)", n2 * a3 / a2 elif n1 / n2 == a1 / a3: return "trup (2. palička)", n1 * a2 / a1 else: return "úloha nemá riešenie" print(vypocet(80, 40, 20, 60, 30)) # ('krídlo (1. palička)', 120.0, # 'chvost (3. palička)', 15.0) print(vypocet(80, 60, 40, 36, 24)) # ('krídlo (1. palička)', 48.0) print(vypocet(80, 60, 40, 48, 36)) # ('chvost (3. palička)', 24.0) print(vypocet(80, 60, 40, 48, 24)) # ('trup (2. palička)', 36.0) print(vypocet(80, 60, 40, 72, 40)) # úloha nemá riešenie Iné komplexnejšie riešenie úlohy v jazyku Python, v ktorom pomocou výnimiek ošetrujeme typy aj hodnoty vstupov, môže vyzerať napríklad takto: #Python def jeCislo(x): return type(x) in (int, float) def vypocet(a1, a2, a3, n1, n2): ''' Pre zadane dĺžky a1, a2, a3, n1, n3 vypočíta dĺžku n3 tretej paličky pre nové lietadlo :param a1: dĺžka krídla (najdlhšej paličky) :type a1: float :param a2: dĺžka trupu (prostrednej paličky) :type a2: float :param a3: dĺžka chvostu (najkratšej paličky) :type a3: float :param n1: dĺžka dlhšej novej paličky :type n1: float :param n2: dĺžka kratšej novej paličky :type n2: float :rtype: set of tuple ''' if not (jeCislo(a1) and jeCislo(a2) and jeCislo(a3) and jeCislo(n1) and jeCislo(n2)): raise TypeError("nie všetky zadané hodnoty sú čísla") if not ((a1 > a2 > a3) and (n1 > n2)): raise ValueError("zadané vstupné hodnoty nie sú usporiadané alebo sú si rovné") vysledok = set() if n1 / n2 == a1 / a3: vysledok.add(("trup (2. palička)", n1 * a2 / a1)) return vysledok if n1 / n2 == a2 / a3: vysledok.add(("krídlo (1. palička)", n1 * a1 / a2)) if n1 / n2 == a1 / a2: vysledok.add(("chvost (3. palička)", n2 * a3 / a2)) return vysledok try: print(vypocet(80, 60, 40, 48, 24)) # {('trup (2. palička)', 36.0)} #print(vypocet(80, 60, 40, 36, 24)) # {('krídlo (1. palička)', 48.0)} #print(vypocet(80, 60, 40, 48, 36)) # {('chvost (3. palička)', 24.0)} #print(vypocet(80, 40, 20, 60, 30)) # {('krídlo (1. palička)', 120.0|, # ('chvost (3. palička)', 15.0)} #print(vypocet(80, 60, 40, 72, 40)) # set() ... úloha nemá riešenie #print(vypocet(80, 60, 40, 72, 80)) # zadané vstupné hodnoty nie sú usporiadané # alebo sú si rovné #print(vypocet(80, 60, 40, 72, "a")) # nie všetky zadané hodnoty sú čísla except ValueError as chyba: print (chyba) except TypeError as chyba: print (chyba) Táto súťažná úloha je zameraná na použitie logického myslenia a dôslednosť uvažovania (ošetrenie vstupov a výstupov), na precvičenie použitia procedúr s parametrami a s výstupom, resp. funkcií s parametrami, na precvičenie práce s príkazmi priradenia, vetvenia a zloženými podmienkami. Vaše zaujímavé riešenia a najčastejšie chyby Do riešenia tejto úlohy sa zapojilo 10 tímov kategórie EXPERT a 0 tímov kategórie GURU. Len 1 tím (Oravska Lesna 1) získal plný počet bodov, k čomu im gratulujeme. Jeden tím (Bubak) vyriešil úlohu pre neusporiadané vstupy. Len jeden tím overoval usporiadanosť vstupov, za čo sme neudeľovali body. Súťažiaci dosiahli priemerný počet bodov 4,2 z možných 6 bodov. 2 tímy (Dakto, aa) riešili úlohu v jazyku Python a 8 tímov v jazyku Imagine Logo. V riešeniach sme zaregistrovali nasledovné chyby:
Pri riešení odporúčame použiť testovacie údaje pre overenie správnosti svojho riešenia. Rovnako odporúčame namiesto procedúr s výpisom používať funkcie vracajúce výslednú hodnotu, ktorú môžme nielen vypísať, ale aj inak spracovať. |
|||||||||
© Univerzita Pavla Jozefa Šafárika v Košiciach, Prírodovedecká fakulta, Ústav informatiky palmaj (zavinac) upjs.sk |