Semntyk i Weryfikj Progrmów - Lortorium Dziłni n ułmkh, krotki i rekory Cz. I. Dziłni n ułmkh Prolem. Oprowć zestw funkji o ziłń rytmetyznyh n ułmkh zwykłyh posti q, gzie, są lizmi łkowitymi i 0. Rozwiąznie Anliz prolemu wzory nlityzne + +,,, gzie 0, gy Ułmek jest lej zpisywny jko uporząkown pr (krotk) liz łkowityh, np. (,3) interpretujemy jko ułmek 3 Relizj progrmu Do relizji olizeń n lizh łkowityh nleży ołązyć iliotekę Int lo "Int"; Definij nzwy typu reprezentująego ułmek w posti pry liz jest nstępują:. type ulm int*int; (* ulmek jko pr (,), gzie <>0 *) Definij wyjątku ęzie potrzeny o relizji rozszerzeń prezentownyh funkji. Powinny one przerywć olizeni w przypku wystąpieni lizy 0 w minowniku ułmk (rugim elemenie pry). exeption DzieleniePrzezZero; Definij opertorów infiksowyh (eklrje zpowijąe). Określn jest łązność (lew), priorytet i sposó występowni opertorów pomięzy rgumentmi, zgonie ze stnrmi przyjętymi w mtemtye. infix 6 ++ (* stnrowy priorytet *) infix 6 -- infix 7 ** infix 7 // infix 4 Deklrj włśiwyh funkji relizująyh olizeni ez sprwzni poprwnośi rgumentu. fun (,) ++ (,) (* + *, *); - 1 -
fun (,) -- (,) (* - *, *); fun (,) ** (,) (*, *); fun (,) // (,) (,) ** (,); fun (,) (,) (* *); Olizeni sprwzjąe 1. Oliz wpisują ez użyi nwisów wrtość wyrżeni: 1/ + /3 * 3/4.. Oliz wrtość nstępująego wyrżeni: 1/ + /3 + 3/4. Uprszznie liznik i minownik Jk możn zuwżyć, w rezultie olizeń otrzymuje się wynik nie zwsze reprezentująy ułmek prwiłowy. Zrówno liznik jk i minownik możn pozielić przez njwyższy wspólny pozielnik. Do wyznzeni njwiększego wspólnego pozielnik służy pon niżej funkj NWD zrelizown n postwie lgorytmu Euklies: (* njwiekszy wspolny zielnik *) fun NWD(0,n) n NWD(m,n) NWD(n mo m, m); (* tylko lizy nturlne *) Skróenie wyniku wykonywne jest przez funkję i skro (zwróć uwgę n eklrję wyrżeń loklnyh w konstrukji let...in...en ). (* skroenie ulmk *) fun skro(l,m) let vl znk if l*m<0 then ~1 else 1 vl l s l vl m s m vl NWD(l,m) in (znk * (l iv ), m iv ) en; Poniższ funkj umożliwi przeksztłenie pry w elu jej lepszej wizulizji n opowijąy jej łńuh. (* zmin ulmk n string *) fun nstring(l,m) let vl znk if l*m<0 then "~" else ""(* eklrje wewnetrzne *) vl l s l (* wrt.ezw. liz nt. *) vl m s m vl NWD(l, m) in znk ^ (Int.toString(l iv )) ^ "/" ^ (Int.toString(m iv )) en; Pln testów. Powinno się sprwzić wszystkie głęzie, przez które przehozi progrm. Przypek Funkj Głąź Uwgi 1 3 4 5 6 ++ -- ** // nstring not p*q<0 - -
7 8 9 nstring NWD NWD p*q<0 (0,n) (m,n) Znk ujemny Wrtość końow Wywołnie rekursywne Testy Dl przeprowzeni testów zeklrowno w ułmki : vl q1 (~,3); vl q (5,~10); Przykłowe wywołni zwrte są w teli. Nleży sprwzić poprwność rezulttów. Lp. Przypek Test Spoziewny wynik 1 3 4 5 6 7 1 3 4 5 6 7 vl q3 q1 ++ q q1 -- q vl q4 q **q3 vl q5 q4 // q3 q1 q nstring q4 nstring q5 vl q3 (~35,30): int * int vl it (~5,30): int * int vl q4 (~175,~300): int * int vl q5 (~550,10500) int * int vl it flse: ool vl it 7/1 : string vl it ~1/ : string Cz. II. Rekory Prolem. Zrelizowć rekor zwierjąy zrówno ne smohou (mrk, roznik, pojemność) jk i kierowy (imię, res i rok urozeni). 1. Deklrj typu rekoru zwierjąego ne smohou. type smoho {mrk : string, roznik : int, pojemnos : rel}; Przykłowe wrtośi: vl sien { mrk "FIAT", roznik 1997, pojemnos 1586.0}; vl mluh { mrk "FIAT", roznik 1987, pojemnos 648.0}; Funkj sprwzją, zy pojz jest młolitrżowy (ozyt pol rekoru) fun mlolitrzowy(x:smoho) #pojemnos x <900.0; Przykłowe wywołnie: mlolitrzowy mluh; Ozyt informji z pominięiem niepotrzenyh nyh: (* ignorownie zenyh pol *) vl {roznik,...} mluh;. Rekor zwierjąy ne o osoie: type oso {imie : string, urozony:int, res:string}; - 3 -
Przykłowe wrtośi (kolejność nie jest istotn): vl kier1 {imie"am", res "Rzeszow", urozony 1960}; vl kier {imie"olek", res "Jslo", urozony 1986}; Funkj porównują, zy pierwszy kierow jest strszy: fun strszy(k1:oso,k:oso) #urozony k1 < #urozony k; 3. Włśiwe ne rejestryjne rekor zwierjąy zeklrowne wyżej typy nyh. type rej {pojz : smoho, posiz: oso}; Wrtośi zmiennyh i przykłowy ozyt nyh z wewnętrznego rekoru: vl sm1:rej { pojz sien, posiz kier1}; vl sm:rej {pojz mluh, posiz kier}; (* ozyt wrtośi z wewnetrznego rekoru *) # roznik (#pojz sm1); Porównnie pojemnośi pojzów: fun wiekszpojemnos( s1: rej, s :rej) # pojemnos (#pojz s1) > # pojemnos (#pojz s1); - 4 -
Zni o smozielnego rozwiązni pozs zjęć ( o wyoru przez prowząego) 1. Zmoyfikuj funkje operująe n ułmkh tk, y wykluzły wystąpienie zer w minowniku. Wskzówk: zstosuj instrukję if...then...else i zstosuj wyjątek exeption DzieleniePrzezZero.. Zeklruj typ nyh umożliwijąy reprezentję ułmków w posti rekorów. Poj efinije opowienih funkji. 3. Zmoyfikuj funkje operująe n ułmkh tk, y nstępowło kżorzowe skrnie wynikowego ułmk (liznik i minownik). Użyj funkji skro. 4. Ułmki: zmoyfikuj funkję nstring tk, y ułmek ył wyświetlny w posti włśiwej, zyli zęść łkowit i ułmkow. Wskzówk: po wyznzeniu wrtośi ezwzgl. liznik i minownik wyziel zęść łkowitą przez zielenie iv i pozostły liznik reszt z zieleni, opertor mo. 5. Zeklruj i przetestuj ziłnie funkji rekurenyjnej sum typu : int*int int, gzie sum(m,n)m+(m+1)+(m+)+...+(m+(n-1))+(m+n), m 0, n 0. Wsk.: zpisz w wrunki l (m,0) i (m,n). 6. Zeklruj smozielnie infiksową funkję potęgowni ^^, wskzówk: zstosuj w wrinty - m^^n m * m^^(n-1), m^^01 7. Opruj zestw funkji rytmetyznyh l liz zespolonyh (++,--,**,// - zo. Wykł Przykły progrmów). Sprwź ziłnie tyh funkji n kilku przykłh. Uzupełnij zestw o funkję sqrt olizjąą pierwistki lizy zespolonej A+j B. Wsk.: Kży pierwistek +j musi spełnić równnie (+j ) (+j )(A+j B) 8. Npisz funkję olizjąą ułmek o potęgi łkowitej nieujemnej n. Npisz funkję pomonizą ponosząą lizę o potęgi z wom wrintmi: - m**n m * m**(n-1), m**01 9. ) Zeklruj i przetestuj ziłnie funkji test:int*int*int ool, tką że niepozielne(,) n niepozielne( + 1,)... n niepozielne(,) test(,,) l jest wrtośią logizną powyższego wyrżeni. Ztem test(,,) sprwz, zy lizy w przezile (,) nie są pozielne przez. ) Zeklruj infiksowy opertor równowżnośi i sprwź jego ziłnie. 10. Zeklruj i przetestuj ziłnie funkji pierwsz: int ool, gzie pierwsz (n)true wtey i tylko wtey, gy n jest liz pierwszą. Wsk.: Liz pierwsz to tk, - 5 -
której pozielnikmi są tylko 1 i on sm. Skonstruuj funkję pomonizą pierwsz z wom wrintmi (końząym rekurenję) pierwsz (n,) i pierwsz (n,k) wywoływną przez zsnizą: fun pierwsz n pierwsz' (n,n-1); 11. Zeklruj i przetestuj ziłnie funkji pozielnodo(o,o,zielnik): int*int*int int, wyszukująej njmniejszą lizę z przeziłu o...o pozielną przez zielnik. 1. Utwórz nstępująe funkje: 1) mnożeni ułmk przez lizę; ) zieleni ułmk przez lizę; 3) pierwistkowni ułmk. Npisz funkję zwrjąą owrotność ułmk. 13. Zeklruj i przetestuj ziłnie funkji wystoigo:string*int*hr int, gzie wystoigo (str,i,h)liz występowni znku h n pozyjh j w stringu str, gzie j i. Wsk.: Funkj l i size str powinn zwrć 0. Zstosuj String.su. 14. Zeklruj funkję tylkomlelitery: string->ool jąą, zy wszystkie znki w ponym stringu są młymi litermi. N przykł: tylkomlelitery true tylkomlelitery A flse Wsk.: Wykorzystj funkję iliotezną String.su. Npisz funkję pomonizą tylkomle(st,i) wywoływną przez zsnizą funkję: tylkomlelitery(st) tylkomle(st, size st 1). 15. Zrelizuj funkję mrn wykonująą mnożenie liz łkowityh poprzez rekurenyjne ownie wykorzystują zleżnośi: m*n m*0 0; l n0 m*n m*1 m; l n1 m*n m+ m*(n-1) l n>0 Sprwź jej ziłnie l otnih i ujemnyh rgumentów. Spróuj zmoyfikowć funkję wzorują się n efiniji funkji silni. 16. Zeklruj kilk rekorów zwierjąyh ne osoy: imię, nzwisko i numer telefonu. Npisz funkję sprwzjąą, zy wie osoy mją to smo nzwisko. 17. Zeklruj kilk rekorów zwierjąyh ne książki: tytuł, nzwisko utor, rok wyni, en. Npisz funkję zmienijąą enę w ponym rekorzie n nową, jeżeli poprzenio ył wpisn wrtość większ niż pon. - 6 -