Advertisement
elektryk798

Semantyka2v1

Mar 21st, 2020
2,835
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
F# 4.54 KB | None | 0 0
  1. // Learn more about F# at http://fsharp.org
  2.  
  3. open System
  4. exception DzieleniePrzezZero of string
  5.  
  6. let ( ++ ) (a, b) (c, d) = if b=0 then raise (DzieleniePrzezZero("Dzielenie przez zero")) else if d=0 then raise (DzieleniePrzezZero("Dzielenie przez zero")) else (a*d + b*c, b*d)    
  7. let ( -- ) (a, b) (c, d) = if b=0 then raise (DzieleniePrzezZero("Dzielenie przez zero")) else if d=0 then raise (DzieleniePrzezZero("Dzielenie przez zero")) else (a*d - b*c, b*d)
  8. let ( ** ) (a, b) (c, d) = if b=0 then raise (DzieleniePrzezZero("Dzielenie przez zero")) else if d=0 then raise (DzieleniePrzezZero("Dzielenie przez zero")) else (a*c, b*d)
  9. let ( /./ ) (a, b) (c, d) = if b=0 then raise (DzieleniePrzezZero("Dzielenie przez zero")) else if d=0 then raise (DzieleniePrzezZero("Dzielenie przez zero")) else (a,b) ** (d,c)
  10. let ( == ) (a, b) (c, d) = if b=0 then raise (DzieleniePrzezZero("Dzielenie przez zero")) else if d=0 then raise (DzieleniePrzezZero("Dzielenie przez zero")) else (a*d = b*c)
  11.  
  12. let rec NWD = function
  13.     | (0, n) -> n
  14.     | (m, n) -> NWD(n % m, m)
  15.    
  16. let skroc (l,m) =
  17.     if m = 0 then raise (DzieleniePrzezZero("Dzielenie prez zero"))
  18.     else
  19.         let znak = if l*m<0 then -1 else 1
  20.         let al = abs l
  21.         let am = abs m
  22.         let d = NWD(al,am)
  23.         in (znak * (al / d), am / d)
  24.    
  25. let naString (l, m) =
  26.     if m = 0 then raise (DzieleniePrzezZero("Dzielenie prez zero"))
  27.     else
  28.         let znak = if l*m<0 then "-" else "" (* deklaracje wewnetrzne *)
  29.         let al = abs l (* wart.bezw. = liczba nat. *)
  30.         let am = abs m
  31.         let d = NWD(al, am)
  32.         in znak + (System.Convert.ToString(al / d))
  33.         + "/" + (System.Convert.ToString(am / d))
  34.  
  35. let q1 = (-2, 3)
  36. let q2 = (5, -10)
  37. let q3 = q1 ++ q2
  38. let q4 = q2 **q3
  39. let q5 = q4 /./ q3
  40.  
  41. type ulamek (licznik : int, mianownik : int) =
  42.     member this.licznik = licznik
  43.     member this.mianownik = mianownik
  44.    
  45.     static member skrocUlam(u:ulamek) =
  46.         if u.mianownik = 0 then raise (DzieleniePrzezZero("Dzielenie prez zero"))
  47.         else
  48.             let znak = if u.licznik*u.mianownik<0 then -1 else 1
  49.             let al = abs u.licznik
  50.             let am = abs u.mianownik
  51.             let d = NWD(al,am)
  52.             in (znak * (al / d), am / d)
  53.            
  54.     static member naString (l, m) =
  55.         if m = 0 then raise (DzieleniePrzezZero("Dzielenie prez zero"))
  56.         else
  57.             let znak = if l*m<0 then "-" else "" (* deklaracje wewnetrzne *)
  58.             let al = abs l (* wart.bezw. = liczba nat. *)
  59.             let am = abs m
  60.             let d = NWD(al, am)
  61.             let calosci = al/am
  62.             let licznik = al-calosci*am
  63.             in
  64.             if licznik = 0 then  
  65.                  znak + (System.Convert.ToString(calosci))
  66.             else
  67.                  znak + (System.Convert.ToString(calosci)) + " " + (System.Convert.ToString(licznik)) + "/" +
  68.                  (System.Convert.ToString(am / d))
  69.    
  70.     static member (+) (a:ulamek, b:ulamek) =
  71.         if a.mianownik=0 then raise (DzieleniePrzezZero("Dzielenie przez zero"))
  72.         else if b.mianownik=0 then raise (DzieleniePrzezZero("Dzielenie przez zero"))
  73.         else
  74.         ulamek.naString(ulamek.skrocUlam(ulamek(a.licznik * b.mianownik + a.mianownik * b.licznik, a.mianownik * b.mianownik)))
  75.     static member (-) (a:ulamek, b:ulamek) =
  76.         if a.mianownik=0 then raise (DzieleniePrzezZero("Dzielenie przez zero"))
  77.         else if b.mianownik=0 then raise (DzieleniePrzezZero("Dzielenie przez zero"))
  78.         else
  79.         ulamek.skrocUlam(ulamek(a.licznik * b.mianownik - a.mianownik * b.licznik, a.mianownik * b.mianownik))
  80.     static member (*) (a:ulamek, b:ulamek) =
  81.         if a.mianownik=0 then raise (DzieleniePrzezZero("Dzielenie przez zero"))
  82.         else if b.mianownik=0 then raise (DzieleniePrzezZero("Dzielenie przez zero"))
  83.         else
  84.         ulamek.skrocUlam(ulamek(a.licznik * b.licznik, a.mianownik * b.mianownik))
  85.     static member (/) (a:ulamek, b:ulamek) =
  86.         if a.mianownik=0 then raise (DzieleniePrzezZero("Dzielenie przez zero"))
  87.         else if b.mianownik=0 then raise (DzieleniePrzezZero("Dzielenie przez zero"))
  88.         else
  89.         ulamek.naString(ulamek.skrocUlam(ulamek(a.licznik * b.mianownik, a.mianownik * b.licznik)))
  90.     override this.ToString() =
  91.         this.licznik.ToString() + "/" + this.mianownik.ToString()
  92. let u1 = ulamek(2, 1)
  93. let u2 = ulamek(7, 4)
  94.  
  95. [<EntryPoint>]
  96. let main argv =
  97.     printfn "Hello World from F#!"
  98.     printf "%A" <| (u1+u2)
  99.      
  100.     0 // return an integer exit code
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement