Advertisement
ProgNeo

Untitled

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