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ęć.

Podobne dokumenty