Advertisement
ProgNeo

Untitled

Sep 17th, 2021
241
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.32 KB | None | 0 0
  1. #include <algorithm>
  2. #include <iostream>
  3. #include <list>
  4. #include <sstream>
  5. #include <string>
  6. #include <string>
  7. #include <utility>
  8. using namespace std;
  9.  
  10. using Item = pair<double, double>;
  11. using Poly = list<Item>;
  12.  
  13. Poly* Q = new Poly[0];
  14. Poly* P = new Poly[0];
  15.  
  16. void PrintPolynom(Poly* pol) {
  17. bool firstTime = true;
  18. for (Item& p : *pol) {
  19. if (!firstTime)
  20. cout << " + ";
  21. cout << p.second << "x^" << p.first;
  22. firstTime = false;
  23. }
  24. cout << '\n';
  25. }
  26.  
  27. string GetStringPolynom(Poly *pol)
  28. {
  29. string str = "";
  30. bool firstTime = true;
  31. for (Item& p : *pol) {
  32. if (!firstTime)
  33. cout << " + ";
  34. str += to_string(p.second) + "x^" + to_string(p.first);
  35. firstTime = false;
  36. }
  37. return str;
  38. }
  39.  
  40. void NormPolynom(Poly* pol) {
  41. auto bgn = begin(*pol);
  42. while (bgn != end(*pol)) {
  43. auto p = *bgn;
  44. double pwr = p.first;
  45. double cft = p.second;
  46. auto nxt = bgn; ++nxt;
  47. while (nxt != end(*pol)) {
  48. auto& q = *nxt;
  49. if (q.first != pwr)
  50. ++nxt;
  51. else {
  52. cft += q.second;
  53. nxt = pol->erase(nxt);
  54. }
  55. }
  56. if (cft == p.second)
  57. ++bgn;
  58. else {
  59. p.second = cft;
  60. auto del = bgn;
  61. bgn = pol->insert(bgn, p);
  62. pol->erase(del);
  63. }
  64. }
  65. }
  66.  
  67. Poly* DerivativePolynom(Poly* pol) {
  68. Poly* dpol = new Poly;
  69. for (Item& p : *pol) {
  70. if (p.first != 0) {
  71. Item itm = make_pair(p.first - 1, p.second * p.first);
  72. dpol->emplace_back(itm);
  73. }
  74. }
  75. system("cls");
  76. cout << "Многочлен P: "; PrintPolynom(pol);
  77. cout << "Многочлен Q: "; PrintPolynom(dpol);
  78. Q = dpol;
  79. return dpol;
  80. }
  81.  
  82. Poly* SumPolynom(Poly* pol1) {
  83. Poly* pol2 = DerivativePolynom(pol1);
  84. Poly* pol = new Poly;
  85. for (Item& p1 : *pol1) {
  86. Item itm = make_pair(p1.first, p1.second);
  87. pol->emplace_back(itm);
  88. }
  89. for (Item& p2 : *Q) {
  90. Item itm = make_pair(p2.first, p2.second);
  91. pol->emplace_back(itm);
  92. }
  93. NormPolynom(pol);
  94. cout << "Многочлен R: "; PrintPolynom(pol);
  95. cout << '\n';
  96. return pol;
  97. }
  98.  
  99. void AddMonom(Poly* pol) {
  100. string line, str;
  101. double pwr, cft;
  102. cout << "Введите степень и коэффициент одночлена в виде p k, где p - степень, k - коэффициент:\n";
  103. while (!(cin >> pwr >> cft) || (cin.peek() != '\n')) {
  104. cin.clear();
  105. while (cin.get() != '\n');
  106. cout << "Неверный ввод\n";
  107. }
  108. pol->emplace_back(make_pair(pwr, cft));
  109. system("cls");
  110. cout << "Многочлен P: "; PrintPolynom(pol);
  111. cout << "\n";
  112. }
  113.  
  114. void CalculatePolynom(Poly* pol) {
  115. double x, sum = 0;
  116. cout << "Введите X:\n";
  117. while (!(cin >> x) || (cin.peek() != '\n')) {
  118. cin.clear();
  119. while (cin.get() != '\n');
  120. cout << "Неверный ввод\n";
  121. }
  122. system("cls");
  123. for (Item& p : *pol)
  124. sum += pow(x, p.first) * p.second;
  125. system("cls");
  126. cout << "Многочлен P: "; PrintPolynom(pol);
  127. cout << "Многочлен в точке X = " << x << " равен " << sum << '\n';
  128. cout << '\n';
  129. }
  130.  
  131. void DelMonom(Poly* pol) {
  132. auto bgn = begin(*pol);
  133. int pwr;
  134. cout << "Многочлен P: "; PrintPolynom(pol);
  135. cout << "Введите p - степень одночлена, который необходимо удалить:\n";
  136. while (!(cin >> pwr) || (cin.peek() != '\n')) {
  137. cin.clear();
  138. while (cin.get() != '\n');
  139. cout << "Неверный ввод\n";
  140. }
  141. for (auto it = begin(*pol); it != end(*pol);) {
  142. auto& p = *it;
  143. if (p.first == pwr) {
  144. it = pol->erase(it);
  145. }
  146. else {
  147. ++it;
  148. }
  149. }
  150. system("cls");
  151. cout << "Многочлен P: "; PrintPolynom(pol);
  152. cout << "\n";
  153. }
  154.  
  155. Poly* GetPolynom(istream& in) {
  156. Poly* pol = new Poly;
  157. string line, str;
  158. double pwr, cft;
  159. bool first = true;
  160. getline(in, line, '\n');
  161. istringstream elm1(line);
  162. while (getline(elm1, str, ' ')) {
  163. istringstream elm2(str);
  164. if (first) {
  165. elm2 >> pwr;
  166. first = false;
  167. }
  168. else {
  169. elm2 >> cft;
  170. if (cft != 0)
  171. pol->emplace_back(make_pair(pwr, cft));
  172. }
  173. pwr--;
  174. if (pwr < 0) break;
  175. }
  176. return pol;
  177. }
  178.  
  179. void ComparePolynoms(Poly* pol) {
  180. cout << "Многочлен P: "; PrintPolynom(pol);
  181. cout << "Многочлен Q: "; PrintPolynom(Q);
  182.  
  183. if (GetStringPolynom(pol) == GetStringPolynom(Q))
  184. cout << "Многочлены P и Q равны\n\n";
  185. else
  186. cout << "Многочлены P и Q не равны\n\n";
  187. }
  188.  
  189. int main() {
  190. setlocale(LC_ALL, "rus");
  191. cout << "Введите колличество одночленов многочлена и его коэффициенты в виде\ni a(n) a(n-1) a(n-2) ... a(1) a(0)\nГде i - кол-во одночленов, a - коэффициент n-го одночлена:\n";
  192. P = GetPolynom(cin);
  193. system("cls");
  194. cout << "Многочлен P: "; PrintPolynom(P);
  195. cout << "\n";
  196. while (true) {
  197. int choice;
  198. string line;
  199. cout << "1. Добавить одночлен к многочлену P\n";
  200. cout << "2. Удалить одночлен многочлена P\n";
  201. cout << "3. Построить многочлен Q - производная многочлена P\n";
  202. cout << "4. Построить многочлен R - сумма многочленов P и Q\n";
  203. cout << "5. Расчитать многочлен P в точке x\n";
  204. cout << "6. Привести подобные члены в многочлене P\n";
  205. cout << "7. Сравнить многочлены P и Q\n";
  206. cout << "8. Выход из программы\n";
  207. while (!(cin >> choice) || (cin.peek() != '\n')) {
  208. cin.clear();
  209. while (cin.get() != '\n');
  210. cout << "Неверный ввод\n";
  211. }
  212. switch (choice) {
  213. case 1:
  214. system("cls");
  215. AddMonom(P);
  216. break;
  217. case 2:
  218. system("cls");
  219. DelMonom(P);
  220. break;
  221. case 3:
  222. system("cls");
  223. DerivativePolynom(P);
  224. cout << "\n";
  225. break;
  226. case 4:
  227. system("cls");
  228. SumPolynom(P);
  229. break;
  230. case 5:
  231. system("cls");
  232. CalculatePolynom(P);
  233. break;
  234. case 6:
  235. system("cls");
  236. NormPolynom(P);
  237. cout << "Многочлен P: "; PrintPolynom(P);
  238. cout << "\n";
  239. break;
  240. case 7:
  241. system("cls");
  242. ComparePolynoms(P);
  243. break;
  244. case 8:
  245. return 0;
  246. default:
  247. system("cls");
  248. cout << "Неверное число\n";
  249. break;
  250. }
  251. }
  252. }
  253.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement