Gość
|
Niezbędna wiedza w pigułce :D
Ułamki: zmodyfikuj funkcję naString – tak, by ułamek był wyświetlany w postaci właściwej,
load "Int";
fun NWD(0,n) = n
| NWD(m,n) = NWD(n mod m, m);
fun naString(l,m) =
let val znak = if l*m<0 then "~" else ""
val al = abs l
val am = abs m
val d = NWD(al, am)
val lt = al div d;
val mt = am div d;
val cal = lt div mt;
val resz = lt mod mt;
in znak ^ (Int.toString(cal)) ^ " " ^ (Int.toString(resz))
^ "/" ^ (Int.toString(mt))
end;
naString (4,3);
………………………………………………………………………………………………………..
Zadeklaruj i przetestuj działanie funkcji pierwsza: int®bool, gdzie pierwsza
(n)=true wtedy i tylko wtedy, gdy n jest liczba pierwszą.
fun pierwsza1 (n,1) = 1
| pierwsza1 (n,k) = if ((n mod k) = 0) then pierwsza1 (n,k-1) else 0;
fun pierwsza (n) = if pierwsza1 (n, n-1) = 1 then true else false;
……………………………………………………………………………………………………………..
Zadeklaruj i przetestuj działanie funkcji podzielnaOdDo(od,do,dzielnik):
int*int*int®int, wyszukującej najmniejszą liczbę z przedziału od...do podzielną
przez dzielnik.
exception Blad_Przedzialu;
fun PodzielnaOdDo (liczba_od, liczba_do, dzielnik) =
if (liczba_od = liczba_do)
then if ((liczba_od mod dzielnik) = 0)
then liczba_od
else 0
else if (liczba_od > liczba_do)
then raise Blad_Przedzialu
else if ((liczba_od mod dzielnik) = 0)
then liczba_od
else PodzielnaOdDo(liczba_od+1, liczba_do,dzielnik);
PodzielnaOdDo (3 , 6 , 2);
………………………………………………………………………….
Zadeklaruj funkcję usunNieparzyste,
type lista = int list;
fun usunNieparzyste[]=[]
| usunNieparzyste[x]=[]
| usunNieparzyste(x::y::l:lista)=y::usunNieparzyste(l);
val Lista = [1,2,3,4,5,6];
usunNieparzyste(Lista);
………………………………………………………………
Podaj deklarację funkcji typu int list -> int option odszukującej najmniejszy element z
listy liczb całkowitych.
type lista = int list;
fun Min [] = NONE
| Min [x] = SOME(x)
| Min (x::y::l) = if x<y then Min(x::l) else Min(y::l);
val Lista = [1,3,2,5];
Min (Lista);
…………………………………………………………………….
Podaj definicję funkcji nty typu 'a list*int -> 'a option, która zwraca n-ty element na
podanej liście (licząc od zera) .
fun enty(n,[]) = NONE
| enty(n,x::xs) = if (n>length(xs)) then NONE else
if (n=1) then SOME (x)
else enty(n-1,xs);
enty(3,[1,2,3,4,5,6,7]);
……………………………………………………………………….
Zaproponuj funkcję wstaw typu 'a list * int * 'a: 'a list wstawiającą do listy na
podane miejsce (licząc od zera) określony element.
fun wstaw (el,[])=[el]
| wstaw ((es,er),(x1s,x1r:real)::xs) =
if x1r < er then (x1s,x1r:real)::wstaw((es,er),xs)
else (es,er)::(x1s,x1r:real)::xs;
………………………………………………………………………………
Napisz funkcję sprawdzającą, czy w rejestrze w kasie sklepowej nie występują powtórzenia „kodów kreskowych”.
type kodArt = string;
type nazwaArt = string;
type cena = int;
type rejestr = (kodArt*(nazwaArt*cena)) list;
local
fun nowa ( (ka',naz_cen_A') , [] : rejestr ) = false
| nowa ( (ka',naz_cen_A') , (ka2',naz_cen_A2') :: ogon ) =
if ka'=ka2'
then true
else nowa ( ( ka',naz_cen_A' ) , ogon );
in
fun jakis ( [] : rejestr) = false
| jakis ( ( ka , naz_cen_A ) :: rej ) =
if ( nowa ( ( ka , naz_cen_A ) , rej ) )
then true
else jakis( rej )
end;
val Rejestr =
[ ("a1", ("ser bialy", 3)),
("a2", ("szprotki", 2)),
("a1", ("sok", 4))
];
val Rejestr2 =
[ ("a1", ("ser bialy", 3))];
jakis(Rejestr);
jakis(Rejestr2);
………………………………………………………………
Zmień ceny w rejestrze kasy sklepowej, tak by były wartościami typu real. Oblicz średnią cenęartykułu. Wsk.: może to być kilka funkcji.
type rejestr = ( string * ( string * real ) ) list;
local
fun suma ( [] : rejestr ) = 0.0
| suma ( ( ka , ( nazwa , cena ) ) :: rej ) = cena + suma ( rej );
fun ile ( [] : rejestr ) = 0.0
| ile ( ( ka , ( nazwa , cena ) ) :: rej ) = 1.0 + ile ( rej );
in
fun srednia ( [] : rejestr ) = 0.0
| srednia ( ( ka , ( nazwa , cena ) ) :: rej ) =
( suma ( ( ka , (nazwa , cena ) ) :: rej ) ) / ( ile ( ( ka , (nazwa , cena ) ) :: rej ) );
end;
val Rejestr =
[ ( " a1 " , ( " ser bialy " , 2.0 ) ),
( " a2 " , ( " mleko " , 3.0 ) ),
( " a3 " , ( " maslo " , 4.0 ) )
];
srednia ( Rejestr );
…………………………………………………………………………………………….
Wyszukaj wszystkie artykuły o cenach zawartych w podanym zakresie (min,max).
type rejestr = ( string * ( string * int ) ) list;
fun miedzy ( min , max , [] : rejestr ) = []
| miedzy ( min , max , ( ka , ( nazwa , cena ) ) :: rej ) =
if ( cena >= min ) andalso ( cena <= max )
then ( ka , ( nazwa , cena ) ) :: miedzy ( min , max , rej )
else miedzy ( min , max , rej );
val Rejestr =
[ ( " a1 " , ( " ser bialy " , 1 ) ),
( " a2 " , ( " mleko " , 5 ) ),
( " a6 " , ( " jogurt " , 2 ) )
];
miedzy ( 1 , 3 , Rejestr );
……………………………………………………………………………
Wyszukaj za pomocą odpowiedniej funkcji najtańszy artykuł w sklepie.
type rejestr = ( string * ( string * int ) ) list;
fun min ( [] : rejestr ) = []
| min [ ( ka , ( nazwa , cena ) ) ]= [ ( ka , ( nazwa , cena ) ) ]
| min ( ( ka_1 , ( nazwa_1 , cena_1 ) ) :: ( ka_2 , ( nazwa_2 , cena_2 ) ) :: rej ) =
if ( cena_1 < cena_2 )
then min ( ( ka_1 , ( nazwa_1 , cena_1 ) ) :: rej )
else min ( ( ka_1 , ( nazwa_2 , cena_2 ) ) :: rej );
val Rejestr =
[ ( " a1 " , ( " ser bialy " , 1 ) ),
( " a2 " , ( " mleko " , 5 ) ),
( " a3 " , ( " maslo " , 3 ) )
];
min ( Rejestr );
…………………………………………………………………….
Wyszukaj za pomocą odpowiedniej funkcji najdroższy artykuł w sklepie.
type rejestr = ( string * ( string * int ) ) list;
fun max ( [] : rejestr ) = []
| max [ ( ( ka , ( nazwa , cena ) ) ) ] = [ ( ka , ( nazwa , cena ) ) ]
| max ( ( ka_1 , ( nazwa_1 , cena_1 ) ) :: ( ka_2 , ( nazwa_2 , cena_2 ) ) :: rej ) =
if ( cena_1 > cena_2 )
then max ( ( ka_1 , ( nazwa_1 , cena_1 ) ) :: rej )
else max ( ( ka_1 , ( nazwa_2 , cena_2 ) ) :: rej );
val Rejestr =
[ ( " a1 " , ( " ser bialy " , 1 ) ),
( " a2 " , ( " mleko " , 5 ) )
];
max ( Rejestr );
|