1 Ćwiczenie nr 4 OPERACJE NA ŁAŃCUCHACH, FUNKCJA

Transkrypt

1 Ćwiczenie nr 4 OPERACJE NA ŁAŃCUCHACH, FUNKCJA
Ćwiczenie nr 4
OPERACJE NA ŁAŃCUCHACH, FUNKCJA SWITCH,
FUNKCJE DEFINIOWANE PRZEZ UŻYTKOWNIKA
1. Operacje na łańcuchach
Punkt ten zawiera wykaz wszystkich operacji na łańcuchach, które są dostępne w CLIPS-ie.
(str-cat ...) – wiąże w jeden łańcuch pojedyncze elementy
np. (str-cat To jest lancuch)
”Tojestlancuch”
(str-cat To „ jest „ lancuch)
”To jest lancuch”
(str-index ...) – zwraca wartość mówiącą na której pozycji łańcucha znajduje się pierwszy znak podanego
podłańcucha, np.:
(str-index ”abc” ”abcdef”)
1 – pierwszy znak podłańcucha ”abc” jest na pierwszej pozycji łańcucha ”abcdef”
(str-index ”cd” ”abcdef”)
3 – pierwszy znak podłańcucha ”cd” jest na trzeciej pozycji łańcucha ”abcdef”
(str-index ”xyz” ”abcdef”)
FALSE – podłańcuch ”xyz” nie wystepuje w łańcuchu ”abcdef”
(sub-string ...) – zwraca podłańcuch z podanego łańcucha, np.:
(sub-string 2 4 „abcdef”)
”bcd” – podłańcuch łańcucha ”abcdef” od indeksu 2 do indeksu 4
(sub-string 4 10 ”abcdef”)
”def” – funkcja zwraca tylko tyle znaków, ile może
(sub-string 7 5 „abcdef”)
” ” – funkcja zwraca pusty łańcuch, ponieważ indeks początkowy jest większy od
indeksu końcowego
(str-compare ...) – porównuje dwa łańcuchy i zwraca kod zależny od wyniku porównania
(str-compare ”cios” ”drzewo”)
-1; kod = -1, ponieważ pierwszy łańcuch < drugiego łańcucha (”c” jest wcześniej
niż ”d”)
(str-compare ”cios” ”bela”)
1; kod = 1, ponieważ pierwszy łańcuch > drugiego łańcucha (”c” jest później niż
”b”)
(str-compare ”papuga” ”papuga”)
0; kod=0, ponieważ pierwszy łańcuch = drugi łańcuch
(str-length ...) – zwraca długość łańcucha
(str-length ”Kowalski”)
8
(upcase …) – zamienia małe litery na wielkie, np:
(upcase ”hello”)
1
”HELLO”
(lowcase …) – zamienia wielkie litery na małe np.
(lowcase ”HELLO”)
”hello”
Przykład demonstrujący wykorzystanie operacji na łańcuchach:
(defrule start
(initial-fact)
=>
(printout t "Podaj 1 wyraz tekstu : ")
(bind ?tekst1 (read))
(printout t "Podaj 2 wyraz tekstu : ")
(bind ?tekst2 (read))
(printout t "Podaj 3 wyraz tekstu : ")
(bind ?tekst3 (read))
(assert (tekst1 ?tekst1)(tekst2 ?tekst2)(tekst3 ?tekst3)))
(defrule operacje-na-lancuchach
(tekst1 ?tekst1)(tekst2 ?tekst2)(tekst3 ?tekst3)
=>
(bind ?a1 (str-cat ?tekst1 ?tekst2 ?tekst3))
(printout t "Str-cat =" ?a1 crlf)
(printout t "Podaj podlancuch = ")
(bind ?podlancuch (read))
(bind ?a2 (str-index ?podlancuch ?a1))
(printout t "Podlancuch = " ?a2 crlf)
(printout t "Podaj start substring = ")
(bind ?start (read))
(printout t "Podaj stop substring = ")
(bind ?stop (read))
(bind ?a3 (sub-string ?start ?stop ?a1))
(printout t "Substring od " ?start " do " ?stop " = " ?a3 crlf)
(bind ?dlugosc (str-length ?a1))
(printout t "Dlugosc = " ?dlugosc crlf)
(bind ?up (upcase ?a1))
(printout t "Upcase = " ?up crlf)
(bind ?low (lowcase ?a1))
(printout t "Lowcase = " ?low crlf)
(printout t "Podaj 1 wyraz do porownania = ")
(bind ?w1 (read))
(printout t "Podaj 2 wyraz do porownania = ")
(bind ?w2 (read))
(bind ?por (str-compare ?w1 ?w2))
(printout t "Wynik porownania to = " ?por crlf)
)
2
2. Funkcja (switch ...)
Funkcja (switch ...) pozwala na selekcję i wykonanie grupy czynności, spośród wielu czynności, w zależności
od zadanej wartości. Jej składnia jest nastepująca:
(switch <wyrażenie-testujące>
(case <warunek-1> then <akcja-1>)
.
.
.
(case <warunek-i> then <akcja-i>)
.
.
.
(case <warunek-N> then <akcja-N>)
[default <akcje>])
Funkcja (switch ...) musi zawierać co najmniej dwa wyrażenia (case ...), aby mogła być dokonana selekcja,
natomiast wyrażenie „default akcje” jest opcjonalne. Każdy z warunków występujących po słowie kluczowym
„case” musi być oczywiście inny.
Funkcja (switch ...) oblicza najpierw wyrażenie testujące, a następnie odpowiedni i-ty warunek w kolejności
zgodnej z definicją. Jeżeli i-ty warunek jest zgodny z wyrażeniem testującym, to jest wykonywana i-ta akcja.
Jeżeli żaden z warunków nie jest spełniony, to wykonywane są akcje „default” – jeżeli są określone
(zdefiniowane). Wartością zwracaną jest ostatnia akcja obliczona przez funkcje (switch ...). Jeżeli żadna z akcji
nie została wykonana, to zwracana jest wartość FALSE.
3. Funkcje definiowane przez użytkownika
Funkcja definiowana przez użytkownika pozwala na wydzielenie fragmentu kodu (najczęściej powtarzającego
się wielokrotnie), w celu większej przejrzystości kodu programu. Własne funkcje definiujemy nad wszystkimi
regułami, na samym początku listing’u programu. Ogólna struktura funkcji w pseudokodzie jest następująca:
(deffunction nazwa_funkcji
(lista_argumentów_wejściowych)
(akcja_1)
(akcja_2)
.
.
.
(akcja_N)
)
Wynik zwracany przez funkcje jest rezultatem jej ostatniej akcji (akcja_N).
Zadania do wykonania:
1. Napisać program umożliwiający wprowadzenie 3 dowolnych wyrazów. Po wprowadzeniu wyrazy
należy połączyć, tak aby 1 wyraz znajdował się na końcu nowo powstałego ciągu, a wyraz 3 na
początku. Po dokonaniu operacji połączenia wyrazów na nowo utworzonym ciągu znaków
zastosować 4 dowolne funkcje służące do operacji na stringach. Program powinien informować
użytkownika, która operację wykonuje.
2. Napisać program wyznaczający n-ty wyraz ciągu Fibonacciego przy użyciu zdefiniowanej przez
użytkownika funkcji (fibo ?n). Program powinien składać, się z 3 reguł:
R1: Wprowadzenie danych
R2: Obliczenie n-tego wyrazu ciagu Fibonacciego przy użyciu zdefiniowanej funkcji
3
R3: Wyprowadzenie wyniku na ekran
N-ty wyraz ciągu Fibonacciego wyznaczamy z zależności:
n
1 1+ 5 
1 1− 5 
 −

Fn =
⋅ 
⋅
5  2 
5  2 
3.
-
n
Napisać program składający się z trzech funkcji obliczających kolejno:
Pole
Obwód
Przekątną prostokąta
N-ty wyraz ciagu Fibonacciego
Struktura programu:
Zdefiniować 4 funkcje: (pole ?a ?b), (obwod ?a ?b), (przekatna ?a ?b), (fibo ?n)
R1: Reguła początkowa odpala się na (initial-fact), wynikiem działania reguły jest utworzenie z menu
dla użytkownika o postaci:
Obliczam:
1-Pole Prostokąta
2-Obwód Prostokąta
3-Przekatną Prostokąta
4-N-ty Wyraz Ciągu Fibonacciego
R2: Uruchamia się gdy wybrano opcje 1, 2, lub 3. W regule tej następuje wprowadzenie długości
boków prostokąta „a” i „b”. A następnie przy użyciu instrukcji switch wywoływana jest odpowiednia
funkcja: 1- (pole ?a ?b); 2- (obwod ?a ?b); 3- (przekatna ?a ?b). Otrzymany wynik jest potwierdzamy
jako fakt (wynik ?y)
R3: Uruchamia się gdy wybrano opcję 4. W regule tej wprowadza się, który wyraz ciągu chcemy
obliczyć „n” oraz wykonuje się funkcję (fibo ?n). Uzyskany wynik potwierdzamy jako fakt (wynik ?y).
R4: Uruchamia się gdy zaistnieje fakt (wynik ?y) i z wykorzystaniem instrukcji switch wyprowadzany
jest komentarz dla użytkownika w zależności do tego co wybrał użytkownik w poprzednich krokach.
Dostępne komentarze są następujące:
Pole prostokata o bokach a=4 i b=5 wynosi 20
Obwod prostokata o bokach a=4 i b=5 wynosi 18
Przekatna prostokata o bokach a=4 i b=5 wynosi 6.403
7-my wyraz ciagu Fibonacciego wynosi 13
4