Advertisement
Guest User

Untitled

a guest
Mar 8th, 2017
104
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
F# 3.48 KB | None | 0 0
  1. // Лабораторная работа №1
  2. // Решение биквадратного уравнения
  3.  
  4. //Для использования классов Math и Console
  5. open System
  6.  
  7. // Алгебраический тип или "Discriminated Unions"
  8. // Алгебраический тип - тип сумма из типов произведений
  9. // | - означает "или" и задает тип-сумму
  10. // * - означает "и" и задает произведение (кортеж, который соединяет все элементы)
  11. // В абстрактных алгебрах наиболее близкой алгеброй является полукольцо
  12.  
  13. ///Тип решения биквадратного уравнения
  14. type BiSquareRootResult =
  15.     | NoRoots
  16.     | TwoRoots of double * double
  17.     | FourRoots of double * double * double * double
  18.  
  19. ///Функция вычисления корней уравнения
  20. let CalculateRoots(a:double, b:double, c:double):BiSquareRootResult =
  21.     let D1 = b*b - 4.0*a*c;
  22.     if D1 < 0.0 then NoRoots
  23.     else if D1 = 0.0 then
  24.         let D2 = -b / (2.0 * a)
  25.         if D2 < 0.0 then NoRoots
  26.         else
  27.             let rt1 = -Math.Sqrt(D2);
  28.             let rt2 = -Math.Sqrt(D2);
  29.             TwoRoots(rt1, rt2)
  30.     else
  31.         let sqrtD1 = Math.Sqrt(D1)
  32.         let D2 = (-b - sqrtD1) / (2.0 * a);
  33.         let D3 = (-b + sqrtD1) / (2.0 * a);
  34.        
  35.         if (D2 < 0.0) && (D3 < 0.0) then NoRoots
  36.         else if (D2 < 0.0) && (D3 >= 0.0) then
  37.             let rt1 = -Math.Sqrt(D3);
  38.             let rt2 = Math.Sqrt(D3);
  39.             TwoRoots(rt1, rt2)
  40.         else if (D2 >= 0.0) && (D3 < 0.0) then
  41.             let rt1 = -Math.Sqrt(D2);
  42.             let rt2 = Math.Sqrt(D2);
  43.             TwoRoots(rt1, rt2)
  44.         else
  45.             let rt1 = -Math.Sqrt(D2);
  46.             let rt2 = Math.Sqrt(D2);
  47.             let rt3 = -Math.Sqrt(D3);
  48.             let rt4 = Math.Sqrt(D3);
  49.             FourRoots (rt1, rt2, rt3, rt4)
  50.  
  51. ///Вывод корней (тип unit - аналог void)
  52. let PrintRoots(a:double, b:double, c:double):unit =
  53.     printf "Коэффициенты: a=%A, b=%A, c=%A. " a b c
  54.     let root = CalculateRoots(a,b,c)
  55.     //Оператор сопоставления с образцом
  56.     let textResult =
  57.         match root with
  58.         | NoRoots -> "Корней нет"
  59.         | TwoRoots(rt1, rt2) -> "Два корня: " + rt1.ToString() + " и " + rt2.ToString()
  60.         | FourRoots (rt1, rt2, rt3, rt4) -> "Четыре корня: " + rt1.ToString() + ", и " + rt2.ToString() + ", и " + rt3.ToString() + ", и " + rt4.ToString()
  61.     printfn "%s" textResult
  62.  
  63. [<EntryPoint>]
  64. let main argv =
  65.     printfn "Лабораторная работа №1. Решение биквадратного уравнения."
  66.  
  67.     //Тестовые данные
  68.     //4 корня
  69.     let a1 = 4.0;
  70.     let b1 = -5.0;
  71.     let c1 = 1.0;
  72.     //2 корень
  73.     let a2 = 1.0;
  74.     let b2 = 0.0;
  75.     let c2 = -4.0;
  76.     //нет корней
  77.     let a3 = 1.0;
  78.     let b3 = 0.0;
  79.     let c3 = 1.0;
  80.  
  81.     PrintRoots(a1,b1,c1)
  82.     PrintRoots(a2,b2,c2)
  83.     PrintRoots(a3,b3,c3)
  84.    
  85.     //|> ignore - перенаправление потока с игнорирование результата вычисления
  86.     Console.ReadLine() |> ignore
  87.     0 // возвращение целочисленного кода выхода
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement