Advertisement
Guest User

Untitled

a guest
Jan 19th, 2018
225
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.84 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ęglowodanó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. | Weglowodany 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].Replace('.',','),&woda) &&
  37. Double.TryParse(array.[1].Replace('.',','),&tluszcz1) &&
  38. Double.TryParse(array.[2].Replace('.',','),&tluszcz2) &&
  39. Double.TryParse(array.[3].Replace('.',','),&weglowowany1) &&
  40. Double.TryParse(array.[4].Replace('.',','),&weglowowany2) &&
  41. Double.TryParse(array.[5].Replace('.',','),&bialko) &&
  42. Double.TryParse(array.[6].Replace('.',','),&blonnik)
  43. then Some [Woda woda;
  44. Tluszcz (tluszcz1,tluszcz2);
  45. Weglowodany (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. | Weglowodany (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. | Weglowodany (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. | Weglowodany (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. | Weglowodany (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