Advertisement
Guest User

Untitled

a guest
Jan 25th, 2016
56
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
F# 13.92 KB | None | 0 0
  1. // Learn more about F# at http://fsharp.net
  2. // See the 'F# Tutorial' project for more help.
  3. open System
  4. exception UJEMNY_ARGUMENT
  5.  
  6. ///////////////////////////////////////////////////////////////////////////////////////////////////
  7. ///////////////////Funkcje, funkcje rekurencyjne, operacje na łańcuchach znaków////////////////////
  8. ///////////////////////////////////////////////////////////////////////////////////////////////////
  9.  
  10. //Zadeklaruj funkcję obliczająca n!. Funkcja przyjmuje jeden parametr (n) oraz zwraca
  11. //wynik obliczeń. W przypadku podania ujemnej wartości n funkcja powinna wyrzucić wyjątek UJEMNY_ARGUMENT.
  12. let rec silnia n =
  13.     match n with
  14.     | n when n < 0 -> raise UJEMNY_ARGUMENT
  15.     | 0 -> 1
  16.     | _ -> n* silnia(n-1)
  17.  
  18. //Zadeklaruj funkcję obliczającą ab, dla b>0. Funkcja przyjmuje dwa parametry (a i b) oraz zwraca wynik obliczeń.
  19. let rec adob (a:int, b:int) =
  20.     match b with
  21.     | 0 -> 1
  22.     | _ -> a * adob(a, b-1)
  23.  
  24. //Zadeklarować funkcję, która obliczy i zwróci n-ty element ciągu Fibonacciego. Wskazówka: F(n)=1, dla n=0 i n=1
  25. //F(n)=F(n-1)+F(n-2), dla n>1.
  26. let rec fibon n:int =
  27.     match n with
  28.     | 0 -> 1
  29.     | 1 -> 1
  30.     | _ -> fibon(n-1) + fibon(n-2)
  31.  
  32. //Zrealizuj funkcję mRn wykonującą mnożenie liczb całkowitych poprzez rekurencyjne dodawanie wykorzystując zależności:
  33. //m*n = m*0 = 0; dla n=0
  34. //m*n = m*1 = m; dla n=1
  35. //m*n = m + m*(n-1) dla n>0.
  36. let rec mRn (m:int, n:int) =
  37.     match n with
  38.     | 0 -> 0
  39.     | 1 -> m
  40.     | _ -> m + mRn(m,n-1)
  41.  
  42. //Napisz funkcję niePodzielny: int*int->bool, gdzie niepodzielny(d, n) zwróci wartość false,
  43. //jeśli d jest podzielne przez n i true w przeciwnym przypadku.
  44.  
  45. let NiePodzielny (d:int, n:int) =
  46.     let np = d%n
  47.     match np with
  48.     | 0 -> false
  49.     | _ -> true
  50.  
  51. //Zadeklaruj funkcję liczWyst: string*char -> int, która zlicza wystąpienia znaku ch w łańcuchu str.
  52. let liczWyst (str: string, ch:char) =
  53.     let ilosc = ref(0)
  54.     let dl = str.Length
  55.     for i=0 to dl-1 do
  56.         if str.[i] = ch then incr(ilosc)
  57.     ilosc.Value
  58.  
  59. //Zadeklaruj funkcję liczWystOd: string*int*char -> int, która zlicza wystąpienia znaku ch
  60. //w łańcuchu str od pozycji j do końca łańcucha.
  61.  
  62. let liczWystOd(str: string,ile:int, ch:char) =
  63.     let ilosc = ref(0)
  64.     let dl = str.Length
  65.     for i=ile to dl-1 do
  66.         if str.[i] = ch then incr(ilosc)
  67.     ilosc.Value
  68.  
  69. //Zadeklaruj funkcje pow: string*int->string, która zwróci łańcuch, będący sumą n powtórzeń
  70. //łańcucha str, np. pow(str, n) dla str=”Tak” i n=3 zwróci łańcuch „TakTakTak”.
  71. let pow (str: string, n:int) =
  72.     match n with
  73.     | 1 -> str
  74.     | _ -> String.replicate n str
  75.  
  76. ///////////////////////////////////////////////////////////////////////////////////////////////////
  77. ////////////////////////////////////////////Krotki i rekordy///////////////////////////////////////
  78. ///////////////////////////////////////////////////////////////////////////////////////////////////
  79.  
  80. //Napisać funkcję wyznaczającą największy wspólny dzielnik NWD liczb m i n (NWD: int*int -> int).
  81. let rec NWD (m:int, n:int) =
  82.     match n with
  83.     | 0 -> m
  84.     | _ -> NWD(n,m%n)
  85.  
  86. //Zadeklaruj funkcje realizujące podstawowe operacje na ułamkach: dodawanie (++), odejmowanie (--),
  87. //mnożenie (**), dzielenie (/./). W przypadku wystąpienia 0 w mianowniku funkcje powinny zwracać
  88. //wyjątek exception DzieleniePrzezZero.
  89.  
  90. exception DzieleniePrzezZero
  91.  
  92. let ( ++ ) (a,b)(c,d) =
  93.     if b*d = 0 then raise DzieleniePrzezZero
  94.     else a * d + c * b , b * d
  95.  
  96. let ( -- ) (a,b)(c,d) =
  97.     if b*d = 0 then raise DzieleniePrzezZero
  98.     else a * d - c * b , b * d
  99.  
  100. let ( ** ) (a,b)(c,d) =
  101.     if b*d = 0 then raise DzieleniePrzezZero
  102.     else a * c, b * d
  103.  
  104. let ( /./ ) (a,b)(c,d) =
  105.     if b*d = 0 then raise DzieleniePrzezZero
  106.     else a * d, b * c
  107.  
  108. // Napisz funkcję skracającą ułamek (wykorzystaj funkcję NWD: int*int -> int).
  109. let skr (a:int, b:int) =
  110.     let znak = if a<0 then -1 else 1
  111.     let li = abs a
  112.     let mi = abs b
  113.     let dzielnik = NWD (li,mi)
  114.     let li2 = znak * (li/dzielnik)
  115.     let mi2 = mi / dzielnik
  116.     li2,mi2
  117.  
  118. //Zadeklaruj funkcję naString, która zmieni ułamek na łańcuch naString: int*int->string.
  119. //Ułamek powinien być wyświetlony w postaci właściwej, czyli jako część całkowita i ułamkowa.
  120. let naString(a:int, b:int) =
  121.     let znak = if a<0 then "-" else ""
  122.     let li = abs a
  123.     let mi = abs b
  124.     let dzielnik = NWD (li,mi)
  125.     let calk = li/mi
  126.     let calkowita = if calk = 0 then "" else calk.ToString()
  127.     let li2 = ((li-calk*mi)/dzielnik)
  128.     let mi2 = mi / dzielnik
  129.     znak.ToString() + calkowita.ToString() + " " + li2.ToString() + "/" + mi2.ToString()
  130.  
  131. //Zadeklaruj funkcje realizujące funkcje arytmetyczne dla liczb zespolonych:
  132. //dodawanie (++), odejmowanie (--), mnożenie (**), dzielenie (/./).
  133.  
  134. let (+++) (a,b) (c,d) =
  135.     let znak = if b+d >0 then "+" else "-"
  136.     (a+c).ToString() + znak + (b + d).ToString() + "i"
  137.  
  138. let (---) (a,b) (c,d) =
  139.     let znak = if b-d >0 then "+" else "-"
  140.     (a-c).ToString() + znak + (b - d).ToString() + "i"
  141.  
  142. let ( *** ) (a,b) (c,d) =
  143.     let znak = if b*d >0 then "+" else "-"
  144.     ((a*c)-(b*d)).ToString() + znak + ((a*d)+(b*c)).ToString() + "i"
  145.  
  146. let (/././) (a,b) (c,d) =
  147.     if c=0 && d=0 then raise DzieleniePrzezZero
  148.     (a,b) *** (c,-d) + "/" + (c*c + d*d).ToString()
  149.  
  150. ///Zadeklaruj funkcję pierwsza: int -> bool, gdzie pierwsza (n)=true wtedy i tylko wtedy,
  151. //gdy n jest liczba pierwszą. Wsk.: Liczba pierwsza to taka, której podzielnikami są tylko 1
  152. //i ona sama. Skonstruuj funkcję pomocniczą pierwsza’ z dwoma wariantami (kończącym rekurencję)
  153. //pierwsza’(n,2) i pierwsza’(n,k) wywoływaną przez zasadniczą: let pierwsza n = pierwsza' (n,n-1).
  154.  
  155. let rec pierwsza'(n:int,k:int) =
  156.    let r = n%k
  157.    match k with
  158.    | 1 -> true
  159.    | _ -> match r with
  160.        | 0 -> false
  161.        | _ -> pierwsza'(n,k-1)
  162.  
  163. let pierwsza n =
  164.     pierwsza'(n,n-1)
  165.  
  166. //Utwórz następujące funkcje: 1) mnożenia ułamka przez liczbę; 2) dzielenia ułamka przez liczbę;
  167. //3) pierwiastkowania ułamka. Napisz funkcję zwracającą odwrotność ułamka.
  168.  
  169. let mululamek (liczba:int, licznik:int, mianowknik:int ) =
  170.    licznik * liczba , mianowknik
  171.  
  172. let divulamek (liczba:int, licznik:int, mianowknik:int ) =
  173.    licznik , mianowknik * liczba
  174.  
  175. let sqrtulamek (licznik:float, mianowknik:float ) =
  176.   sqrt (licznik) , sqrt (mianowknik)
  177.  
  178. //Utwórz rekord zawierający dane studenta (imie, naziwsko, indeks) i zadeklaruj kilka rekordów
  179. //zawierających dane studentów. Napisz funkcję sprawdzającą czy dwie osoby mają to samo nazwisko.
  180. type student = {imie: string; nazwisko: string; indeks:int}
  181.  
  182. let SprawdzStudenty (lista: student list) =
  183.    let dl = lista.Length
  184.    let ilosc = ref(0)
  185.    for i = 0 to dl-1 do
  186.        for k = 0 to dl-1 do
  187.            if lista.[i].nazwisko = lista.[k].nazwisko then incr(ilosc)
  188.  
  189.    if ilosc.Value > dl then true else false
  190.  
  191. ///////////////////////////////////////////////////////////////////////////////////////////////////
  192. /////////////////////////////////////Listy funkcje lambda//////////////////////////////////////////
  193. ///////////////////////////////////////////////////////////////////////////////////////////////////
  194.  
  195. //Podaj deklarację funkcji typu int list -> int option odszukującej najmniejszy element z listy liczb całkowitych.
  196. let findmin (lista:int list)=
  197.    List.min lista
  198.  
  199. //Zaproponuj deklarację funkcji length wyznaczającej długość listy.
  200.  
  201. let rec lengh (lista:int list, l:int) =
  202.    match lista with
  203.    | head :: ogon -> lengh(ogon,l+1)
  204.    | head -> l
  205.  
  206. let listlenght (lista:int list) =
  207.    lengh(lista,0)
  208.  
  209. //Zadeklaruj funkcję krotnosc(x,ys), która podaje ile razy element x występuje na liście ys.
  210. let krotnosc (x:int, ys:int list) =
  211.    let ile = ref(0)
  212.    List.iter(fun y -> if y = x then incr(ile)) ys
  213.    ile.Value
  214.  
  215. //Podaj definicję funkcji n-ty typu 'a list*int -> 'a option, która zwraca n-ty element na podanej liście (licząc od zera)
  216. let nelem (lista:int list, x:int) =
  217.    lista.[x]
  218.  
  219. //Napisz funkcję sprawdzającą, czy wszystkie całkowite elementy listy typu int są nieujemne.
  220. let CzyUjemne ( lista: int list) =
  221.    let ile = ref(0)
  222.    List.iter(fun x -> if x<0 then incr(ile)) lista
  223.    if ile.Value = lista.Length then true else false
  224.  
  225.  
  226.  
  227. ///////////////////////////////////////////////////////////////////////////////////////////////////
  228. /////////////////////////////////////////////Klasy/////////////////////////////////////////////////
  229. ///////////////////////////////////////////////////////////////////////////////////////////////////
  230.  
  231. [<AbstractClass>]
  232. type figura(P) =
  233.    inherit Object()
  234.    let mutable Pole = P
  235.  
  236.    member this.pole
  237.        with get() = Pole
  238.        and set(value:float) = Pole <- value
  239.  
  240.    abstract member ObliczPole: unit -> float
  241.  
  242. type Trójkąt(ba,bb,bc) =
  243.    inherit figura(0.0)
  244.    let mutable a:float = ba
  245.    let mutable b:float = bb
  246.    let mutable c:float = bc
  247.  
  248.    override this.ObliczPole() =
  249.        let p = (a+b+c)/2.0
  250.        base.pole <- sqrt(p*(p-a)*(p-b)*(p-c))
  251.        base.pole
  252.  
  253. [<EntryPoint>]
  254. let main argv =
  255.    ///////////////////////////////////////////////////////////////////////////////////////////////
  256.    printfn "-------------------------------------------------------------------------------"
  257.    printfn "----------Funkcje funkcje rekurencyjne, operacje na łańcuchach znaków----------"
  258.    printfn "-------------------------------------------------------------------------------"
  259.    ///////////////////////////////////////////////////////////////////////////////////////////////
  260.    let sil = silnia 3
  261.    printfn "Silnia 3= %A" sil
  262.  
  263.    let ab = adob(2, 10)
  264.    printfn "2 do potego 10= %A" ab
  265.  
  266.    let fib = fibon(5)
  267.    printfn "Fibonacci 5 = %A" fib
  268.  
  269.    let mn = mRn(5,5)
  270.    printfn "5 x 5 = %A" mn
  271.  
  272.    let np = NiePodzielny(15,4)
  273.    printfn "Czy niepodzielne 15 / 4  = %A" np
  274.  
  275.    let st = "Ala ma Kooota"
  276.    let np = liczWyst(st,'o')
  277.    printfn "Znak O występuje w Ala ma Kooota %A razy" np
  278.  
  279.    let st2 = "Ala ma Kooota "
  280.    let np = liczWystOd(st2,3,'a')
  281.    printfn "Znak A występuje w Ala ma Kooota %A razy, liczac od 3 znaku" np
  282.  
  283.    let xrazy = pow(st2,4)
  284.    printfn "Tekst %A powolono 4 razy :%A" st2 xrazy
  285.    ///////////////////////////////////////////////////////////////////////////////////////////////
  286.    printfn "-------------------------------------------------------------------------------"
  287.    printfn "-------------------------------Krotki i rekordy--------------------------------"
  288.    printfn "-------------------------------------------------------------------------------"
  289.    ///////////////////////////////////////////////////////////////////////////////////////////////
  290.    let nw = NWD(600,400)
  291.    printfn "NWD licz 600 i 400 to %A" nw
  292.  
  293.    let li,mi = (3,5) ++ (3,4)
  294.    printfn "3/5 + 3/4 = %A / %A" li mi
  295.  
  296.    let li,mi = (3,5) -- (3,4)
  297.    printfn "3/5 - 3/4 = %A / %A" li mi
  298.  
  299.    let li,mi = (3,5) ** (3,4)
  300.    printfn "3/5 * 3/4 = %A / %A" li mi
  301.  
  302.    let li,mi = (3,5) /./ (3,4)
  303.    printfn "3/5 / 3/4 = %A / %A" li mi
  304.  
  305.    let li,mi = skr (10,35)
  306.    printfn "10/35 = %A / %A" li mi
  307.  
  308.    let stt = naString (-40,35)
  309.    printfn "-40/35 = %A " stt
  310.  
  311.    let z1= (3,5) +++ (3,4)
  312.    printfn "3+5i + 3+4i = %A" z1
  313.  
  314.    let z1= (3,5) --- (3,4)
  315.    printfn "3+5i - 3+4i = %A" z1
  316.  
  317.    let z1= (3,5) *** (3,4)
  318.    printfn "3+5i * 3+4i = %A" z1
  319.  
  320.    let z1= (3,5) /././ (3,4)
  321.    printfn "3+5i / 3+4i = %A" z1
  322.  
  323.    let pier1= pierwsza 10
  324.    let pier2= pierwsza 11
  325.    printfn "Czy 10 jest liczba pierwsza: %A, a czy 11 nia jest :%A" pier1 pier2
  326.  
  327.    let ddd,mmm= mululamek(5,3,5)
  328.    printfn "3/5 * 5 = %A / %A" ddd mmm
  329.  
  330.    let ddd,mmm= divulamek(5,3,5)
  331.    printfn "3/5  / 5  =  %A / %A" ddd mmm  
  332.  
  333.    let ddd,mmm= sqrtulamek(9.0,12.0)
  334.    printfn "pierwiastek z 9/12 =  %A / %A" ddd mmm
  335.  
  336.    let maciek = {imie =  "Maciek";nazwisko =  "Nowak"; indeks =  123452}
  337.    let jan = {imie =  "Jan";nazwisko =  "Nowak"; indeks =  323233}
  338.    let Czesiek = {imie =  "Czesław";nazwisko =  "Kowalski"; indeks =  121212}
  339.    let studenty = [jan;maciek;Czesiek]
  340.    let stt = SprawdzStudenty studenty
  341.    printfn "Czy jest dwóch studentów o takim samym nazwisku: %A" stt
  342.  
  343.    ///////////////////////////////////////////////////////////////////////////////////////////////
  344.    printfn "-------------------------------------------------------------------------------"
  345.    printfn "----------------------------Listy i funkcje lambda-----------------------------"
  346.    printfn "-------------------------------------------------------------------------------"
  347.    ///////////////////////////////////////////////////////////////////////////////////////////////
  348.  
  349.    let liss = [3;2;5;4;3;2;1;5;6;4;-2;5;6]
  350.    let min = findmin liss
  351.    printfn "Najmniejszy element z listy %A  to %A" liss min
  352.  
  353.    let dl = listlenght liss
  354.    printfn "Lista %A  ma  %A elementów" liss dl
  355.  
  356.    let il = krotnosc( 3, liss)
  357.    printfn "Element 3 jest na liscie %A razy" il
  358.  
  359.    let il = nelem( liss, 5)
  360.    printfn "Elementem 5 na liscie jest %A " il
  361.  
  362.    let il = CzyUjemne(liss)
  363.    let lisss = [-3;-2;-5;-4;-3;-2;-1;-5;-6;-4;-2;-5;-6]
  364.  
  365.    let ili = CzyUjemne(lisss)
  366.    printfn "Czy wszystkie elementy są ujemne: %A na liscie %A, a czy na liscie %A : %A " il liss lisss ili
  367.  
  368.    printfn "-------------------------------------------------------------------------------"
  369.    printfn "-------------------------------------Klasy-------------------------------------"
  370.    printfn "-------------------------------------------------------------------------------"
  371.  
  372.    let tr = Trójkąt(3.0,3.0,3.0)
  373.    let polee = tr.ObliczPole()
  374.    printfn "Pole trójkąta o bokach 3,3,3 wynosi: %A " polee
  375.  
  376.    System.Console.ReadKey() |> ignore
  377.    0 // return an integer exit code
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement