Advertisement
ProgNeo

Untitled

Oct 23rd, 2021
229
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.31 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. bool firstTime;
  148. firstTime = true;
  149. for (Item& p : *pol) {
  150. if (!firstTime)
  151. cout << " + ";
  152. cout << p.second << "x^" << p.first;
  153. firstTime = false;
  154. }
  155.  
  156. char sign;
  157. if (sum1 > sum2) sign = '>';
  158. else if (sum1 < sum2) sign = '<';
  159. else sign = '=';
  160.  
  161. cout << " " << sign << " ";
  162.  
  163. firstTime = true;
  164. for (Item& p : *dpol) {
  165. if (!firstTime)
  166. cout << " + ";
  167. cout << p.second << "x^" << p.first;
  168. firstTime = false;
  169. }
  170.  
  171. cout << endl << endl;
  172. }
  173.  
  174. Poly* GetPolynom(istream& in) {
  175. Poly* pol = new Poly;
  176. string line, str;
  177. double pwr, cft;
  178. bool first = true;
  179. getline(in, line, '\n');
  180. istringstream elm1(line);
  181. while (getline(elm1, str, ' ')) {
  182. istringstream elm2(str);
  183. if (first) {
  184. elm2 >> pwr;
  185. first = false;
  186. }
  187. else {
  188. elm2 >> cft;
  189. if (cft != 0)
  190. pol->emplace_back(make_pair(pwr, cft));
  191. }
  192. pwr--;
  193. if (pwr < 0) break;
  194. }
  195. return pol;
  196. }
  197.  
  198. int main() {
  199. setlocale(LC_ALL, "rus");
  200. cout << "Введите колличество одночленов многочлена и его коэффициенты в виде\ni a(n) a(n-1) a(n-2) ... a(1) a(0)\nГде i - кол-во одночленов, a - коэффициент n-го одночлена:\n";
  201. Poly* P = GetPolynom(cin);
  202. system("cls");
  203. while (true) {
  204. int choice;
  205. string line;
  206. cout << "Многочлен P: "; PrintPolynom(P);
  207. cout << "\n";
  208. cout << "1. Добавить одночлен к многочлену P\n";
  209. cout << "2. Удалить одночлен многочлена P\n";
  210. cout << "3. Построить многочлен Q - производная многочлена P\n";
  211. cout << "4. Построить многочлен R - сумма многочленов P и Q\n";
  212. cout << "5. Расчитать многочлен P в точке x\n";
  213. cout << "6. Сравнить многочлены P и Q(производная многочлена P)\n";
  214. cout << "7. Привести подобные члены в многочлене P\n";
  215. cout << "8. Выход из программы\n";
  216. while (!(cin >> choice) || (cin.peek() != '\n')) {
  217. cin.clear();
  218. while (cin.get() != '\n');
  219. cout << "Неверный ввод\n";
  220. }
  221. switch (choice) {
  222. case 1:
  223. system("cls");
  224. AddMonom(P);
  225. system("cls");
  226. break;
  227. case 2:
  228. system("cls");
  229. DelMonom(P);
  230. system("cls");
  231. break;
  232. case 3:
  233. system("cls");
  234. DerivativePolynom(P);
  235. break;
  236. case 4:
  237. system("cls");
  238. SumPolynom(P);
  239. break;
  240. case 5:
  241. system("cls");
  242. CalculatePolynom(P);
  243. break;
  244. case 6:
  245. system("cls");
  246. ComparePolynoms(P);
  247. break;
  248. case 7:
  249. system("cls");
  250. NormPolynom(P);
  251. break;
  252. case 8:
  253. return 0;
  254. default:
  255. system("cls");
  256. cout << "Неверное число\n";
  257. break;
  258. }
  259. }
  260. }
  261.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement