Autorské riešenie
[stiahni]

Pri riešení tejto úlohy sa nezaobídeme bez znalosti práce so zlomkami - budeme ich násobiť, sčítavať, odčítavať.

Najprv sa zorientujme v textových riadkoch, ktorých je na obrazovke hneď niekoľko:

  • riadky c1 a m1 reprezentujú zlomok c1/m1, ktorý vyjadruje časť torty od tety Anky,
  • riadky c2 a m2 reprezentujú zlomok c2/m2, ktorý vyjadruje časť torty, ktorá bola na stole u tety Betky pri príchode Janka,
  • riadky c3 a m3 reprezentujú zlomok c3/m3, ktorý vyjadruje časť zo zvyšku torty od tety Betky pre Janka,
  • riadky c4 a m 4 reprezentujú zlomok c4/m4, ktorý vyjadruje časť Jankovej "výslužky", s ktorom sa podelil s tetou Cecilkou,
  • riadky vc a vm reprezentujú zlomok vc/vm, ktorý vyjadruje časť torty, ktorú Janko priniesol domov. Hodnoty týchto riadkov vypočítame na základe hodnôt predchádzajúcich riadkov.

Výpočet najprv popíšme slovne aj pomocou matematických operácií, použijeme premenné, ktoré sa objavia v procedúre:

  • Janko od tety Anky dostal c1/m1 z celej torty.
  • Od tety Betky dostal Janko (c2/m2).(c3/m3) z celej torty. Vynásobením dvoch zlomkov získame nový zlomok c5/m5, ktorý vyjadruje, akú časť celej torty získal Jano u tety Betky.
  • Zatiaľ má teda (c1/m1) + (c5/m5) z celej torty. Sčítaním týchto dvoch zlomkov získame nový zlomok c6/m6, ktorý vyjadruje, akú časť celej torty získal Janko spolu od tety Anky a tety Betky.
  • U tety Cecilky vybral z balíčka (c4/m4).(c6/m6) z celej torty. Výsledkom tohto súčinu je zlomok c7/m7, ktorý vyjadruje, akú časť celej torty zjedli Janko a teta Cecilka.
  • Jankovi v balíčku zostalo z torty (c6/m6) - (c7/m7). Výsledkom rozdielu je zlomok c8/m8, ktorý vyjadruje časť celej torty, ktorú si Janko priniesol domov.

Keďže výsledok máme vypísať v tvare zlomku, počas výpočtu budeme pracovať s čitateľmi a menovateľmi zlomkov.

viem torta
 ;torta od tety Betky
 urobtu "c5 c2'hodnota*c3'hodnota
 urobtu "m5 m2'hodnota*m3'hodnota

 ;torta od tety Anky a tety Betky
 urobtu "c6 c1'hodnota*:m5+m1'hodnota*:c5
 urobtu "m6 m1'hodnota*:m5

 ;torta pre tetu Cilku
 urobtu "c7 c4'hodnota*:c6
 urobtu "m7 m4'hodnota*:m6

 ;Jankovi ostalo
 urobtu "c8 :c6*:m7-:c7*:m6
 urobtu "m8 :m6*:m7

 vc'nechhodnota :c8
 vm'nechhodnota :m8
koniec

Po správnom výpočte založenom na predchádzajúcom postupe získame zlomok c8/m8, ktorý vyjadruje časť celej torty, ktorú Jano priniesol domov. Podľa zadania úlohy musíme upraviť tento zlomok na základný tvar.

Uvádzame jedno z možných riešení.

viem torta
 ;torta od tety Betky
 urobtu "c5 c2'hodnota*c3'hodnota
 urobtu "m5 m2'hodnota*m3'hodnota

 ;torta od tety Anky a tety Betky
 urobtu "c6 c1'hodnota*:m5+m1'hodnota*:c5
 urobtu "m6 m1'hodnota*:m5

 ;torta pre tetu Cilku
 urobtu "c7 c4'hodnota*:c6
 urobtu "m7 m4'hodnota*:m6

 ;Jankovi ostalo
 urobtu "c8 :c6*:m7-:c7*:m6
 urobtu "m8 :m6*:m7

 ;úprava zlomku c8/m8 na základny tvar
 urobtu "d 2
 ak2 :c8<:m8 [urobtu "mensi :c8][urobtu "mensi :m8]

 kym [:d<=:mensi]
         [ak2 zaroven zvysok :c8 :d = 0 zvysok :m8 :d = 0
          [urobtu "c8 cpodiel :c8 :d
           urobtu "m8 cpodiel :m8 :d
           ak2 :c8<:m8 [urobtu "mensi :c8][urobtu "mensi :m8]
          ]
          [urobtu "d :d+1]
         ]

 ;výpis hodnôt
 vc'nechhodnota :c8
 vm'nechhodnota :m8
koniec

Použili sme novú premennú d. Jej hodnotou sa budeme snažiť deliť hodnotu čitateľa (c8) a menovateľa (m8) (samozrejme, ak ňou budú zároveň obidve hodnoty deliteľné bezo zvyšku).

Potrebujeme ohraničiť hodnotu d, ktorú budeme postupne zvyšovať. Tou hranicou bude menšia z hodnôt c8 a m8, ktorú budeme uchovávať v premennej mensi.

Cyklus ukončíme, ak hodnota premennej d presiahne hodnotu premennej mensi. Inak zistíme, či sú čitateľ i menovateľ zlomku deliteľné hodnotou premennej d. Ak áno, predelíme ich a určíme novú hodnotu premennej mensi. Ak čitateľ a menovateľ nie sú deliteľné hodnotou premennej d, zväčšíme hodnotu o 1.

Možno sa pýtate, prečo nezväčšujeme hodnotu premennej d aj po predelení čitateľa a menovateľa. Odpoveď je jednoduchá - aj po predelení hodnotou d môžu byť čitateľ a menovateľ opäť deliteľné hodnotou d.

Možné vylepšenie - Euklidov algoritmus

Pomocou Euklidovho algoritmus vieme nájsť najväčšieho spoločného deliteľa dvoch čísel A, B. Postup je založený na postupnej úprave hodnôt A a B postupným odpočítavaní vždy menšej z hodnôt A a B od väčšej. Tento postup sa opakuje, kým sa hodnoty A a B nerovnajú. Po ukončení tohto postupu je hodnota A (a aj B) hľadaným najväčším spoločným deliteľom.

Príklad: V ľavej časti môžete sledovať hľadanie najväčšieho spoločného deliteľa čísel 42 a 12, v pravej časti čísel 7 a 2.

A B
42
12
30
12
18
12
6
12
6
6
A B
7
2
5
2
3
2
1
2
1
1

Zlomok c8/m8 teda upravíme tak, že nájdete najväčšieho spoločného deliteľa čísel c8, m8. Samozrejme, ak je čitateľ rovný nule, nie je potrebné hľadať najväčšieho spoločného deliteľa. V opačnom prípade použijeme pomocné premenné a, b, ktoré budú na začiatku obsahovať hodnoty premenných c8 a m8. Robíme to preto, lebo v závere budeme ešte potrebovať pôvodné hodnoty c8 a m8.

 ;uprava zlomku c8/m8 na zakladny tvar
 ak :c8 <> 0 [urobtu "a :c8
              urobtu "b :m8
              kym [:a <> :b]
                  [ak2 :a<:b [urobtu "b :b-:a][urobtu "a :a-:b]
                  ]
              urobtu "c8 cpodiel :c8 :a
              urobtu "m8 cpodiel :m8 :a
             ]

 ;výpis hodnôt
 vc'nechhodnota :c8
 vm'nechhodnota :m8
koniec

Výhodou tohto algoritmu je to, že základný tvar zlomku získame podstatne rýchlejšie.

Úpravou Euklidovho algoritmu získame ešte rýchlejší postup riešenia úlohy. Namiesto odčítania použijeme zvyšok po delení dvoch čísel. Deliť budeme vždy väčšie číslo menším dovtedy, kým jedna z premenných nenadobudne hodnotu 0.

A B
42
12
6
12
6
0
A B
7 2
1 2
1 0

Ak porovnáme tabuľku s príkladom postupu klasického Euklidovho algoritmu s touto novou tabuľkou, vidíme, že už pri malých číslach dosahujeme výrazne zrýchlenie. Pri číslach, ktoré vznikajú v našej úlohe, je tento rozdiel ešte výraznejší.

 ;úprava zlomku c8/m8 na základny tvar
 ak :c8 <> 0
 [ak2 :c8<:m8
  [urobtu "mensi :c8 urobtu "vacsi :m8]
  [urobtu "mensi :m8 urobtu "vacsi :c8]
 kym [:mensi <> 0]
     [urobtu "vacsi zvysok :vacsi :mensi
      ak :vacsi<:mensi
      [urobtu "p :mensi
       urobtu "mensi :vacsi
       urobtu "vacsi :p
      ]
      urobtu "c8 cpodiel :c8 :vacsi
      urobtu "m8 cpodiel :m8 :vacsi
     ]

 ;výpis hodnôt
 vc'nechhodnota :c8
 vm'nechhodnota :m8
koniec

Ak pozorne študujete autorské riešenia, určite si spomeniete na podobnú výmenu hodnôt dvoch premenných z úlohy o predkoch trúda - dokážete výmenu hodnôť premenných vacsi a mensi zrealizovať bez použitia pomocnej premennej p?

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

Niektorí z vás zaviedli nové premenné, do ktorých uložili hodnoty textových políčok - nebolo to potrebné, mohli ste pracovať priamo s c1, m1 atď.

Pri hľadaní výsledného zlomku ste zvládli výpočet jeho menovateľa, pri čitateli sa objavili preklepy (namiesto mínus ste napísali plus) alebo ste pri jeho výpočte používali delenie (/) - výsledkom však už potom bolo nesprávne číslo.

Do hľadania najväčšieho spoločného deliteľa sa pustili len niekoľkí z vás. Použili ste postup, ktorý nájdete v autorskom riešení pod názvom "Euklidov postup hľadania NSD". Jeden tím dokonca použil vylepšenie tohto postupu (namiesto odpočítavania delil). Zaujímavé je, že niektoré tímy použili pri zápise tohto postupu rekurziu - úloha je vyriešená správne, no ak je možné vyriešiť ju bez použitia rekurzie, skúste to. V tomto prípade je možné nahradiť rekurziu obyčajným cyklom.

Náznak postupu, o ktorom sme predpokladali, že bude najčastejší, sa objavil v jednom riešení (postupné skúmanie deliteľnosti čitateľa a menovateľa číslami 2, 3, 5 atď.), len nebol úplne dotiahnutý do úspešného konca.