Advertisement
Guest User

Untitled

a guest
Jan 28th, 2020
126
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
F# 22.77 KB | None | 0 0
  1. // Learn more about F# at http://fsharp.org
  2.  
  3. open System
  4.  
  5. type osoba = {name:string;wiek:int}
  6.  
  7. type drzewo<'a> =
  8.    |Lisc of 'a
  9.     |Wezel of ('a * (drzewo<'a> list)) //wezel może mieć wiele potomków, dlatego list
  10.  
  11. type pociag (id_:int64, relacja_:string) =
  12.     inherit Object()
  13.     let mutable id:int64 = id_
  14.     let mutable relacja:string = relacja_
  15.  
  16.     member this.Id
  17.         with get () = id
  18.     member this.Relacja
  19.         with get () = relacja
  20.         and set (value:string) = relacja <- value
  21.  
  22. type ekspres (id:int64, relacja:string,akcRower:bool) =
  23.     inherit pociag(id,relacja)
  24.     let mutable akcRower: bool = akcRower
  25.    
  26. // typ dyskryminacyjny o nazwie rbdrzewo do reprezentacji pełnego drzewa binarnego przenoszącego dane typu int. 
  27. //Pełne drzewo binarne //uwaga! nie jest uwzględnione, że korzeń ma wartość
  28. type rbdrzewo<'a> =
  29.    |Lisc of 'a
  30.     |Korzen of (rbdrzewo<'a>  * rbdrzewo<'a>) // tutaj jest ok, nie ma list, ponieważ korzeń może mieć 2 potomków
  31. //Napisz funkcję wyszukującą wartość maksymalną w drzewie powyżej
  32. let rec max (drzewo:rbdrzewo<'a>) =
  33.    match drzewo with
  34.    | Lisc i -> i
  35.    | Korzen (i,j) -> max(j)
  36. // Napisz funkcję wyznaczającą łączaną sumę wszystkich węzłów
  37. //interpretacja - ilość wszystkich węzłów
  38. let rec lacznaSumaWezlow (drzewo) : int =
  39.    match drzewo with
  40.    | Lisc i -> 1
  41.    | Korzen (i,j) -> 1 + (lacznaSumaWezlow i) + (lacznaSumaWezlow j)
  42.  
  43. //Inna wersja powyższego
  44. type rbdrzewo_poprawione<'a> =
  45.     |Lisc of 'a
  46.    |Korzen of ('a * rbdrzewo_poprawione<'a> * rbdrzewo_poprawione<'a>)
  47. //teraz tak bedzie wygladac
  48. let rec max2 (drzewo:rbdrzewo_poprawione<'a>) =
  49.    match drzewo with
  50.    |Lisc i -> i
  51.    |Korzen (i,tree1,tree2) -> max2(tree2)
  52. // Napisz funkcję wyznaczającą łączaną sumę wszystkich węzłów
  53. //interpretacja - suma wartości wszystkich węzłów
  54. //ponieważ jest <'a>, dlatego konwersja do Inta
  55. let rec lacznaSumaWezlow2 (drzewo:rbdrzewo_poprawione<'a>) : int =
  56.    match drzewo with
  57.    | Lisc i -> System.Convert.ToInt32(i)
  58.    | Korzen (i,t1,t2) -> System.Convert.ToInt32(i) + (lacznaSumaWezlow2 t1) + (lacznaSumaWezlow2 t2)
  59.  
  60. //Napisz funkcję wykorzystującą wyrażenie lambda, wybierającą te elementy z listy liczb rzeczywistych (float list), 
  61. //które są całkowite parzyste (wynik typu int list).
  62. let wybierzParzyste (tab:float list) =
  63.    let parzyste = List.filter (fun x -> int(x) % 2 = 0) tab
  64.    List.map (fun x -> int(x)) parzyste
  65.  
  66. //sekwencja x / (i + 1 ), x jest argumentem sekwencji
  67. let seq1 x = Seq.initInfinite (fun i -> float(x/i+1)) //złe - nie może być Infinite, jest od i do x (i = 1  początkowo)
  68.  
  69. let seqq1 x = seq {
  70.               let mutable i = 1;              
  71.               while i <= x do
  72.                    yield float(x/(i+1))
  73.                    i <- i + 1 // tak się przypisuje wartość do zmiennej mutable
  74.            }
  75.  
  76. let seqq1_ref x = seq{
  77.              let i = ref 1
  78.              while !i <= x do
  79.                    yield float(x/(!i+1))
  80.                    i := !i  + 1 // tak się przypisuje wartość do zmiennej ref
  81.            }
  82.  
  83. //kwerenda zawężająca wyniki do tych, które są większe od 1e-9
  84. let kwerenda1 = query {
  85.                for x in (seqq1 2) do
  86.                where (x > 1e-9)
  87.                select x
  88.    }
  89.  
  90. //Napisac funkcje która znajdzie osoby z przedziału wieku <20, 30> i 
  91. //zaczynające się na slowo “Ko” type osoba = {wiek : int, nazwisko : string}
  92. let znajdzOsoby (listaOsob:osoba list) =
  93.    List.filter (fun osoba -> osoba.name.StartsWith("Ko") && osoba.wiek > 20 && osoba.wiek < 30 ) listaOsob
  94.  
  95. //Zaproponuj typ dyskryminacyjny o nazwie rbdrzewo repeprezentujace drzewo czarnoczerwone.
  96. //Poszczególne dane sa typu int. Drzewo ma wierzchołki typu 1)czarne liscie 2)czerwnoe liscie 3)czarny korzen.
  97. //Korzenie sa zawsze z dwoma potomkami lewym i prawym, ktore mogą byc typu 1 2  3
  98. type rbdrzewo2 =
  99.    |ListCzarny of int
  100.    |ListCzerwony of int
  101.    |Korzen of (rbdrzewo2 * rbdrzewo2 )
  102. //pytanie czy korzeń może przechowywać wartość, jeżeli tak, to:
  103. //  |Korzen of (int * rbdrzewo2 * rbdrzewo2 )
  104.  
  105. let rec wyszukajWszystkieLiscieCzerwony (drzewo:rbdrzewo2) =
  106.    match drzewo with
  107.        |ListCzarny i -> []
  108.        |ListCzerwony i -> [ListCzerwony i]
  109.        |Korzen (i,j) -> (wyszukajWszystkieLiscieCzerwony i)@(wyszukajWszystkieLiscieCzerwony j)
  110.  
  111. //wyszukiwanie wszystkich czarnych liści w drzewie
  112. let rec wyszukajWszystkieCzarne (drzewo:rbdrzewo2) =
  113.    match drzewo with
  114.    |ListCzerwony i -> []
  115.    |ListCzarny  i->  [ListCzarny  i]
  116.    |Korzen (i,j)-> (wyszukajWszystkieCzarne i)@(wyszukajWszystkieCzarne j)
  117.  
  118. //typ drzewo o czarnym lisciu, czerwonym korzeniu i czarnym korzeniu, przenoszą dowolne typy
  119. type KolejneDrzewo<'a> =
  120.     |LiscCzarny of 'a
  121.    |LiscCzerwony of 'a
  122.     |CzarnyKorzen of ('a * KolejneDrzewo<'a> * KolejneDrzewo<'a> )
  123.  
  124. //wyszukaj wszystkie Czarne węzły
  125. let rec znajdzWszystkieCzarneWezly (d:KolejneDrzewo<'a>) =
  126.     match d with
  127.     |LiscCzarny i -> [LiscCzarny i]
  128.     |LiscCzerwony i -> []
  129.     |CzarnyKorzen (i,t1,t2) -> [CzarnyKorzen (i,t1,t2)]@(znajdzWszystkieCzarneWezly t1)@(znajdzWszystkieCzarneWezly t2)
  130.  
  131. let rec wyznaczNajwiekszaWysokosc (d:KolejneDrzewo<'a>) : int =
  132.    match d with
  133.        |LiscCzarny i | LiscCzerwony i -> 1
  134.        |CzarnyKorzen (i,t1,t2) -> System.Math.Max((wyznaczNajwiekszaWysokosc t1),(wyznaczNajwiekszaWysokosc t2))
  135.  
  136. // Dane jest drzewo powyższe. Napisz funkcje wyznaczajaca w drzeiw liczbę węzłów czarnych
  137. let rec zliczCzarrneLiscie (drzewo:rbdrzewo2) :int =
  138.    match drzewo with
  139.    | ListCzerwony i -> 0
  140.    | ListCzarny i -> 1
  141.    | Korzen (i,j) -> (zliczCzarrneLiscie i)+(zliczCzarrneLiscie j)
  142. //modyfikacja powyższego, uwzględnia czarny korzeń
  143. let rec zliczCzarrneWezly (drzewo:rbdrzewo2) : int =
  144.    match drzewo with
  145.    | ListCzerwony i -> 0
  146.    | ListCzarny i -> 1
  147.    | Korzen (i,j) -> 1 + (zliczCzarrneWezly i) + (zliczCzarrneWezly j) //korzeń jest czarny, dlatego należy go uwzględnić
  148.  
  149. //Inny przykład
  150. //próba opisujący drzewo czarno-czerwone przenoszący DOWOLNE wartości - chyba tak będzie:
  151. type rbdrzewo3Dowolne<'a> =
  152.     |KorzenCzarny of 'a * rbdrzewo3Dowolne<'a>  * rbdrzewo3Dowolne<'a>
  153.    |KorzenCzerwony of 'a * rbdrzewo3Dowolne<'a>  * rbdrzewo3Dowolne<'a>
  154.     |Lisc of 'a
  155. //funkcja zwracająca drzewo gdzie wszystkie czerwone węzły są zamienione na czarne
  156. let rec zamienDowolne d:rbdrzewo3Dowolne<'a> =
  157.    match d with
  158.    | Lisc i -> Lisc i
  159.    | KorzenCzarny (i,j,k) -> KorzenCzarny (i, zamienDowolne j, zamienDowolne k)
  160.    | KorzenCzerwony (i,j,k) -> KorzenCzarny (i,zamienDowolne j, zamienDowolne k)
  161.  
  162. ////typ dyskryminacyjny opisujący drzewo czarno-czerwone przenoszący dowolne wartości
  163. type rbdrzewo3<'a> =
  164.    |KorzenCzarny of 'a * rbdrzewo3<'a> * rbdrzewo3<'a>
  165.     |KorzenCzerwony of 'a * rbdrzewo3<'a> * rbdrzewo3<'a>
  166.    |Lisc of 'a
  167.  //funkcja zwracająca drzewo gdzie wszystkie czerwone węzły są zamienione na czarne
  168. let rec zamien (d:rbdrzewo3<'a>) =
  169.    match d with
  170.    | Lisc i -> Lisc i
  171.    | KorzenCzarny (i,j,k) -> KorzenCzarny (i, zamien j, zamien k)
  172.    | KorzenCzerwony (i,j,k) -> KorzenCzarny (i,zamien j, zamien k)
  173.  
  174. //Zaproponuj typ dyskryminacyjny o nazwie objętość do reprezentacji różnych jednostek objętości
  175. //(np: 2.5 litry, 3 galony, 4 korce, 2 konwie).
  176. type objetosc =
  177.    | Litr of float
  178.    | Galon of float
  179.    | Korc of float
  180.    | Konwa of float
  181.  
  182. //Napisz funkcję przekształającą objętość zapisaną w postaci Konew na Litr. Jedna konew to 13.75 litrów. 
  183. //Pozostałe objętości pozostają bez zmian
  184. let przeksztalcZKonwyNaLitr (d:objetosc) : objetosc =
  185.    match d with
  186.    | Konwa i -> Litr (i * 13.75)
  187.    | other -> other
  188.  
  189. // Dana jest lista elementów typ objetosc list). Napisz funkcję wyznaczającą łączne sumy z podziałem na 
  190. //pojemności podanego typu (litry dodajemy do litrów, galony do galonów itd.).
  191. let sumujObjetosci (obj:objetosc list) =
  192.    let rec sumuj (par:objetosc list) (litry:float) (galony:float) (korce:float) (konwy:float) =
  193.        match par with
  194.             | [] -> [Litr litry]@[Galon galony]@[Korc korce]@[Konwa konwy]
  195.             | (Litr i)::t -> sumuj t (litry+i) galony korce konwy
  196.             | (Galon i)::t -> sumuj t litry (galony+i) korce konwy
  197.             | (Korc i)::t -> sumuj t litry galony (korce+i) konwy
  198.             | (Konwa i)::t -> sumuj t litry galony korce (konwy+i)
  199.    sumuj obj 0.0 0.0 0.0 0.0
  200.  
  201. //czy dla podanych danych wejściowych znajdź te liczby, które są sześcianem pewnej liczby
  202. let rec czyJestSzescianem (i:float) (liczba:float) : bool =
  203.    if (i*i*i = liczba) then true
  204.                        else if i < liczba then czyJestSzescianem (i+1.0) liczba
  205.                                            else false
  206.  
  207. let znajdźWszystkieSzesciany (liczby:float list) : float list =
  208.    List.filter (fun x -> czyJestSzescianem 1.0 x) liczby
  209.  
  210. //deklaracja klasy gruszka, która dziedziczy z owocu
  211. type Owoc (_smak:string,_waga:float) =
  212.    inherit Object()
  213.    let mutable smak = _smak
  214.    let mutable waga = _waga
  215.  
  216.    member this.Smak
  217.        with get () = smak
  218.        and set (value:string) = smak <- value
  219.    member this.Waga
  220.        with get () = waga
  221.  
  222. type Gruszka (_smak:string,_waga:float,_odmiana:string) =
  223.    inherit Owoc(_smak,_waga)
  224.  
  225.    let mutable odmiana = _odmiana
  226.  
  227. //sekwencja a_i = (i!) / sqrt(i+1)
  228. let rec silnia n =
  229.    match n with
  230.    |0 -> 1
  231.    |1 -> 1
  232.    |_ -> n * silnia (n-1)
  233.  
  234. let pierwiastek n = System.Math.Pow(n,0.5)
  235.  
  236. //raczej niewłaściwe, nie może być Infinite
  237. let sekwencja = Seq.initInfinite(fun i -> System.Convert.ToDouble(silnia i) / (pierwiastek (System.Convert.ToDouble(i)+1.0)))
  238. //II sposób
  239. let sekwencja2 x = seq{
  240.            let i = ref 1.0
  241.            let silnia = ref 1.0
  242.            let mianownik = ref 0.0
  243.            while !i <= x do
  244.                silnia := !silnia * !i
  245.                mianownik := System.Math.Sqrt(!i + 1.0)
  246.                yield (!silnia / !mianownik)
  247.                i := !i + 1.0            
  248.    }
  249. let sekwencja2_noRef x = seq{
  250.           let mutable i = 1.0
  251.           let mutable silnia = 1.0
  252.           while i <= float(x) do
  253.                yield silnia / System.Math.Sqrt(i+1.0)
  254.                i <- i + 1.0
  255.                silnia <- silnia * i        
  256.        }
  257.  
  258. //Utwórz kwerendę, która zawęzi elementy sekwencji z poprzedniego zadania do tych wartości, które są mniejsze od
  259. let sekwencjaQuery = query {
  260.                for p in sekwencja do
  261.                where (p < 1e-10)
  262.                select p              
  263. }
  264.  
  265. //II sposób - do sekwencja2
  266. let sekwencjaQuery2 = query {
  267.    for p in sekwencja2 10.0 do
  268.    where (p < 1e-10)
  269.    select p              
  270. }
  271.  
  272. //zdefiniuj typ ksiazka (autor, tytul, rok wydania) i napisz funkcje, ktora zwrooci te ksiazki wydane miedzy rokiem
  273. //1970 a 1980
  274. type ksiazka = {
  275.    autor:string;
  276.    tytul:string;
  277.    rokWydania:int}
  278.  
  279. let znajdzKsiazki (ksiazki:ksiazka list) : ksiazka list =
  280.    List.filter (fun k -> k.rokWydania > 1970 && k.rokWydania < 1980) ksiazki
  281.  
  282. //4. Zaproponuj typ dyskryminacyjny o nazwie dlugosc do reprezentacji różnych 
  283. //jednostek długości (np: 1.5 metra, 3 piędze, 4 łokcie, 2 ćwierci).
  284. type Dlugosc =
  285.    |Metr of float
  286.    |Piedz of int
  287.    |Lokiec of int
  288.    |Cwierc of int
  289.  
  290. //Napisz funkcję przekształającą długość z zadania 4 zapisaną w postaci Ćwierć na Metr. Jedna ćwierć to 0.1489 metra. 
  291. //Pozostałe długości pozostają bez zmian.
  292. let zamienCwierNaMetr (obj:Dlugosc) =
  293.    match obj with
  294.    | Cwierc i -> Metr (0.1489 * System.Convert.ToDouble(i))
  295.    | other -> other
  296.  
  297. // Napisz funkcję wyznaczającą łączne sumy z podziałem na długości podanego typu 
  298. //(metry dodajemy do metrów, piedź do piedzi itd.).
  299. let dodajDlugosci (lista:Dlugosc list) =
  300.    let rec sumujWszystko(lst:Dlugosc list,metry:float,piedzi:int,lokcie:int,cwierci:int ) =
  301.        match lst with
  302.        | [] -> [Metr metry]@[Piedz piedzi]@[Lokiec lokcie]@[Cwierc cwierci]
  303.        | (Metr i)::teil -> sumujWszystko(teil,metry+i,piedzi,lokcie,cwierci)
  304.        | (Piedz i)::teil -> sumujWszystko(teil,metry,piedzi+i,lokcie,cwierci)
  305.        | (Lokiec i)::teil -> sumujWszystko(teil,metry,piedzi,lokcie+i,cwierci)
  306.        | (Cwierc i)::teil -> sumujWszystko(teil,metry,piedzi,lokcie,cwierci+i)
  307.    sumujWszystko(lista,0.0,0,0,0)
  308.  
  309. //sekwencja dla wyrażenia i! / sqrt(i + 1)
  310. let sekwencjaS x = seq{
  311.                let mutable i = 1
  312.                let mutable licznik = 1
  313.                while i <= x do
  314.                    licznik <- licznik * i
  315.                    yield (float(licznik)/ System.Math.Sqrt(float(i)+1.0))
  316.                    i <- i+1                    
  317.            }
  318.  
  319. let sekwencjaS_ref x = seq{
  320.            let i = ref 1.0
  321.            let licznik = ref 1.0
  322.            while !i <= x do
  323.                licznik := !licznik * !i
  324.                yield (!licznik / System.Math.Sqrt(!i+1.0))
  325.                i := !i + 1.0
  326.            }
  327.  
  328. type mojTypD =
  329.    | Lisc of int
  330.    | Korzen of int * mojTypD
  331.  
  332. let sprawdz (s:mojTypD option) =
  333.    match s with
  334.    | Some (Lisc i) -> i
  335.    | None -> failwith("Błąd ")
  336.  
  337.  
  338. //funkcja sprawdzająca, czy liczba jest 5 potęgą pewnej liczby
  339. let sprawdzCzyJest5Potega (liczba:int) : bool =
  340.    let rec sprawdz i liczba =    
  341.        if i * i * i * i * i = liczba then true
  342.        else if i>liczba then false
  343.             else sprawdz (i+1) liczba
  344.    sprawdz 1 liczba
  345.  
  346. let sprawdzTabliceCzyDo5 (lista:int list) : int list =
  347.    List.filter (fun x -> (sprawdzCzyJest5Potega x)) lista
  348.  
  349.  
  350. //sekwencja e do potęgi x
  351. let sekwencjaE (x:int) (k:int) = seq{
  352.        let mutable i = 0.0
  353.        let mutable licznik = 1.0
  354.        let mutable mianownik = 1.0
  355.        let mutable aktualnaSuma = 0.0
  356.        while i <= float(k) do
  357.            aktualnaSuma <- (licznik / mianownik) + aktualnaSuma
  358.            yield aktualnaSuma            
  359.            licznik <- licznik * float(x)
  360.            i <- i + 1.0
  361.            mianownik <- mianownik * i            
  362. }
  363.  
  364. //_________________________nowe
  365.  
  366. //sekwencja sqrt( sin( (x*y)/(p+1) )  ) - 2  // x i y podane
  367. let sekwencjaTrudna x y = seq{
  368.    let mutable i = 1
  369.    while i <= x do
  370.        yield System.Math.Sqrt( System.Math.Sin((float(x)*float(y))/(float(i)+1.0))) - 2.0
  371.        i <- i + 1            
  372. }
  373. //kwerenda, która zawezi kwerendę z x = 3 i y = -6 do wartości mniejszych lub równych niż eps
  374. let querySekwencjiTrudnej =
  375.    query{ for p in (sekwencjaTrudna 3 -6) do
  376.           where (p < 1e-10)
  377.           select p          
  378.    }
  379. //drzewo binarne zawierające dowolny typ danych. Węzły drzewa mogą być koloru czarnego lub czerwonego.
  380. //Liście tylko czarnego. Zapisz typ dyskryminacyjny dla węzła takiego drzewa
  381. type inneDrzewo<'a> =
  382.     | WezelCzarny1 of ('a * inneDrzewo<'a>)
  383.     | WezelCzerwony1 of ('a * inneDrzewo<'a>)
  384.     | WezelCzarny2 of ('a * inneDrzewo<'a> * inneDrzewo<'a>)
  385.    | WezelCzerwony2 of ('a * inneDrzewo<'a> * inneDrzewo<'a>)
  386.     | LiscCzarny of 'a
  387.  
  388. //Funkcja przyjmuje drzewo i zwraca to samo drzewo, ale z wszystkimi węzłami koloru czarnego
  389. let rec zamienWszystkoNaCzarno (drzewo:inneDrzewo<'a>) =
  390.     match drzewo with
  391.         |LiscCzarny a -> LiscCzarny a
  392.         |WezelCzarny1 (a,t1) -> WezelCzarny1 (a, zamienWszystkoNaCzarno t1)
  393.         |WezelCzerwony1 (a,t1) -> WezelCzarny1 (a, zamienWszystkoNaCzarno t1)
  394.         |WezelCzarny2 (a,t1,t2) -> WezelCzarny2 (a, zamienWszystkoNaCzarno t1, zamienWszystkoNaCzarno t2)
  395.         |WezelCzerwony2 (a,t1,t2) -> WezelCzarny2 (a, zamienWszystkoNaCzarno t1, zamienWszystkoNaCzarno t2)
  396.  
  397. [<EntryPoint>]
  398. let main argv =
  399.  
  400.     //______________________________________________________________________________zagadnienia na egzamin z kia
  401.     //zad 1.1
  402.     let w = 10
  403.     let y = w * 10 ; w + 20 ; w / 3 //pierwsze dwie części są ignorowane, wynik jest typu int (wynika z kontekstu)
  404.     printfn "Wynik zadania nr 1 = %A" y
  405.  
  406.     //zad 1.2
  407.     let z = printf "ABC " ; List.iter (fun x -> printf "%d, " x) [1 .. 5] //Najpierw wypisze \\\ 'ABC ', a potem iteracyjnie
  408.     printfn ""                                                            // '%i, ', gdzie i idzie od 1 do 5      
  409.  
  410.     //zad 1.3
  411.     let r = 10 |> sprintf "%d"      //tworzy 10 jako łańcuch - "10"
  412.     printfn "Zadanie nr 3, wartość r = %A" r
  413.     let w = Array.create 10 r //Funkcja tworzy tablicę o zadanej długości (10) i inicjalizuje te wszystkie elementy zadaną wartością ("10")
  414.     printfn "Zadanie nr 3, wartość w = %A" w
  415.     let ss = for x in w do (ignore x)  // ignoruje wszystkie wartości w tablicy w
  416.     printfn "Wynik ss = %A" ss    
  417.  
  418.  
  419.     //zad 2.1
  420.     let listSzukaj (czN:string) (dane:osoba list) : osoba list =
  421.         List.filter (fun x -> x.name.Contains(czN)) dane //pierwszy argument - funkcja anonimowa, drugi - tablica
  422.  
  423.     let rec listSzukaj2 (czN:string) (dane:osoba list) : osoba list =
  424.         match dane with
  425.            |[] -> []
  426.            |h::t -> if h.name.EndsWith(czN) then h::(listSzukaj2 czN t)
  427.                                            else (listSzukaj2 czN t)  
  428.  
  429.     //zad 2.2
  430.     let sortujPoNazwisku (dane:osoba list) : osoba list =
  431.         List.sortBy (fun x -> x.name) dane //pierwszy argument - funkcja anonimowa, po czym ma być sortowane, drugi atguemnt - dane
  432.  
  433.     //zad 3.1
  434.     //Zaproponuj typ dyskryminacyjny opisujący drzewo
  435.     //przed main'em
  436.    
  437.     //zad 4.1
  438.     let wedata = [1 ; 3; 5; 9; 12; 16; 20; 25; 30; 36; 48]  
  439.     let wy = List.filter (    
  440.             let rec isKw i v = if i / 2 <= v then (i*i = v || isKw (i+1) v)
  441.                                else false    
  442.             fun x -> isKw 0 x
  443.         )
  444.    
  445.     printfn "Wynik zadania 4.1 = %A" (wy wedata)
  446.  
  447.     //zad 5.1 zadanie z klasami
  448.     //nad main'tem klasy pociąg i ekspres
  449.  
  450.     //zad 6.1
  451.     let mdata (dw:System.DayOfWeek) (start:System.DateTime) =
  452.         seq {
  453.             let mutable chkdate = start
  454.             while true do
  455.                 if chkdate.DayOfWeek = dw
  456.                     then yield chkdate
  457.                          chkdate <- new System.DateTime(chkdate.Year + 1, start.Month, start.Day)
  458.             }
  459.  
  460.     //zad 7.1
  461.     let pondz = mdata System.DayOfWeek.Monday (new System.DateTime(2020,2,2))
  462.     let leapp = query { for p in pondz do
  463.                         where ((p.Year % 4 = 0) && (p.Year % 100 <> 0 || p.Year % 400 = 0))
  464.                         select p                    
  465.                 }
  466.     //______________________________________________________________________________dodatkowe z powtórkowego wykładu
  467.     //różniczkowanie listy float
  468.     let rec aplikujRozniczke st l =
  469.         match l with
  470.         | [] -> []
  471.         | h::t -> (st*h)::(aplikujRozniczke (st+1.0) t)
  472.    
  473.     let rozniczkuj (w:float list) =
  474.         match w with
  475.         | [] -> []
  476.         | [h] -> []
  477.         | h::t -> aplikujRozniczke 1.0 t
  478.  
  479.     printfn "Wynik różniczki: %A" <| rozniczkuj [-5.0;4.0;1.0]
  480.  
  481.     //yield - yield przenosi kontrolę programu pomiędzy metodą wywołującą a kolekcją
  482.     printfn "%A" <| [for i in 1..10 do yield i*i]
  483.  
  484.    
  485.     //_____________________________________________________________________________________zadania z pliku
  486.     //zad ile wyniesie wartość zmiennej
  487.     let c = (fun a b -> let d = a 10 in d - 4 * b ) (fun c -> c + c) 5
  488.     let x = 5; c - 6
  489.     printfn "Wartość zmiennej c oraz x = %i %i" c x
  490.  
  491.     let a = (fun b c -> let d = b 4 in d - 2 * c) (fun a -> a * a ) 5
  492.     //pod b nie jest przekazywana wartość, tylko funkcja anonimowa a*a, dlatego d = (a*a) 4 -- d = 4*4 = 16
  493.     printfn "Wartość zmiennej a = %i" a
  494.  
  495.     //zad co wypisze program
  496.     let z = 1
  497.     List.iter(fun x -> z = z * x; () ) [1..5]
  498.     printf "Program wypisze: %d \n" z //z jest nie jest typu mutable i nie można zmienić wartości
  499.  
  500.     //znajdz w liście osoby, których wiek <20,30> i name kończy się na ski
  501.     let szukajOsob (lista:osoba list):osoba list =
  502.         List.filter (fun x -> x.wiek > 20 && x.wiek < 30 && x.name.EndsWith("ski")) lista
  503.  
  504.     //ile wyniesie wartość zmiennej
  505.     let c = (fun a b -> let d = a * b in d - 4 * a ) 5 1
  506.     let x = c - 6
  507.               - 5
  508.     printf "Program wypisze: %d oraz %d \n" c x
  509.  
  510.     let z = ref 0 //z jest wskaźnikiem
  511.     Seq.iter( fun x -> z := !z + x) [1..5] //! weź wartość spod adresu
  512.     printfn "Porgram to wykonaniu sekwencji: %A \n" !z
  513.  
  514.     let cb = (fun a b -> let d = a * b in d - 4 * a ) 1 5
  515.     let xb = cb - 6
  516.                  + 5
  517.     printf "Program wypisze: %d dla cb oraz %d dla xb\n" cb xb
  518.  
  519.  
  520.     printf "Sekwencja: %A\n" (seqq1_ref 5)
  521.     printf "Sekwencja: %A\n" (seqq1 5)
  522.  
  523.     printf "sekwencjaS: %A\n" (sekwencjaS 3)
  524.     printf "sekwencjaS_ref: %A\n" (sekwencjaS_ref 3.0)
  525.  
  526.     printfn "Sprawdz czy jest do 5 potęgi %A" (sprawdzTabliceCzyDo5 [1; 5; 32; 64 ; 243])
  527.    
  528.     printfn "SekwencjaE dla x = %i,   %A" 1 (sekwencjaE 1 100)
  529.    
  530.     //kończę na stronie 12
  531.  
  532.     //_______________________________________________________________________inne (fold)
  533.     let daneWe =   [3;  4; 6; 8; 10; 2; 1; 5; 9; 7; 8; 7];
  534.     let zlicz lista = List.fold (fun stan el -> stan + 1) 0 lista
  535.     printfn "Fold zliczająca elementy: %d" (zlicz daneWe)
  536.  
  537.  
  538.     //__________________________________________________________________nowe
  539.     let y = 5
  540.     let b = (fun c -> c <| 8) (fun d e -> if e then d/2 else -d*2)
  541.     let x = if (let y =3 in y = y + 1) then b (y = y / 4) else b (y = y + 2)
  542.     printfn"Wyniki dla powyższego: y = %A, x = %x\n" y x
  543.  
  544.     //co wypisze program
  545.     printfn "Program wypisze: "
  546.     List.iter (fun r -> if r = r*3 then printfn "%d" r) [9..-1..-8]
  547.     let a p = (0,p)  
  548.     let y = List.map (fun x -> printfn "%A" (a x); a) [2]
  549.     printfn "Zacznij\n"
  550.  
  551.     let yy = (fun a b -> let d = b -4 in d  - (b +3) * a) 5 (fun c -> c + c / 2)
  552.     let x = if ( let yy = 0 in yy = yy * +3) then (yy = yy / 2)  else  not (yy = yy + 2)
  553.     printfn"yy = %A  ,  x = %A" yy x
  554.  
  555.     let y = (fun a b -> let d = a +2 in (a -3)*b + 2) (fun c -> c / 3 + c) 7
  556.     let x = if (let y = 0 in y = y / -1) then not (y = y *2) else y = y - 4
  557.  
  558.     printfn"y = %A  ,  x = %A\n" y x
  559.  
  560.  
  561.     let zzz = 1
  562.     let mmm = Seq.map (fun x -> printfn "%d" <| x + 1; zzz = zzz * x; () ) {2 .. 4}
  563.     printfn "%A" (zzz,mmm)
  564.  
  565.     let proba = (fun c -> c <| 8) ((fun w -> w <| 2) (fun a b d -> 100 * a + 10 *  b +  d) 5)
  566.  
  567.     printfn "%A" (proba)
  568.  
  569.     let x = 5
  570.             -6
  571.     0 // return an integer exit code
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement