Laboratorium przedmiotu „Paradygmaty Programowania”
Transkrypt
Laboratorium przedmiotu „Paradygmaty Programowania”
Laboratorium przedmiotu „Paradygmaty Programowania” Laboratorium 7 Scheme – Typy złożone: struktury i listy 1. Struktury w Scheme Struktury są złożonym typem danych, składającym się z wielu elementów, które mogą być typu prostego lub typu złożonego. Do zdefiniowania struktury w języku Scheme służy słowo kluczowe define-struct, a kompletna składnia polecenia przedstawia się następująco: (define-struct nazwa_struktury (składowa_struktury1 składowa_struktury2 … składowa_strukturyN)) Przykład 1 – Deklarowanie struktur w języku Scheme (define-struct punkt (x y)) Kiedy Scheme przetwarza powyższą deklarację, tworzy dodatkowe operacje pozwalające na tworzenie struktury, wybranie jednego z jej elementów (tzw. selektor) oraz rozróżnianie jej od wartości innych typów (tzw. predykat). Funkcje te przyjmują, odpowiednio, następującą postać: (make-nazwa_struktury składowe) (nazwa_struktury-składowa_struktury nazwa_zmiennej) (nazwa_struktury? nazwa_zmiennej) Paradygmaty programowania 2 Przykład 2 – Funkcje wygenerowane przez Scheme dla struktury zdefiniowanej w przykładzie 1. > (define PUNKT (make-punkt 12 15)) > (punkt-x PUNKT) 12 > (punkt-y PUNKT) 15 > (punkt? PUNKT) true > (punkt? 12) false Poniższy przykład przedstawia program wykorzystujący struktury do obliczenia odległości pomiędzy dwoma punktami. Przykład 3 – Przykładowy program wykorzystujący struktury (define-struct punkt (x y)) (define (kwadrat x) (* x x)) (define (odleglosc-pomiedzy-dwoma-punktami p1 p2) (cond ((and (punkt? p1) (punkt? p2)) (sqrt (+ (kwadrat (- (punkt-x p1) (punkt-x p2))) (kwadrat (- (punkt-y p1) (punkt-y p2)))))) ((and (number? p1) (number? p2)) (abs (- p1 p2))) (else "Błędne parametry funkcji"))) Wywołanie funkcji: > (define P1 (make-punkt 12 12)) > (define P2 (make-punkt 11 18)) > (odleglosc-pomiedzy-dwoma-punktami P1 P2) #i6.082762530298219 > (odleglosc-pomiedzy-dwoma-punktami 12 4) 8 Paradygmaty programowania 3 2. Listy Język Scheme jest dialektem języka LISP (LISt Processing), dlatego listy są jednym z podstawowych typów danych wspieranych przez ten język. W przypadku Scheme listy są typem rekurencyjnym, który można przedstawić następująco: lista = lista_pusta lub cons(element_listy, reszta_listy) gdzie: cons – funkcja tworząca listę, przyjmująca dwa parametry: element listy oraz resztę listy lub listę pustą (empty). Graficznie listę w języku Scheme można przedstawić następująco: Rysunek 1 Graficzna reprezentacja listy w języku Scheme Poniższy przykład przedstawia sposób tworzenia listy zawierającej liczby całkowite: Przykład 4 – Tworzenie list w języku Scheme za pomocą funkcji cons > (cons 1 (cons 2 (cons 3 (cons 4 (cons 5 (cons 6 empty)))))) (list 1 2 3 4 5 6) Funkcja cons, ze wzgledu na swoją rekurencyjną naturę jest niewygodna w użyciu. Z tego powodu do języka Scheme wprowadzono dodatkową komendę list upraszczającą tworzenie list. Przykład 5 – Tworzenie list w języku Scheme za pomocą funkcji list > (list 1 2 3 4 5 6) (list 1 2 3 4 5 6) Oczywiście elementami list mogą być wartości dowolnego typu, w tym również inne listy. Dodatkowo jedna lista może przechowywać wartości różnych typów, dlatego poprawne są następujące deklaracje list: Paradygmaty programowania 4 Przykład 6 – Listy zawierające elementy różnych typów > (list 1 2 3.14 "Ala" "Ma" 'Kota) (list 1 2 3.14 "Ala" "Ma" 'Kota) > (list (list 1 2 3) 4 5 6 7) (list (list 1 2 3) 4 5 6 7) Język Scheme udostępnia szereg funkcji pozwalających na operacje na liście (niektóre z nich występują pod dwoma nazwami): • (first lista) – zwracająca pierwszy element na liście (występuje również pod nazwą car). • (rest lista) – zwraca listę składającą się ze wszystkich, poza pierwszym, elementów listy wejściowej (występuje również pod nazwą cdr). • (list? lista) – zwraca true jeżeli parametr lista jest listą lub false w przeciwnym przypadku (występuje również pod nazwą cons?). • (empty? lista) - zwraca true jeżeli parametr lista jest listą pustą. Przykład 7 – Wykorzystanie funkcji obsługi list > (list 1 2 3 4 5 6) (list 1 2 3 4 5 6) > (first (list 1 2 3 4 5 6)) 1 > (rest (list 1 2 3 4 5 6)) (list 2 3 4 5 6) > (list? (list 1 2 3 5 6)) true 3. Pętle w języku Scheme W języku Scheme nie istnieje żadna specjalne forma wyrażenia iteracyjnego ani komendy iteracyjnej. Pętle mogą być definiowane tylko poprzez wywołania rekurencyjne. Poniżej przedstawiony jest przykładowy program wyświetlający 10 kolejnych liczb całkowitych: Przykład 8 – Przykładowa pętla w języku Scheme (define (wyswietlKolejna x) (if (> x 10) (void) (begin (write x) (newline) (wyswietlKolejna (+ x 1))))) Paradygmaty programowania 5 UWAGA!!! Powyższy przykład przedstawia kilka dodatkowych elementów języka Scheme: • instrukcję pustą (void) • instrukcję sekwencji, pozwalającą wykonywać kolejne instrukcje programu: (begin (instrukcja1) (instrukcja2) … (instrukcjaN) ) • instrukcje (write) i (newline)- przykład instrukcji wejścia – wyjścia w języku Scheme 1. Poniżej przedstawione zostały dwie przykładowe funkcje rekurencyjne prezentujące sposób wykorzystania operacji obsługi list w języku Scheme Przykład 9 – Sumuj wszystkie elementy na liście (define (sumaWszystkichElementowListy lista) (cond ((empty? lista) 0) (else (+ (first lista) (sumaWszystkichElementowListy (rest lista)))))) (define (znajdz lista szukanyElement poz) (cond ((empty? lista) -1) ((= (first lista) szukany element) poz (else (znajdz (rest lista) szukanyElement (+ poz 1))))) 4. Zadania do samodzielnego wykonania 1. Zdefiniować funkcję wyznaczającą pierwiastki równania kwadratowego, która w zależności od przypadku zwraca listę jedno lub dwu elementową. 2. Napisać funkcję, która oblicza liczbę elementów listy. 3. Napisać funkcję, która sumuje elementy na liście (należy sprawdzić, czy element listy jest liczbą) 4. Napisać funkcje, która odwraca kolejność elementów na liście 5. Napisać funkcje, która oblicza liczbę elementów o określonej wartości na liście. 1 Dodatkowo istnieje oczywiście funkcja read, która pozwala na wczytywanie wartości od użytkownika. Operacje wejścia-wyjścia będą omawiane na jednych z kolejnych zajęć.