ODWROTNA NOTACJA POLSKA UNIWERSYTET PEDAGOGICZNY IM. KOMISJI EDUKACJI NARODOWEJ W KRAKOWIE ODWROTNA NOTACJA POLSKA
Pojęcia użyte w prezentacji Podsumowanie Ojcowie i idea ONP Algorytmy: - zamiany postaci infiksowej wyrażenia na postać ONP; - obliczania wartości wyrażeń w postaci ONP; - zamiany postaci ONP wyrażenia na postać infiksową. Coś dla głowy Pojęcia użyte w prezentacji Podsumowanie
Lata 20-te ubiegłego wieku: Ojcowie i idea ONP Lata 20-te ubiegłego wieku: Polski filozof i matematyk Jan Łukasiewicz (1878-1956) opracowuje prefiksowy sposób zapisywania wyrażeń (arytmetycznych, algebraicznych i logicznych): najpierw operator, a potem argumenty, np. +23 oznacza 2+3. Nazywa go Notacją Polską. Lata 50-te ubiegłego wieku: Australijski filozof i pionier informatyki Charles Hamblin (1922-1985) proponuje odwrócenie Notacji Polskiej – tak powstaje postfiksowy zapis wyrażeń: najpierw argumenty, a potem operator. Tak powstaje Odwrotna Notacja Polska (ONP), z ang. Reverse Polish Notation (RPN). Powrót
Przykłady zapisu wyrażeń algebraicznych w ONP Zapis infiksowy (tradycyjny) Zapis postfiksowy (ONP) a + b a b + a + b + c a b + c + (ab+ stanowi pierwszy argument drugiego dodawania) (a + b) * c a b + c * c * (a + b) c a b + * (a + b) * c + d a b + c * d + (a + b) * c + d * a a b + c * d a * + (a + b) * c + d * (a + c) a b + c * d a c + * + (a + b) * c + (a + c) * d a b + c * a c + d * + (2 + 5) / 7 + 3 / 5 2 5 + 7 / 3 5 / + Można sprawdzić poprawność ich obliczania na rzeczywistym kalkulatorze wykorzystującym ONP (wystarczy nacisnąć na pingwinka) Powrót
Korzyści stosowania notacji ONP ONP oszczędza czas i naciśnięcia klawiszy. Nie trzeba się martwić o nawiasy podczas obliczeń. Cały proces liczenia jest podobny do sposobu, w jakim się liczy na papierze. Pośrednie wyniki pozwalają użytkownikowi na ich sprawdzenie i poprawienie błędów. Łatwiej jest kontrolować przebieg obliczeń. Użytkownik określa priorytet operatorów. Ponieważ podwyrażenia są obliczane w miarę jak są wpisywane, błędy wprowadzenia są bardziej oczywiste przy ONP. W kalkulatorach algebraicznych, opuszczenie nawiasu otwierającego może prowadzić do błędu obliczeń, który ujawni się dużo później, dopiero, gdy całe wyrażenie zostanie obliczone. Przykłady Powrót
Nie tylko kompetencja, ale i elegancja Wyrażenie Operacje konieczne do obliczenia wartości wyrażenia na standardowym kalkulatorze na kalkulatorze ONP (RPN) (8 + 6)(7 - 5) [8] [+] [6] [=] [M+] [7] [-] [5] [x] [MR] [=] 11 naciśnięć klawiszy [8] [ENTER] [6] [+] [7] [ENTER] [5] [-] [x] 9 naciśnięć klawiszy [(8 + 6)(7 - 5)] / (9 - 7) [8] [+][6] [=] [M+] [7] [-] [5] [x] [MR] [=] [MC] [M+] [9] [-] [7] [/] [MR] [=] [MC] [M+] [1] [/] [MR] [=] 25 naciśnięć klawiszy i pomysłowość [8] [ENTER] [6] [+] [7] [ENTER] [5] [-] [x] [9] [ENTER] [7] [-] [/] 14 naciśnięć klawiszy 2 sin(45+2^3) [4] [5] [+] [2] [^] [3] [=] [sin] [*] [2] [=] [2] [ENTER] [3] [^] [4] [5] [+] [sin] [2] [x] 10 naciśnięć klawiszy Powrót
Algorytm zamiany postaci infiksowej wyrażenia na postać ONP START Pobierz symbol z lewej ku prawej T WYJŚCIE Argument STOS T N ( Zawartość stosu aż do „(” na wyjście T N ) STOS T Operator N Czy wyższy w stosie do „(” lub dna T Zawartość stosu do „(” lub do dna na wyjście N Φ N BŁĄD N T Stos na wyjście KONIEC Powrót
Przykład zamiany postaci infiksowej wyrażenia na postać ONP Dokonać konwersji wyrażenia typu: (a + b) * c + d * a Stos Wyjście Stos Wyjście Stos Wyjście ( * ab + + * ab + c * d ( a * ab + c c ab + c * da a + * ( + a + ab + c * * ab + c * da * * + Symbole wyrażenia w postaci infiksowej pobierane są z lewej ku prawej. 1. Nawias otwierający „(” wchodzi na stos. Argument „a” wchodzi na wyjście. Operator „+” na stos. 4. Argument „b” na wyjście. 5. Nawias zamykający „)” zbiera wszystko do znaku „(” i daje na wyjscie. 6. Operator „*” na stos. 7. Argument „C” na wyjście. 8. Operator „+” na stos, a ze stosu mający wyższy priorytet operator „*” na nwyjście. 9. Argument „d” na wyjście. 10. Operator „*” na stos, a operator „+” zostaje na dnie stosu, ponieważ ma niższy priorytet niż „*”. 11. Argument „a” na wyjście. 12. Na wejściu nie ma już nic, więc ze stosu operatory są zabierane od góry na wyjście: najpierw „*” potem „+”. ( ab b + + ab + c * d d ab + c * da * + + ) ab + + Wynik konwersji: ab + c * da * + Powrót
Algorytm obliczania wartości wyrażeń w postaci ONP START Pobierz symbol z lewej ku prawej STOS T Argument Pobierz argumenty ze stosu, wykonaj działanie, wynik na stos T Operator N Istotna rzecz: Po wystąpieniu operatora ze stosu pobierane są do wykonania działania zawsze dwa ostatnie argumenty. Φ N BŁĄD N KONIEC T Powrót
Przykład obliczania wartości wyrażeń w postaci ONP Obliczyć wartość wyrażenia: 59+2*65*+ 5 9 5 + 14 2 14 * 28 6 28 5 28 6 * 28 30 + 58 Symbole wyrażenia w ONP również pobierane są z lewej ku prawej 1. 2. Do pustego stosu zapisywany jest argument „5”. 3. Argument „9” na stos. 4. Operator „+” powoduje pobranie argumentów „5” i „9” ze stosu, wykonanie działania zgodnego z operatorem oraz zapisanie wyniku „14” na stosie. 5. Argument „2” na stos. 6. Operator „*” powoduje pobranie argumentów „2” i „14” ze stosu, wykonanie działania zgodnego z operatorem oraz zapisanie wyniku „28” na stosie. 7. Argument „6” na stos. 8. Argument „5” na stos. 9. Operator „*” powoduje pobranie dwóch ostatnich argumentów „5” i „6” ze stosu, wykonanie działania zgodnego z operatorem oraz zapisanie wyniku „30” na stosie. 10. Operator „+” powoduje pobranie argumentów „30” i „28” ze stosu, wykonanie działania zgodnego z operatorem oraz zapisanie wyniku „58” na stosie. 11. Ponieważ na wejściu nie ma już nic wynik działania ze stosu podawany jest na wyjście. Wartość wyrażenia: 58 Powrót
Algorytm zamiany postaci ONP wyrażenia na postać infiksową START Pobierz symbol z lewej ku prawej STOS T Argument Zbierz ze stosu dwa ostatnio podane argumenty i wstaw między nie operator (argumentem może być utworzone wcześniej wyrażenie ujęte w nawias) T Operator N Φ N BŁĄD N T Stos na wyjście KONIEC Powrót
Przykład zamiany postaci ONP wyrażenia na postać infiksową Dokonać konwersji wyrażenia typu: ab / cd – c * + a b a ÷ a b c ÷ a b d ÷ a b c * ÷ a b - c d - ÷ a b c d c ÷ a b - d + ÷ a b - c d * Tutaj również symbole pobierane są z lewej ku prawej. 2. Na pusty stos zapisywany jest argument „a”. 3. Argument „b” na stos. 4. Operator „/” powoduje następujące działanie: zabranie ze stosu dwóch ostatnio zapisanych argumentów „a” i „b”, wstawienie pomiędzy nie operatora „/” oraz zapisanie wyrażenia „a/b” na stosie. 5. Argument „c” na stos. 6. Argument „d” na stos. 7. Operator „-” powoduje następujące działanie zabranie: ze stosu dwóch ostatnio zapisanych argumentów „c” i „d”, wstawienie pomiędzy nie operatora „-” oraz zapisanie wyrażenia „c-d” na stosie. 8. Argument „c” na stos. 9. Operator „*” powoduje następujące działanie: zabranie ze stosu dwóch ostatnio zapisanych argumentów „c” i „c-d”, wstawienie pomiędzy nie operatora „*” oraz zapisanie wyrażenia „(c-d)*c” na stosie. Argument „c-d” zapisywany jest na stosie w nawiasach ponieważ jest wyrażeniem a nie pojedynczą cyfrą czy liczbą. 10. Operator „+” powoduje następujące działanie: zabranie ze stosu dwóch ostatnio zapisanych argumentów wyrażenia „(c-d)*c” i wyrażenia „a/b”, wstawienie pomiędzy nie operatora „+” oraz zapisanie wyrażenia „a/b+(c-d)*c” na stosie. 11. Ponieważ na wejściu nie ma już nic wynik konwersji ze stosu podawany jest na wyjście. Wynik konwersji: a / b + (c - d) * c Powrót
Dla leniwych lub niedowiarków – odpowiedzi A teraz coś dla głowy Zamień na ONP: a / c / d + b / c / d a / (c * d) + b / (c * d) (a + b) / c / d (a + b) / (c * d) 2. Zamień z ONP na zapis infiksowy (^ oznacza potęgowanie): a b * c d * e / – a 5 / c 7 / e d – 9 / * + a 3 + b / d e + 6 ^ – d c – 7 b * 2 ^ / Dla leniwych lub niedowiarków – odpowiedzi Powrót
Odpowiedzi: Postać ONP: 2. Zapis infiksowy: a c / d / b c / d / + a b + c / d a b + c d * / 2. Zapis infiksowy: a * b – c * d / e a / 5 + c / 7 * ((e – d) / 9) (a + 3) / b – (d + e) ^ 6 (d – c) / (7 * b) ^ 2 lub: http://scriptasylum.com/tutorials/infix_postfix/infix_postfix.html Powrót
Pojęcia użyte w prezentacji ONP - Odwrotna Notacja Polska RPN - Reverse Polish Notation postać infiksowa - tradycyjny zapis wyrażeń postać prefiksowa - zapis wyrażenia w Notacji Polskiej (najpierw operator, potem argumenty) postać postfiksowa - zapis wyrażenia w Odwrotnej Notacji Polskiej (najpierw argumenty, potem operator) stos - bufor, który rządzi się zasadą LIFO (Last In First Out), czyli ostatni przyszedł, pierwszy wychodzi. Inaczej mówiąc, tylko element dodany do stosu jako ostatni możemy pobrać jako pierwszy. Powrót
Podsumowanie Wymyślenie Odwrotnej Notacji Polskiej to kolejny przykład na to, że czasem warto utrudnić życie studentom (muszą zgłębić wiedzę na jej temat), żeby ułatwić życie wszystkim. ŹRÓDŁA: http://www.spsu.edu/cs/faculty/bbrown/web_lectures/postfix/ mini przewodnik http://scriptasylum.com/tutorials/infix_postfix/infix_postfix.html postfix to infix i odwrotnie – zamiana i obliczanie wartości http://www.qiksearch.com/javascripts/postfix-to-infix.htm postfix to infix – zamiana http://www.brpreiss.com/books/opus4/html/page295.html postfix to infix http://www.brpreiss.com/books/opus4/html/page145.html#SECTION007131000000000000000 obliczanie ONP http://main.linuxfocus.org/~guido/javascript/rpnjcalc.html rzeczywisty kalkulator (można liczyć w ONP) http://www.arachnoid.com/lutusp/calc/ Powrót
DZIĘKUJĘ ZA UWAGĘ Powrót