Obliczenia na stosie. Wykład 9. Obliczenia na stosie. J. Cichoń, P. Kobylański Wstęp do Informatyki i Programowania 266 / 303



Podobne dokumenty
Podstawy programowania 2. Temat: Drzewa binarne. Przygotował: mgr inż. Tomasz Michno

Wykład 8. Rekurencja. Iterować jest rzeczą ludzką, wykonywać rekursywnie boską. L. Peter Deutsch

Wstęp do programowania

Poprawność semantyczna

FUNKCJA REKURENCYJNA. function s(n:integer):integer; begin if (n>1) then s:=n*s(n-1); else s:=1; end;

Przeszukiwanie z nawrotami. Wykład 8. Przeszukiwanie z nawrotami. J. Cichoń, P. Kobylański Wstęp do Informatyki i Programowania 238 / 279

Porządek symetryczny: right(x)

Algorytmy i struktury danych. Wykład 4

Wieczorowe Studia Licencjackie Wrocław, Wykład nr 6 (w oparciu o notatki K. Lorysia, z modyfikacjami) Sito Eratostenesa

Algorytmy i struktury danych

Algorytmy i Struktury Danych

Języki programowania C i C++ Wykład: Typy zmiennych c.d. Operatory Funkcje. dr Artur Bartoszewski - Języki C i C++, sem.

Struktury danych (I): kolejka, stos itp.

Podstawy Informatyki. Wykład 6. Struktury danych

TRANSLACJA I TRANSLATORY

Paradygmaty programowania

Informacje wstępne #include <nazwa> - derektywa procesora umożliwiająca włączenie do programu pliku o podanej nazwie. Typy danych: char, signed char

Dynamiczny przydział pamięci w języku C. Dynamiczne struktury danych. dr inż. Jarosław Forenc. Metoda 1 (wektor N M-elementowy)

Składnia rachunku predykatów pierwszego rzędu

Przykładowe B+ drzewo

Podstawy programowania 2. Temat: Funkcje i procedury rekurencyjne. Przygotował: mgr inż. Tomasz Michno

Podstawy programowania. Wykład: 4. Instrukcje sterujące, operatory. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

Programowanie w Logice Przykłady programów. Przemysław Kobylański

Listy, kolejki, stosy

Rekurencja (rekursja)

Informatyka 1. Wyrażenia i instrukcje, złożoność obliczeniowa

Zadanie 1 Przygotuj algorytm programu - sortowanie przez wstawianie.

Wykład 5 Wybrane zagadnienia programowania w C++ (c.d.)

Zadanie Zaobserwuj zachowanie procesora i stosu podczas wykonywania następujących programów

Programowanie Niskopoziomowe

Programowanie dynamiczne

Drzewa binarne. Drzewo binarne to dowolny obiekt powstały zgodnie z regułami: jest drzewem binarnym Jeśli T 0. jest drzewem binarnym Np.

dr inż. Paweł Myszkowski Wykład nr 11 ( )

Struktury danych: stos, kolejka, lista, drzewo

Analiza algorytmów zadania podstawowe

Komentarze w PHP (niewykonywane fragmenty tekstowe, będące informacją dla programisty)

Podstawy informatyki 2

Algorytmy i Struktury Danych.

Uniwersytet Zielonogórski Instytut Sterowania i Systemów Informatycznych. Algorytmy i struktury danych Laboratorium 7. 2 Drzewa poszukiwań binarnych

Dr inż. Grażyna KRUPIŃSKA. D-10 pokój 227 WYKŁAD 1 WSTĘP DO INFORMATYKI

Drzewa podstawowe poj

Klasa 2 INFORMATYKA. dla szkół ponadgimnazjalnych zakres rozszerzony. Założone osiągnięcia ucznia wymagania edukacyjne na. poszczególne oceny

Notacja RPN. 28 kwietnia wyliczanie i transformacja wyrażeń. Opis został przygotowany przez: Bogdana Kreczmera.

Algorytmy i. Wykład 3: Stosy, kolejki i listy. Dr inż. Paweł Kasprowski. FIFO First In First Out (kolejka) LIFO Last In First Out (stos)

Podstawy programowania funkcjonalnego

Podstawy informatyki 2. Podstawy informatyki 2. Wykład nr 2 ( ) Plan wykładu nr 2. Politechnika Białostocka. - Wydział Elektryczny

Programowanie - wykład 4

Rekurencja, schemat rekursji i funkcje pierwotnie rekurencyjne

Odwrotna Notacja Polska

Elementy języka C. ACprogramislikeafastdanceonanewlywaxeddancefloorbypeople carrying razors.

Algorytmy i Struktury Danych.

ZASADY PROGRAMOWANIA KOMPUTERÓW

dr inż. Jarosław Forenc

Zakład Podstaw Cybernetyki i Robotyki Instytut Informatyki, Automatyki i Robotyki Politechnika Wrocławska

Drzewa poszukiwań binarnych

REKURENCJA W JĘZYKU HASKELL. Autor: Walczak Michał

prowadzący dr ADRIAN HORZYK /~horzyk tel.: Konsultacje paw. D-13/325

Wykład 2. Informatyka Stosowana. 8 października 2018, M. A-B. Informatyka Stosowana Wykład 2 8 października 2018, M. A-B 1 / 41

Wstęp do programowania

Algorytmy i Struktury Danych.

Zaawansowane algorytmy i struktury danych

Wstęp do Programowania Lista 1

Luty 2001 Algorytmy (7) 2000/2001

Podstawy programowania w języku Visual Basic dla Aplikacji (VBA)

UNIWERSYTET GDAŃSKI MATERIAŁY DYDAKTYCZNE DO PRZEDMIOTU MATEMATYKA DYSKRETNA. pod redakcją: Hanna Furmańczyk Karol Horodecki Paweł Żyliński

Dynamiczne struktury danych

ĆWICZENIE NR 1 WPROWADZENIE DO INFORMATYKI

Wstęp do informatyki- wykład 1

Wykład 2. Drzewa zbalansowane AVL i 2-3-4

Opis zagadnieo 1-3. Iteracja, rekurencja i ich realizacja

Elementy metod numerycznych - zajęcia 9

Podstawy Programowania Algorytmy i programowanie

PRÓBNY EGZAMIN MATURALNY Z INFORMATYKI STYCZEŃ Arkusz I. Czas pracy: 60 minut Liczba punktów do uzyskania: 15

Rekurencja. Przykład. Rozważmy ciąg

PoniŜej znajdują się pytania z egzaminów zawodowych teoretycznych. Jest to materiał poglądowy.

Wykład 8. Drzewa AVL i 2-3-4

Algorytmy i struktury danych. wykład 5

ALGORYTMY I STRUKTURY DANYCH

Indukcja. Materiały pomocnicze do wykładu. wykładowca: dr Magdalena Kacprzak

Algorytm. a programowanie -

Cw.12 JAVAScript w dokumentach HTML

Arytmetyka liczb binarnych

Wstęp do informatyki Ćwiczenia. Piotr Fulmański

Algorytmika i pseudoprogramowanie

Zadanie 1. Zmiana systemów. Zadanie 2. Szyfr Cezara. Zadanie 3. Czy liczba jest doskonała. Zadanie 4. Rozkład liczby na czynniki pierwsze Zadanie 5.

Operatory AND, OR, NOT, XOR Opracował: Andrzej Nowak Bibliografia:

W 5_2 Typy języków programowania sterowników PLC (zdefiniowane w IEC-61131) - języki graficzne (LD, FBD); języki tekstowe (ST, IL).

Wstęp do programowania. Listy. Piotr Chrząstowski-Wachtel

Architektura systemów komputerowych Laboratorium 14 Symulator SMS32 Implementacja algorytmów

4 Klasyczny rachunek zdań

Język programowania: Lista instrukcji (IL Instruction List)

Technologie informacyjne Wykład VII-IX

Informatyka wprowadzenie do algorytmów (II) dr hab. inż. Mikołaj Morzy

Wysokość drzewa Głębokość węzła

Matematyka dyskretna

Wstęp do programowania. Drzewa podstawowe techniki. Piotr Chrząstowski-Wachtel

Metody Kompilacji Wykład 8 Analiza Syntaktyczna cd. Włodzimierz Bielecki WI ZUT

Indukcja matematyczna

Podprogramy. Procedury

Transkrypt:

Wykład 9 J. Cichoń, P. Kobylański Wstęp do Informatyki i Programowania 266 / 303

stos i operacje na stosie odwrotna notacja polska języki oparte na ONP przykłady programów J. Cichoń, P. Kobylański Wstęp do Informatyki i Programowania 267 / 303

Stos i operacje na stosie Stos jest strukturą danych, na której dostępne są dwie operacje: wstawienie elementu, wyjęcie elementu. Najważniejszą własnością stosu jest to, że wyjmowany jest element jaki został ostatnio wstawiony. Z tego powodu nazywa się go kolejką LIFO od angielskiego last in, first out. J. Cichoń, P. Kobylański Wstęp do Informatyki i Programowania 268 / 303

Stos i operacje na stosie Niech STACK[1..n] będzie globalną tablicą a SP globalną zmienną o wartościach całkowitych (początkowa wartość SP równa jest 1). Wartość zmiennej SP (ang. stack pointer) wskazuje aktualny szczyt stosu. Poniższa procedura wstawia wartość argumentu x na szczyt stosu: 1: procedure Push(x) 2: STACK[SP] x; 3: SP SP + 1 4: end procedure J. Cichoń, P. Kobylański Wstęp do Informatyki i Programowania 269 / 303

Stos i operacje na stosie Poniższa funkcja zdejmuje wartość ze szczytu stosu i zwraca ją: Ćwiczenie 1: function Pop 2: SP SP 1; 3: Pop STACK[SP] 4: end function Rozszerz procedurę Push o obsługę przepełnienia stosu a funkcję Pop o reakcję na pusty stos. J. Cichoń, P. Kobylański Wstęp do Informatyki i Programowania 270 / 303

Odwrotna notacja polska: notacja beznawiasowa Example W roku 1920 polski matematyk Łukasiewicz opracował beznawiasową notację formuł rachunku zdań, którą nazwano notacją polską. W notacji polskiej operatory Negacji, Alternatywy i Koniunkcji poprzedzają ich argumenty. Formułę p ^ q zapisuje się jako Kpq, formułęp ^ q _ r jako AKpqr a formułę p ^ q jako KpNq. J. Cichoń, P. Kobylański Wstęp do Informatyki i Programowania 271 / 303

Odwrotna notacja polska: notacja odwrotna Przy korzystaniu ze stosu wygodniej operatory pisać za argumentami. Beznawiasową notację, w której argumenty poprzedzają operatory, nazywa się odwrotną notacją polską. J. Cichoń, P. Kobylański Wstęp do Informatyki i Programowania 272 / 303

Odwrotna notacja polska: notacja odwrotna Rozróżnia się trzy porządki przeglądania drzewa: pre-order najpierw korzeń a potem lewe i prawe poddrzewo w porządku pre-order; in-order najpierw lewe poddrzewo w porządku in-order, potem korzeń a na koniec prawe poddrzewo w porządku in-order; post-order najpierw lewe i prawe poddrzewo w porządku post-order a na końcu korzeń. J. Cichoń, P. Kobylański Wstęp do Informatyki i Programowania 273 / 303

Odwrotna notacja polska: notacja odwrotna + + + - * - * - * a b + c a b + c a b + c d e d e d e a) b) c) Rysunek : a) Drzewo wyrażenia a b +(d + e) c; b)jegoprzeglądwporządku pre-order + ab +dec; c)jegoprzeglądwporządkupost-order ab de+ c + J. Cichoń, P. Kobylański Wstęp do Informatyki i Programowania 274 / 303

Odwrotna notacja polska: języki oparte na ONP FORTH n ( -- n ) wstawienie liczby na szczyt stosu + ( n1 n2 -- (n1+n2) ) suma dwóch liczb - ( n1 n2 -- (n1-n2) ) różnica dwóch liczb * ( n1 n2 -- (n1*n2) ) iloczyn dwóch liczb / ( n1 n2 -- (n1 div n2) ) iloraz dwóch liczb. ( n -- ) drukowanie wartości ze szczytu stosu SWAP ( n1 n2 -- n2 n1 ) zamiana dwóch elementów DUP ( n -- n n ) skopiowanie elementu OVER ( n1 n2 -- n1 n2 n1 ) skopiowanie elementu ROT ( n1 n2 n3 -- n2 n3 n1 ) rotacja trzech elementów DROP ( n -- ) usunięcie elementu J. Cichoń, P. Kobylański Wstęp do Informatyki i Programowania 275 / 303

Odwrotna notacja polska: języki oparte na ONP Ilustracja z książki L. Brodie. Starting FORTH. An Introduction to the FORT Language and Operating System for Beginners and Professionals. Prentice-HallInc.,1987. J. Cichoń, P. Kobylański Wstęp do Informatyki i Programowania 276 / 303

Odwrotna notacja polska: języki oparte na ONP Example Poniższy program w języku FORTH wstawia dwie liczby na stos, oblicza ich sumę a następnie drukuje wartość sumy (usuwając ją ze szczytu stosu): 2 2 +. J. Cichoń, P. Kobylański Wstęp do Informatyki i Programowania 277 / 303

Odwrotna notacja polska: języki oparte na ONP Kolejne trzy przykłady pochodzą z książki Brodie go. Example Obliczmy wartość a (a + b) gdy na stosie znajdują się wartości a i b. W tym celu należy wykonać operacje: OVER + * Prześledźmy proces obliczania: operacja zawartość stosu ab OVER a b a + a (b+a) * (a*(b+a)) J. Cichoń, P. Kobylański Wstęp do Informatyki i Programowania 278 / 303

Odwrotna notacja polska: języki oparte na ONP Example Obliczmy wartość b (a c) gdy na stosie znajdują się wartości c, b i a. Należy wykonać operacje: ROT - * Przebieg obliczeń: operacja zawartość stosu cba ROT b a c - b (a-c) * (b*(a-c)) J. Cichoń, P. Kobylański Wstęp do Informatyki i Programowania 279 / 303

Odwrotna notacja polska: języki oparte na ONP Example Operację OVER można zdefiniować jako następujący ciąg innych operacji: SWAP DUP ROT SWAP Prześledźmy proces obliczania: operacja SWAP DUP ROT SWAP zawartość stosu n1 n2 n2 n1 n2 n1 n1 n1 n1 n2 n1 n2 n1 J. Cichoń, P. Kobylański Wstęp do Informatyki i Programowania 280 / 303

Odwrotna notacja polska: języki oparte na ONP Example (Ciąg Fibonacciego) Na szczycie stosu znajdują się liczby 0 i 1. Każdorazowe wykonanie sekwencji trzech operacji: SWAP OVER + wylicza na szczycie stosu kolejny wyraz ciągu Fibonacciego: operacja zawartość stosu operacja zawartość stosu 01 SWAP 21 SWAP 10 OVER 212 OVER 101 + 23 + 11 SWAP 32 SWAP 11 OVER 323 OVER 111 + 35 + 12 J. Cichoń, P. Kobylański Wstęp do Informatyki i Programowania 281 / 303

Odwrotna notacja polska: języki oparte na ONP Postscript n ( -- n ) wstawienie liczby na szczyt stosu add ( n1 n2 -- (n1+n2) ) suma dwóch liczb sub ( n1 n2 -- (n1-n2) ) różnica dwóch liczb mul ( n1 n2 -- (n1*n2) ) iloczyn dwóch liczb div ( n1 n2 -- (n1/n2) ) iloraz dwóch liczb = ( n -- ) drukowanie wartości ze szczytu stosu dup ( n -- n n ) skopiowanie elementu exch ( n1 n2 -- n2 n1 ) zamiana dwóch elementów pop ( n -- ) usunięcie elementu roll (a1 a2... an n i -- a(n-i+1)... an a1... a(n-i) ) rotacja n elementów o i pozycji J. Cichoń, P. Kobylański Wstęp do Informatyki i Programowania 282 / 303

Odwrotna notacja polska: języki oparte na ONP Example (Schemat Hornera) Załóżmy, że na stosie znajdują się kolejno wartości współczynników a 0, a 1,...,a n wielomianu n-tego stopnia a na szczycie stosu jest wartość parametru x. Aby policzyćwartośćwielomianu a 0 + a 1 x + a 2 x 2 + + a n x n należy n razy wykonać ciąg Postscriptowych operacji: dup 4 1 roll mul add exch Po ich wykonaniu na szczycie stosu znajdzie się parametr x apodnim wyliczona wartość wielomianu. J. Cichoń, P. Kobylański Wstęp do Informatyki i Programowania 283 / 303

Odwrotna notacja polska: języki oparte na ONP Example (Schemat Hornera cd.) Poniższy program w Postscripcie wylicza wartość wielomianu 1 + 2x + 3x 2 + 4x 3 dla x = 10 a następnie drukuje wyliczoną wartość: 1 2 3 4 10 dup 4 1 roll mul add exch dup 4 1 roll mul add exch dup 4 1 roll mul add exch pop = W wyniku wykonania powyższego programu zostaje wydrukowana wartość 4321. J. Cichoń, P. Kobylański Wstęp do Informatyki i Programowania 284 / 303

Odwrotna notacja polska: przykład programu Wartości logiczne będziemy wyrażać liczbami 0 i 1 odpowiednio dla fałszu i prawdy. Wartość negacji wartości logicznej x można wyliczyć ze wzoru 1 x. Niech x i y będą wartościami logicznymi. Wówczas wartość alternatywy wyliczyć można ze wzoru max(x, y) a wartość koniunkcji ze wzoru min(x, y). J. Cichoń, P. Kobylański Wstęp do Informatyki i Programowania 285 / 303

Odwrotna notacja polska: przykład programu 1: function Wartość(wyrażenie, n, wartości) 2: for i 1, n do 3: if wyrażenie[i] = N then 4: Push(1 Pop) 5: else 6: if wyrażenie[i] = A then 7: Push(max(Pop, Pop)) 8: else 9: if wyrażenie[i] = K then 10: Push(min(Pop, Pop)) 11: else 12: if wyrażenie[i] = p then 13: Push(wartości[1]) 14: else 15:... 16: end if 17: end if 18: end if 19: end if 20: end for 21: Wartość Pop 22: end function J. Cichoń, P. Kobylański Wstęp do Informatyki i Programowania 286 / 303

Odwrotna notacja polska: przykład programu Poniższy program służy do wydrukowania tabeli zero-jedynkowej dla formuły p ^ (q _ r): 1: wyrażenie pqrak 2: for i 0, 1 do 3: wartości[1] i;. ustalenie wartości zmiennej p 4: for j 0, 1 do 5: wartości[2] j;. ustalenie wartości zmiennej q 6: for k 0, 1 do 7: wartości[3] k;. ustalenie wartości zmiennej r 8: write i, j, k, Wartość(wyrażenie, n, wartości) 9: end for 10: end for 11: end for J. Cichoń, P. Kobylański Wstęp do Informatyki i Programowania 287 / 303

Odwrotna notacja polska: przykład programu W wyniku wykonania tego programu zostaną wydrukowane następujące liczby: 0 0 0 0 0 0 1 0 0 1 0 0 0 1 1 0 1 0 0 0 1 0 1 1 1 1 0 1 1 1 1 1 Jak widać formuła jest spełniona przez trzy z ośmiu możliwych wartościowań (waluacji). J. Cichoń, P. Kobylański Wstęp do Informatyki i Programowania 288 / 303

Zamiana rekurencji na iterację Nie wszystkie języki programowania umożliwiają rekurencję (np. język Basic, wczesne wersje języka Fortran, język assemblera). W sytuacji kiedy nie ma dostępnej rekurencji, można samemu utworzyć stos z użyciem tablicy. Na takim własnym stosie można odkładać wartości jakie powinny zachować się przy powtórzeniu obliczeń (odpowiednik zachowania wartości zmiennych lokalnych w funkcjach rekurencyjnych). Pokażemy to na przykładzie funkcji obliczającej n-ty wyraz ciągu Fibonacciego z rekurencyjnego wzoru: 8 < 0 gdy n = 0, Fib(n) = 1 gdy n = 1, : Fib(n 1)+Fib(n 2) w p.p. J. Cichoń, P. Kobylański Wstęp do Informatyki i Programowania 289 / 303

Zamiana rekurencji na iterację 1: function Fib(n) 2: acc 0; 3: PUSH(n); 4: while stos nie jest pusty do 5: n POP; 6: if n = 1 then 7: acc acc + 1 8: else 9: if n > 1 then 10: PUSH(n 1); 11: PUSH(n 2) 12: end if 13: end if 14: end while 15: Fib acc 16: end function J. Cichoń, P. Kobylański Wstęp do Informatyki i Programowania 290 / 303

Zamiana rekurencji na iterację Ćwiczenie Udowodnij, że funkcja Fib(n), wykorzystującastos,liczypoprawnien-ty wyraz ciągu Fibonacciego, dla dowolnego całkowitego n 0. Ćwiczenie Czy wykonując poprzednie ćwiczenie, udowodniłeś, że obliczenia funkcji Fib(n) zawsze się kończą? Jeśli nie, to udowodnij to. J. Cichoń, P. Kobylański Wstęp do Informatyki i Programowania 291 / 303