1 Przykład wyliczania wyrażeń arytmetycznych Bogdan Kreczmer bogdan.kreczmer@pwr.wroc.pl Zakład Podstaw Cybernetyki i Robotyki Instytut Informatyki, Automatyki i Robotyki Politechnika Wrocławska Copyright c 2002 2008 Bogdan Kreczmer Strona 1 z 70 Dokument ten jest udostępniony pod warunkiem wykorzystania wyłacznie do własnych prywa tnych potrzeb i może on być kopiowany wyłacznie w całości, razem z niniejsza strona tytułowa.
- trochę historii............... 3 - ogólna idea................. 4 do RPN.................... 6 Kalkulator arytmetyczny w RPN............ 26 Strona 2 z 70
- trochę historii Odwrotna Notacja Polska (RPN - Reverse Polish Notation) opracowana została przez Jana Łukasiewicza (r. 1951). Jedna z podstawowych cech tej notacji jest to, że nie wymaga ona stosowania nawiasów. Pierwszy komputer działajacy w oparciu o notację RPN został zbudowany przez prof. Pawlaka. Niestety nie opatentował on swojego rozwiazania i firma HP skopiowała jego pomysł w swoich kalkulatorach. Strona 3 z 70
- ogólna idea Podstawa własnościa tej notacji jest to, że najpierw zapisuje się argumenty a później operatory, np.: To jest normalny zapis: 2 + 5 To już jest zapis w RPN: 2 5 + Strona 4 z 70
- ogólna idea Teraz bardziej złożony przykład. Wyrażenie w normalnej notacji: (2 + 5) 6 W notacji RPN: 2 5 + 6 Strona 5 z 70
do RPN (2 + 5) 6 Rozważmy to wyrażenie. Strona 6 z 70
do RPN (2 + 5) 6 Aby je przekształcić do notacji RPN w pierwszym kroku szukamy podwyrażenia, które musi być wykonane jako pierwsze. Strona 7 z 70
do RPN (2 + 5) 6 (2 + 5) 6 To będzie to. Strona 8 z 70
do RPN (2 + 5) 6 (2 + 5) 6 Teraz przekształcamy to podwyrażenie do postaci RPN przesuwajac operator na jego koniec. Strona 9 z 70
do RPN (2 + 5) 6 (2 + 5) 6 2 5 + 6 To otrzymujemy jako wynik tego przekształcenia. Ramka została użyta, aby oddzielić część zapisana w normalnej notacji od części zapisanej w notacji RPN Strona 10 z 70
do RPN (2 + 5) 6 (2 + 5) 6 2 5 + 6 Teraz cała procedurę powtarzamy i szukamy wyrażenia, które wykona się jako pierwsze traktujac całe wyrażenie zapisane w notacji RPN jako jedna liczbę. Strona 11 z 70
do RPN (2 + 5) 6 (2 + 5) 6 2 5 + 6 To będzie to i ponownie przekształcamy je jak poprzednio, przy czym zapis w ramce traktujemy jako liczbę. Strona 12 z 70
do RPN (2 + 5) 6 (2 + 5) 6 2 5 + 6 2 5 + 6 I tak otrzymujemy już co trzeba. Strona 13 z 70
do RPN Rozważmy jeszcze jeden bardziej złożony przykład. Strona 14 z 70
do RPN Prześledźmy jak transformować będzie się poniższe wyrażenie. (2 + 5) (3 + 1) - 7 Strona 15 z 70
do RPN (2 + 5) (3 + 1) - 7 Tak jak wcześniej najpierw szukamy podwyrażeń, które wykonaja się przed innymi. Strona 16 z 70
do RPN (2 + 5) (3 + 1) - 7 Oto i one. Strona 17 z 70
do RPN (2 + 5) (3 + 1) - 7 Sprowadzamy je do zapisu RPN poprzez przestawienie operatora. Strona 18 z 70
do RPN 2 5 + (3 + 1) - 7 Wykonujemy tę operację dla każdego nich z osobna. Strona 19 z 70
do RPN 2 5 + 3 1 + - 7 To jest rezultatem tego przekształcenia. Strona 20 z 70
do RPN 2 5 + 3 1 + - 7 Następnym działaniem, które się wykona, jest mnożenie. Wyrażenia w ramkach traktujemy jak liczby. Strona 21 z 70
do RPN 2 5 + 3 1 + - 7 Przekształcamy je w identyczny sposób jak poprzednio przestawiajac operator. Strona 22 z 70
do RPN 2 5 + 3 1 + - 7 Pominiemy wewnętrzne ramki. Strona 23 z 70
do RPN 2 5 + 3 1 + - 7 Ponownie traktujac wyrażenie w ramce jako jedna liczbę dokonujemy ostatniej transformacji dla ostatniego działania. Strona 24 z 70
do RPN 2 5 + 3 1 + 7 - W ten sposób dochodzimy do finalnej postaci wyrażenia zapisanego w notacji RPN. Strona 25 z 70
Istotna zaleta odwrotnej notacji polskiej jest to, że istnieje dla niej prosty algorytm wyliczenia wyrażenia przedstawionego w tej notacji. Strona 26 z 70
Istotna zaleta odwrotnej notacji polskiej jest to, że istnieje dla niej prosty algorytm wyliczenia wyrażenia przedstawionego w tej notacji. Algorytm ten bazuje na pojęciu prostej struktury zwanej stosem, która jest kolejka typu LIFO (ang. Last In First Out ostatni wchodzi pierwszy wychodzi). Idea tego algorytmu zostanie wyjaśniona na przykładzie, który wcześniej rozważaliśmy, a mianowicie: (2 + 5) (3 + 1) - 7 W notacji RPN: 2 5 + 3 1 + 7 - Strona 27 z 70
= Stos: Przykład, który dalej będzie przedstawiany, zorganizowany jest w następujacy sposób: Strona 28 z 70
= Stos: Na wejściu mamy wyrażenie w notacji RPN. Będzie ono czytane sekwencyjnie. Każdy jego element będzie czytany oddzielnie. Strona 29 z 70
= Stos: Wyrażenie na wejściu odpowiada wyrażeniu na dole przedstawionemu w notacji zwyczajowej. Strona 30 z 70
= Stos: Dysponujemy ponadto stosem, w którym składowane będa wczytywane liczby... Strona 31 z 70
= Stos:... oraz obszarem roboczym, w którym wykonywane będa poszczególne działania. Strona 32 z 70
= Stos: A więc zaczynamy. Strona 33 z 70
= Stos: Czytany jest pierwszy element wyrażenia. Strona 34 z 70
= Stos: 2 Ze względu na to, że jest to liczba, umieszczona zostaje ona na stosie. Strona 35 z 70
= Stos: 2 Czytany jest następny element. Strona 36 z 70
= Stos: 5 2 Podobnie jak wcześniej, w przypadku napotkania liczby umieszczamy ja na stosie. Strona 37 z 70
= Stos: 5 2 Wykonujac kolejna operację czytania dochodzimy do operatora. Strona 38 z 70
+ = Stos: 5 2 Tym razem w obszarze roboczym zrealizujemy interpretację napotkanej operacji arytmetycznej i jej wykonanie. Strona 39 z 70
+ 5 = Stos: 2 W tym celu pobieramy z wierzchołka stosu liczbę i traktujemy ja jako drugi argument danej operacji arytmetycznej. Strona 40 z 70
2 + 5 = Stos: Powtarzamy ta czynność pobierajac kolejna liczbę z wierzchołka stosu i traktujemy ja tym razem jako pierwszy argument danej operacji arytmetycznej. Strona 41 z 70
2 + 5 = 7 Stos: Wykonujemy zadana operację arytmetyczna... Strona 42 z 70
2 + 5 = 7 Stos: 7... i jej wynik umieszczamy na stosie. Strona 43 z 70
= Stos: 7 Kontynuujac operację czytania dochodzimy do natępnej liczby. Strona 44 z 70
= Stos: 3 7 Podobnie jak wcześniej umieszczamy ja na wierzchołku stosu. Strona 45 z 70
= Stos: 3 7 Ponownie wczytujemy następna liczbę... Strona 46 z 70
Stos: 1 3 7 =... i ponownie jak w poprzednich przypadkach umieszczamy ja na wierzchołku stosu. Strona 47 z 70
Stos: 1 3 7 = W wyniku realizacji kolejnej operacji czytania napotykamy operator arytmetyczny. Strona 48 z 70
Stos: 1 3 7 + = Podobnie jak wcześniej przechodzimy do interpretacji wczytanego operatora arytmetycznego i realizacji odpowiadajacej mu operacji. Strona 49 z 70
+ 1 = Stos: 3 7 W tym celu z wierzchołka stosu pobieramy liczbę traktujac ja jako drugi argument operacji. Strona 50 z 70
3 + 1 = Stos: 7 W analogiczny sposób otrzymujemy pierwszy argument tej operacji arytmetycznej. Strona 51 z 70
3 + 1 = 4 Stos: 7 Wykonujemy zadana operację... Strona 52 z 70
3 + 1 = 4 Stos: 4 7... i otrzymany wynik kładziemy na stos. Strona 53 z 70
= Stos: 4 7 W następnym kroku wczytujemy kolejny operator. Strona 54 z 70
= Stos: 4 7 Tak jak miało to miejsce wcześniej przechodzimy do interpretacji napotkanej operacji arytmetycznej. Strona 55 z 70
4 = Stos: 7 Ściagamy ze stosu drugi argument operacji... Strona 56 z 70
7 4 = Stos:... a następnie jej pierwszy argument. Strona 57 z 70
7 4 = 28 Stos: Wykonujemy operację... Strona 58 z 70
7 4 = 28 Stos: 28... i wynik umieszczamy na stosie. Strona 59 z 70
= Stos: 28 Tym razem wykonujac operację czytania napotykamy liczbę. Strona 60 z 70
= Stos: 7 28 Tak jak w każdym poprzednim przypadku kładziemy ja na stos. Strona 61 z 70
= Stos: 7 28 Kolejna operacja czytania udostępnia nam operator arytmetyczny. Strona 62 z 70
- = Stos: 7 28 I znów powtarzamy wcześniejsze czynności przechodzac do interpretacji napotkanej operacji arytmetycznej. Strona 63 z 70
- 7 = Stos: 28 Ściagamy ze stosu drugi argument operacji... Strona 64 z 70
28-7 = Stos:... a następnie jej pierwszy argument. Strona 65 z 70
28-7 = 21 Stos: Wykonujemy zadana operację. Strona 66 z 70
28-7 = 21 Stos: 21 Jej wynik umieszczamy na stosie. Strona 67 z 70
= Stos: 21 Operacja ta kończy realizację całego algorytmu i interpretację rozważanego wyrażenia arytmetycznego, gdyż na wejściu nie ma już żadnych nowych symboli. Strona 68 z 70
= Stos: 21 Warto zauważyć, że dla poprawnie zbudowanego wyrażenia po zakończeniu jego interpretacji na szczycie stosu pozostanie tylko jedna liczba (przy założeniu, że startujemy z pustym stosem). Strona 69 z 70
Wszelkie uwagi i spostrzeżenia do niniejszej prezentacji sa mile widziane. Proszę je kierować na adres kreczmer@diablo.ict.pwr.wroc.pl Strona 70 z 70