Advertisement
Guest User

F# Żywność

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