Advertisement
Guest User

Untitled

a guest
Mar 13th, 2019
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
F# 2.59 KB | None | 0 0
  1. // Learn more about F# at http://fsharp.org
  2. // See the 'F# Tutorial' project for more help.
  3.  
  4. type ulamek = {licznik: int; mianownik: int}
  5.  
  6. exception DzieleniePrzezZero
  7.  
  8. let rec NWD = function
  9.     | (0, n) -> n
  10.     | (m, n) -> NWD(n % m, m)
  11.  
  12. let skroc (q: ulamek) =
  13.     let znak = if q.licznik * q.mianownik < 0 then -1 else 1
  14.     let al = abs q.licznik
  15.     let am = abs q.mianownik
  16.     let d = NWD(al, am)
  17.     in {licznik = znak * (al / d); mianownik = am / d}
  18.  
  19. let ( ++ ) (q1: ulamek) (q2: ulamek) =
  20.     if q1.mianownik = 0 || q2.mianownik = 0 then raise DzieleniePrzezZero
  21.         else skroc <| {licznik = q1.licznik * q2.mianownik + q1.mianownik * q2.licznik; mianownik = q1.mianownik * q2.mianownik}
  22. let ( -- ) (q1: ulamek) (q2: ulamek) =
  23.     if q1.mianownik = 0 || q2.mianownik = 0 then raise DzieleniePrzezZero
  24.         else skroc <| {licznik = q1.licznik * q2.mianownik - q1.mianownik * q2.licznik; mianownik = q1.mianownik * q2.mianownik}
  25. let ( ** ) (q1: ulamek) (q2: ulamek) =
  26.     if q1.mianownik = 0 || q2.mianownik = 0 then raise DzieleniePrzezZero
  27.         else skroc <| {licznik = q1.licznik * q2.licznik; mianownik = q1.mianownik * q2.mianownik}
  28. let ( /./ ) (q1: ulamek) (q2: ulamek) =
  29.     if q1.mianownik = 0 || q2.mianownik = 0 then raise DzieleniePrzezZero
  30.         else skroc <| {licznik = q1.licznik; mianownik = q1.mianownik} ** {licznik = q2.mianownik; mianownik = q2.licznik}
  31. let ( == ) (q1: ulamek) (q2: ulamek) =
  32.     match q1.mianownik, q2.mianownik with
  33.     | (0, _) -> raise DzieleniePrzezZero
  34.     | (_, 0) -> raise DzieleniePrzezZero
  35.     | _ -> (q1.licznik * q2.mianownik = q2.licznik * q1.mianownik)
  36.  
  37.  
  38.  
  39.     (*
  40. let skroc (l, m) =
  41.     let znak = if l * m < 0 then -1 else 1
  42.     let al = abs l
  43.     let am = abs m
  44.     let d = NWD(al, am)
  45.     in (znak * (al / d), am / d)
  46.  
  47. let naString (l, m) =
  48.     let znak = if l * m < 0 then "-" else ""
  49.     let al = abs l
  50.     let am = abs m
  51.     let d = NWD(al, am)
  52.     in znak + (System.Convert.ToString(al / d))
  53.             + "/" + (System.Convert.ToString(am / d))
  54.      *)
  55.  
  56.  
  57.  
  58. let naString (q: ulamek) =
  59.     let znak = if q.licznik * q.mianownik < 0 then "-" else ""
  60.     let al = abs q.licznik
  61.     let am = abs q.mianownik
  62.     let d = NWD(al, am)
  63.     in znak + (System.Convert.ToString(al / d))
  64.             + "/" + (System.Convert.ToString(am / d))
  65.  
  66. [<EntryPoint>]
  67. let main argv =
  68.     let q1 = {mianownik = 3; licznik = 4}
  69.     let q2 = {mianownik = 3; licznik = 2}
  70.     printfn "%A" <| q1 ++ q2
  71.     printfn "%A" <| q1 ** q2
  72.     printfn "%A" <| q1 -- q2
  73.     printfn "%A" <| q2 /./ q1
  74.     0 // return an integer exit code
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement