Laboratorium 6

Transkrypt

Laboratorium 6
Imię i Nazwisko
Data
Ocena
Laboratorium 6
Rekordy– zmodyfikowana kasa sklepowa
Problem. Kasa sklepu zawiera rejestr danych łączących kody artykułów (np. paskowe) z ich nazwami i
cenami. Należy opracować program, który umożliwia wykonanie typowych operacji: wyszukiwania,
sortowania itp. W odróżnieniu od poprzedniego laboratorium dane zostaną zorganizowane jako lista
rekordów.
Dane w kasie. Są to rekordy zawierające elementarne informacje o towarach.
val
val
val
val
val
val
val
val
val
art1
art2
art3
art4
art5
art6
art7
art8
art9
=
=
=
=
=
=
=
=
=
{
{
{
{
{
{
{
{
{
kod
kod
kod
kod
kod
kod
kod
kod
kod
=
=
=
=
=
=
=
=
=
"1234",
"1204",
"1034",
"1264",
"1234",
"1634",
"1274",
"1244",
"1234",
nazwa
nazwa
nazwa
nazwa
nazwa
nazwa
nazwa
nazwa
nazwa
=
=
=
=
=
=
=
=
=
"sok1",
"sok2",
"sok3",
"sok4",
"sok5",
"sok1",
"sok7",
"sok8",
"sok9",
cena
cena
cena
cena
cena
cena
cena
cena
cena
=
=
=
=
=
=
=
=
=
12};
11};
22};
32};
14};
52};
12};
16};
17};
Część pierwsza – elementarne działania na rekordach
Polecenie 1
Dostęp do pól rekordu odbywa się przez selektor postaci #nazwa_pola. Uzupełnij w ramce
poniżej program:
val kod_art
= ......................... art1;
(* wynik .......................*)
val nazwa_art = ......................... art1;
(* wynik =........................*)
val cena_art
= ......................... art1;
(* wynik ........................*)
Polecenie 2
Napisz funkcję sprawdzającą, czy ceny dwóch artykułów są sobie równe.
-1-
Polecenie 3
Napisz funkcję zmieniającą nazwę artykułu w rekordzie na podaną. Wskazówka: funkcja powinna
zwracać zmodyfikowany rekord. Zmodyfikuj powyższą funkcję tak, aby zmieniała nazwę tylko
wtedy, jeśli cena jest wyższa od 10. Treści funkcji wpisz poniżej.
Polecenie 4
Zmodyfikuj funkcję z polecenia 2 tak, aby posiadała trzy argumenty. Uzupełnij funkcję podaną w
ramce poniżej.
fun porownaj selektor rekord1 krekord2 =
(* typ funkcji
...............................
*)
Sprawdź działanie funkcji dla wszystkich trzech selektorów.
Część druga– listy rekordów
Polecenie 5
Utwórz listę artykułów sklepowych:
val SKLEP = [art1,art2,art3,art4,art5,art6,art7,art8,art9];
Zmodyfikuj daną niżej funkcję sortującą, tak by kryterium sortowania była cena. Wskazówka:
wystarczy zmodyfikować funkcję wstaw.
fun
|
fun
|
wstaw(x,[])
= [x]:real list
wstaw(x,h::t) = if x<=h then x::h::t
sortuj []
= []
sortuj(h::t) = wstaw(h, sortuj t);
Nową funkcję wstaw zapisz poniżej:
-2-
else h::wstaw(x,t);
Polecenie 6
Zmodyfikuj funkcję sortowania tak, aby przekazywane było do niej dowolne kryterium.
Wskazówka: tym kryterium może być selektor #nazwa_pola , podobna funkcja została napisana
na poprzednim laboratorium. Sprawdź działanie funkcji dla różnych selektorów. Poniżej wpisz
tylko typy funkcji wstaw i sortuj.
Polecenie 7
Zmodyfikuj funkcje usuwające powtórzenia
fun usun'(_, [])
= []
| usun'(x, y::ys) = if x=y then usun'(x,ys)
else y::usun'(x,ys);
fun usunPowt' []
= []
| usunPowt'(x::xs) = x::usunPowt'(usun'(x,xs));
tak, aby dodatkowym parametrem był selektor. Wynik wpisz poniżej:
Polecenie 8
Dana jest funkcja wyszukująca elementów z listy wg podanego klucza:
fun szukaj klucz
| szukaj klucz
[] = []
(x1::xs) = (if klucz(x1) then [x1] else [])
@ szukaj klucz xs;
Podaj niżej typ funkcji szukaj. Jakiego typu jest wymagany klucz?
typ funkcji szukaj
typ funkcji klucz
Deklaracja konkretnej funkcji mogłaby mieć postać:
fun kl (x1) = #cena x1 <14;
Jednak odpowiedzią MLa jest sygnalizacja błędu
!Unresolved record pattern
-3-
Rozwiązaniem problemu może być użycie konkretnego typu rekordu, ale zmniejsza to
uniwersalność rozwiązania.
Zadeklarowano zatem operatory infiksowe, mogące służyć do formułowania zapytań:
infix GT
infix EQ
infix LT
fun (pole
fun (pole
fun (pole
(*
(*
(*
GT
EQ
LT
greater then *)
equal
*)
less then
*)
wartosc) x =
wartosc) x =
wartosc) x =
pole x > wartosc;
pole x = wartosc;
pole x < wartosc;
Zanotuj poniżej typ operatora EQ
Zapytanie może mieć postać
szukaj (#cena GT 14) SKLEP;
Przekonaj się czy wynik jest prawidłowy.
Gdy zapytanie jest bardziej złożone, np wynik ma spełniać koniunkcję dwóch warunków, to szuka
się list rozwiązań spełniających oba warunki i wyznacza część wspólną. Jeżeli zapytanie jest
alternatywą – wynikowe zbiory łączy się i usuwa powtórzenia. Niżej podano operator
odpowiadający koniunkcji warunków:
infix mem'
fun el mem' [] = false
| el mem' (x1::xs) = el = x1 orelse el mem' xs;
fun czescWspolna' ([],ys)=[]
| czescWspolna' (x::xs,ys) = if x mem' ys then x ::
(czescWspolna' (xs,ys)) else
czescWspolna' (xs,ys) ;
infix 6 AND_
fun (x1 AND_ x2) = czescWspolna' (x1,x2);
Zapytanie ma postać:
val szukane = (szukaj (#cena GT 14) SKLEP) AND_ (szukaj (#cena LT 18) SKLEP);
Rozszerzenie.Podaj realizację operatora OR_
Zadanie domowe
Uzupełnij deklarację poniższej funkcji, do której koniunkcję warunków podaje się w postaci listy
fun szukajl _ [] = []
| szukajl (kr1::krs) x = ..................
|
szukajl [ ] x = x;
Wywołanie
val szukane2 =
szukajl [ (#cena GT 14) , (#cena LT 18)] SKLEP;
-4-
-5-

Podobne dokumenty