Advertisement
Guest User

Untitled

a guest
Apr 20th, 2018
55
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.00 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6.  
  7. namespace курсоваямосеев
  8. {
  9. public class Polynomial
  10. {
  11. private List<double> _array;
  12.  
  13. /// <summary>C:\Users\КурицынаЕлизаветаЮрь\Desktop\калькулятор\курсачевский\курсоваямосеев\Polinomial.cs
  14. /// Инициализирует новый полином заданной строкой коэффициентов
  15. /// </summary>
  16. /// <param name="arrayCoefficients">Строка коэффициентов</param>
  17. public Polynomial(IEnumerable<double> arrayCoefficients)
  18. {
  19. _array = new List<double>(arrayCoefficients);
  20. }
  21.  
  22. /// <summary>
  23. /// Инициализирует новый полином по старшей степени при этом все коэффициенты будут равны 0
  24. /// </summary>
  25. /// <param name="headPow">Старшая степень полинома</param>
  26. ///
  27. public Polynomial(int headPow)
  28. {
  29. _array = new List<double>(headPow);
  30.  
  31. for (int i = 0; i < headPow; i++)
  32. _array.Add(0D);
  33. }
  34. public Polynomial(int[] massCoefficient)
  35. {
  36. _array = new List<double>(massCoefficient[0]);
  37. for (int i = 0; i < massCoefficient[0] - 1; i++)
  38. _array.Add(massCoefficient[i]);
  39. }
  40.  
  41. /// <summary>
  42. /// Доступ к коэффициенту полинома по индексу
  43. /// </summary>
  44. /// <param name="i">Номер коффициента в полиноме</param>
  45. /// <returns>Коэффициент с заданным номером</returns>
  46. public double this[int i]
  47. {
  48. get
  49. {
  50. if (i < 0 || i >= _array.Count) throw new IndexOutOfRangeException();
  51. return _array[i];
  52. }
  53.  
  54. set
  55. {
  56. if (i < 0 || i >= _array.Count) throw new IndexOutOfRangeException();
  57. _array[i] = value;
  58. }
  59. }
  60.  
  61. /// <summary>
  62. /// Старшая степень полинома
  63. /// </summary>
  64. public int HeadPow
  65. {
  66. get
  67. {
  68. return _array.Count;
  69. }
  70. }
  71.  
  72. /// <summary>
  73. /// Строка коэффициентов
  74. /// </summary>
  75. public IEnumerable<double> LineCoefficients
  76. {
  77. get
  78. {
  79. return _array;
  80. }
  81. }
  82.  
  83. /// <summary>
  84. /// Выполняет сложение двух полиномов
  85. /// </summary>
  86. /// <param name="poly1">Первый полином</param>
  87. /// <param name="poly2">Второй полином</param>
  88. /// <returns>Результат сложения</returns>
  89. public static Polynomial operator +(Polynomial poly1, Polynomial poly2)
  90. {
  91. Polynomial maxPoly = maxPowPoly(poly1, poly2);
  92. Polynomial minPoly = minPowPoly(poly1, poly2);
  93.  
  94. Polynomial resultPoly = new Polynomial(maxPoly.LineCoefficients);
  95.  
  96. for (int i = 0; i < minPoly.HeadPow; i++)
  97. resultPoly[i] = maxPoly[i] + minPoly[i];
  98.  
  99.  
  100.  
  101.  
  102. return resultPoly;
  103. }
  104.  
  105.  
  106.  
  107. public static Polynomial operator -(Polynomial poly1, Polynomial poly2)
  108. {
  109. Polynomial maxPoly = maxPowPoly(poly1, poly2);
  110. Polynomial minPoly = minPowPoly(poly1, poly2);
  111.  
  112. Polynomial resultPoly = new Polynomial(maxPoly.LineCoefficients);
  113.  
  114. /* for (int i = poly2.HeadPow; i < minPoly.HeadPow; i++)
  115. resultPoly[i] = maxPoly[i] - minPoly[i];*/
  116.  
  117.  
  118.  
  119. if (poly1.HeadPow >= poly2.HeadPow)
  120. {
  121.  
  122. for (int i = 0; i < poly1.HeadPow - poly2.HeadPow; i++)
  123. {
  124. resultPoly[i] = Matrix[i];
  125. }
  126. for (int k = n - n2; k < n; k++)
  127. {
  128. Result[k] = Matrix[k] - Matrix2[k - n + n2];
  129. }
  130.  
  131.  
  132.  
  133.  
  134. return resultPoly;
  135. }
  136.  
  137. /// <summary>
  138. /// Умножает полином на константу
  139. /// </summary>
  140. /// <param name="poly1">Полином</param>
  141. /// <param name="k">Константа</param>
  142. /// <returns>Полином умноженный на константу</returns>
  143. public static Polynomial operator *(Polynomial poly1, double k)
  144. {
  145. Polynomial resultPoly = new Polynomial(poly1.LineCoefficients);
  146.  
  147. for (int i = 0; i < poly1.HeadPow; i++) resultPoly[i] *= k;
  148.  
  149. return resultPoly;
  150. }
  151.  
  152. /// <summary>
  153. /// Перемножает между собой два полинома
  154. /// </summary>
  155. /// <param name="poly1">Первый полином</param>
  156. /// <param name="poly2">Второй полином</param>
  157. /// <returns>Результат перемножения двух полиномов</returns>
  158. public static Polynomial operator *(Polynomial poly1, Polynomial poly2)
  159. {
  160. Polynomial resultPoly = new Polynomial(poly1.HeadPow + poly2.HeadPow - 1);
  161. resultPoly._array.Select(x => 0);
  162.  
  163. for (int i = 0; i < poly1.HeadPow; i++)
  164. for (int j = 0; j < poly2.HeadPow; j++)
  165. resultPoly[i + j] += poly1[i] * poly2[j];
  166.  
  167. return resultPoly;
  168. }
  169.  
  170. /// <summary>
  171. /// Вычисляет производную от полинома
  172. /// </summary>
  173. /// <returns>Произвдная</returns>
  174. public Polynomial Derivative()
  175. {
  176. Polynomial result = new Polynomial(this.LineCoefficients);
  177.  
  178. for (int i = 0; i < this.HeadPow - 1; i++)
  179. result[i] = result[i + 1] * (i + 1);
  180.  
  181. result._array.RemoveAt(result.HeadPow - 1);
  182.  
  183. if (result._array.Count == 0) result._array.Add(0);
  184.  
  185. return result;
  186. }
  187.  
  188. /// <summary>
  189. /// Преобразует полином в строку
  190. /// </summary>
  191. /// <returns>Текстовой представление полинома</returns>
  192. ///
  193.  
  194.  
  195.  
  196. /*public double Derive(Polynomial poly1, Polynomial poly2, double[] quotient, double[] devider)
  197. {
  198. double res = this[0];
  199. Polynomial resultPoly = new Polynomial(poly1.HeadPow + poly2.HeadPow - 1);
  200. resultPoly._array.Select(x => 0);
  201.  
  202. for (int i = 0; i < poly1.HeadPow; i++)
  203. for (int j = 0; j < poly2.HeadPow; j++)
  204. resultPoly[i + j] += poly1[i] * poly2[j];
  205.  
  206. return res;
  207. }*/
  208.  
  209.  
  210.  
  211.  
  212.  
  213. public override string ToString()
  214. {
  215. StringBuilder sb = new StringBuilder();
  216.  
  217. for (int i = 0; i < this.HeadPow; i++)
  218. {
  219. if (this[i] == 0 && i != 0) continue;
  220. if (i == 0)
  221. {
  222. sb.Append(this[i] + " ");
  223. continue;
  224. }
  225. if (this[i] > 0) sb.Append('+');
  226. if (i == 1)
  227. {
  228. sb.Append(this[i] + "*x ");
  229. continue;
  230. }
  231.  
  232. sb.Append(this[i] + "*x^" + i + ' ');
  233. }
  234.  
  235. return sb.ToString();
  236. }
  237.  
  238. /// <summary>
  239. /// Решает полином подставляя x
  240. /// </summary>
  241. /// <param name="x">Значения x</param>
  242. /// <returns>Полученный ответ</returns>
  243. public double GetSolution(double x)
  244. {
  245. double res = this[0];
  246.  
  247. for (int i = 1; i < this.HeadPow; i++)
  248. res += this[i] * Math.Pow(x, i);
  249.  
  250. return res;
  251. }
  252.  
  253. private static Func<Polynomial, Polynomial, Polynomial> maxPowPoly = (x, y) =>
  254. Math.Max(x.HeadPow, y.HeadPow) == x.HeadPow ? x : y;
  255.  
  256. private static Func<Polynomial, Polynomial, Polynomial> minPowPoly = (x, y) =>
  257. maxPowPoly(x, y).Equals(x) ? y : x;
  258. public static string Vivod(Polynomial A)
  259. {
  260. int j = 0;
  261. string buf = "";
  262. for (int i = 0; i < A.HeadPow - 1; i++)
  263. {
  264. buf = buf + Convert.ToString(A._array[i]) + "x" + "^" + Convert.ToString(A.HeadPow - i - 1) + "+";
  265. j = i;
  266. }
  267. buf = buf + Convert.ToString(A._array[j + 1]) + "x" + "^" + Convert.ToString(A.HeadPow - j - 2);
  268. return buf;
  269. }
  270. }
  271.  
  272. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement