Advertisement
Guest User

Untitled

a guest
Jan 19th, 2018
45
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
F# 5.72 KB | None | 0 0
  1. open System
  2.  
  3. //Przy funkcjach napisane są typy parametrów i wyniku funkcji
  4. //Na zaliczeniu nie jest to konieczne
  5.  
  6. //typ pozwalający zapisać ilość:
  7. // wody
  8. // tłuszczu (w tym utwardzonego)
  9. // węglowowanów (w tym cukrów)
  10. // białka
  11. // błonnika
  12.  
  13. //sposób zapisywania danych może być dowolny
  14. // tutaj wykorzystana jest lista, ale można było użyć też krotki albo tablicy
  15. type nutr_el =
  16.     | Woda of float
  17.     | Tluszcz of float*float
  18.     | Weglowowany of float*float
  19.     | Bialko of float
  20.     | Blonnik of float
  21.  
  22. type nutr = nutr_el list
  23.  
  24. //Wczytaj dane od użytkownika, zwróć skład produktu
  25. let wczytaj(unit):nutr option =
  26.     let input = System.Console.ReadLine()
  27.     let array = input.Split(',')
  28.    
  29.     if array.Length = 7 then let mutable woda = 1.0
  30.                              let mutable tluszcz1 = 1.0
  31.                              let mutable tluszcz2 = 1.0
  32.                              let mutable weglowowany1 = 1.0
  33.                              let mutable weglowowany2 = 1.0
  34.                              let mutable bialko = 1.0
  35.                              let mutable blonnik = 1.0
  36.                              if Double.TryParse(array.[0],&woda) &&
  37.                                 Double.TryParse(array.[1],&tluszcz1) &&
  38.                                 Double.TryParse(array.[2],&tluszcz2) &&
  39.                                 Double.TryParse(array.[3],&weglowowany1) &&
  40.                                 Double.TryParse(array.[4],&weglowowany2) &&
  41.                                 Double.TryParse(array.[5],&bialko) &&
  42.                                 Double.TryParse(array.[6],&blonnik)
  43.                                 then Some [Woda woda;
  44.                                            Tluszcz (tluszcz1,tluszcz2);
  45.                                            Weglowowany (weglowowany1,weglowowany2);
  46.                                            Bialko bialko;
  47.                                            Blonnik blonnik]
  48.                                 else None
  49.                         else None
  50.  
  51. //Zsumuj cały skład
  52. //Jeśli suma < 100%, zwróć % zatajonych składników
  53. //Jeśli suma > 100%, skład jest niepoprawny
  54. let zweryfikuj (sklad:nutr):unit =
  55.     //funkcja sumująca skład
  56.     let rec suma(s:nutr):float =
  57.         match s with
  58.         | head::tail -> match head with
  59.                         | Woda w -> w + suma tail
  60.                         | Tluszcz (t,_) -> t + suma tail
  61.                         | Weglowowany (w,_) -> w + suma tail
  62.                         | Bialko b -> b + suma tail
  63.                         | Blonnik b -> b + suma tail
  64.         | [] -> 0.0
  65.  
  66.     let s = (suma sklad)
  67.     let wynik = 100.0 - s
  68.     if wynik > 0.0 then printfn "Utajony skład: %f%%" (wynik)
  69.         elif wynik < 0.0 then printfn "Niepoprawny skład"
  70.             else printfn "Poprawny skład"
  71.  
  72. //Korzystając z funkcji z zadania 2 (wczytującą skład z inputu użytkownika)
  73. //Wywołuj tą funkcję do momentu gdy funkcja zwróci wartość None
  74. //Zwróć listę składów
  75.  
  76. let rec zad4(unit):nutr list =
  77.     match wczytaj() with
  78.     | Some s -> s::(zad4())
  79.     | None -> []
  80.  
  81. //zwróć składnik, którego jest najwięcej
  82. //Wariant A - jeśli są dwa takie składniki, zwraca pierwszy jaki napotka
  83. let znajdzMax1(list:nutr):nutr_el =
  84.     List.maxBy (fun x -> match x with
  85.                          | Woda w -> w
  86.                          | Tluszcz (t,_) -> t
  87.                          | Weglowowany (w,_) -> w
  88.                          | Bialko b -> b
  89.                          | Blonnik b -> b) list
  90.  
  91. //Wariant B -> zwraca listę takich elementów
  92. //nutr_el list jest równe nutr
  93. let znajdzMax2(sklad:nutr):nutr_el list =
  94.     //matchowanie jest tutaj niekonieczne, ponieważ wiemy, że lista ma pięć elementów i znamy ich kolejność
  95.     //ale to jest uniwersalne rozwiązanie, które działa też w przypadkach, gdzie elementy listy mogą się powtarzać
  96.     let rec znajdzMax2Helper1(s:nutr) (a,b,c,d,e) =
  97.         match s with
  98.         | head::tail -> match head with
  99.                         | Woda x ->             znajdzMax2Helper1 tail (a+x,b,c,d,e)
  100.                         | Tluszcz (x,_) ->      znajdzMax2Helper1 tail (a,b+x,c,d,e)
  101.                         | Weglowowany (x,_) ->  znajdzMax2Helper1 tail (a,b,c+x,d,e)
  102.                         | Bialko x ->           znajdzMax2Helper1 tail (a,b,c,d+x,e)
  103.                         | Blonnik x ->          znajdzMax2Helper1 tail (a,b,c,d,e+x)
  104.         | [] -> (a,b,c,d,e)
  105.  
  106.     // bez określenia typów parametrów funkcji, kompilator nie wie jaką wersję funkcji Max ma użyć
  107.     let znajdzMax2Helper2 (a:float,b:float,c:float,d:float,e:float):float =
  108.         Math.Max(Math.Max(Math.Max(a,b),c),Math.Max(d,e))
  109.  
  110.     let rec znajdzMax2Helper3 (s:nutr) (max:float) =
  111.         match s with
  112.         | head::tail -> match head with
  113.                         | Woda x when x=max->              head::znajdzMax2Helper3 tail max
  114.                         | Tluszcz (x,_) when x=max ->      head::znajdzMax2Helper3 tail max
  115.                         | Weglowowany (x,_) when x=max ->  head::znajdzMax2Helper3 tail max
  116.                         | Bialko x when x=max ->           head::znajdzMax2Helper3 tail max
  117.                         | Blonnik x when x=max ->          head::znajdzMax2Helper3 tail max
  118.                         | _ -> znajdzMax2Helper3 tail max
  119.         | [] -> []
  120.  
  121.     let krotka = znajdzMax2Helper1 sklad (0.0,0.0,0.0,0.0,0.0)
  122.     let max = znajdzMax2Helper2 krotka
  123.     znajdzMax2Helper3 sklad max
  124.  
  125.  
  126.  
  127. [<EntryPoint>]
  128. let main argv =
  129.     let result = wczytaj()
  130.     match result with
  131.     | Some s -> zweryfikuj s
  132.                 printfn "%A" <| znajdzMax2 s
  133.     | None -> ()  
  134.  
  135.     ignore <| System.Console.ReadLine()
  136.     0 // return an integer exit code
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement