Advertisement
AmidamaruZXC

Untitled

Oct 29th, 2020
156
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.83 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <iostream>
  3. #include <cmath>
  4. #include <algorithm>
  5.  
  6. using namespace std;
  7.  
  8. /// <summary>
  9. /// Структура узла списка
  10. /// </summary>
  11. struct node {
  12.     int koeff;
  13.     int power;
  14.     struct node* next;
  15. };
  16.  
  17. typedef struct node* list;
  18.  
  19. /// <summary>
  20. /// Функция создания списка
  21. /// </summary>
  22. /// <param name="phead">"голова" списка</param>
  23. void createList(list* phead)
  24. {
  25.     *phead = NULL;
  26. }
  27.  
  28. /// <summary>
  29. /// Функции для проверки существования в списке заданного элемента
  30. /// </summary>
  31. /// <param name="phead">"голова" списка</param>
  32. /// <param name="power">степень элемента</param>
  33. /// <param name="koeff">коэффициент при элементе</param>
  34. /// <returns>True - если элемент есть в спике, иначе False</returns>
  35. bool checkIfExist(list* phead, int power, int koeff)
  36. {
  37.     list p = *phead;
  38.     while (p != NULL)
  39.     {
  40.         if (p->power == power)
  41.         {
  42.             p->koeff += koeff;
  43.             return true;
  44.         }
  45.         p = p->next;
  46.     }
  47.     return false;
  48. }
  49.  
  50. /// <summary>
  51. /// Функция для добавления элемента в список
  52. /// </summary>
  53. /// <param name="phead">"голова" списка</param>
  54. /// <param name="power">степень элемента</param>
  55. /// <param name="koeff">коэффициент при элементе</param>
  56. /// <returns>True - если элемент добавлен, иначе False</returns>
  57. bool addToHead(list* phead, int koeff, int power)
  58. {
  59.     list p;
  60.     if (checkIfExist(phead, power, koeff))
  61.     {
  62.         printf("Такая степень уже есть %d\n", power);
  63.         return false;
  64.     }
  65.     p = (list)malloc(sizeof(*p));
  66.     p->koeff = koeff;
  67.     p->power = power;
  68.     p->next = *phead;
  69.     *phead = p;
  70.     printf("Добавлено: %d*x^%d\n", p->koeff, p->power);
  71.     return true;
  72. }
  73.  
  74. /// <summary>
  75. /// Функция ввода элементов списка с консоли, заполнение списка
  76. /// </summary>
  77. /// <param name="phead">"голова" списка</param>
  78. void enterListElems(list* phead)
  79. {
  80.     cout << "Введите степень многочлена: ";
  81.     int k = 0;
  82.     cin >> k;
  83.     int i_koeff = 1, i_power = 0;
  84.     for (int i = 0; i < k + 1; i++)
  85.     {
  86.         cout << "Введите коэффициент для x^" << i_power << ": ";
  87.         cin >> i_koeff;
  88.         if (i_koeff != 0)
  89.             addToHead(phead, i_koeff, i_power);
  90.         i_power++;
  91.     }
  92. }
  93.  
  94. /// <summary>
  95. /// Функция печати элементов списка на экран
  96. /// </summary>
  97. /// <param name="phead">"голова" списка</param>
  98. void printList(list* phead)
  99. {
  100.     list p;
  101.     cout << "P(x) = ";
  102.     for (p = *phead; p != NULL; p = p->next)
  103.     {
  104.         if (p->next != NULL)
  105.             printf("%d*x^%d + ", p->koeff, p->power);
  106.         else
  107.             printf("%d*x^%d", p->koeff, p->power);
  108.     }
  109.     cout << endl;
  110. }
  111.  
  112. /// <summary>
  113. /// Проверка двух списков на равенство
  114. /// </summary>
  115. /// <param name="phead1">"голова" первого списка</param>
  116. /// <param name="phead2">"голова" второго списк</param>
  117. /// <returns>True - если списки равны, иначе false</returns>
  118. bool checkEquality(list* phead1, list* phead2)
  119. {
  120.     list p1 = *phead1;
  121.     list p2 = *phead2;
  122.     int len1 = 0, len2 = 0;
  123.     for (p1; p1 != NULL; p1 = p1->next)
  124.         len1++;
  125.     for (p2; p2 != NULL; p2 = p2->next)
  126.         len2++;
  127.     if (len1 != len2)
  128.         return false;
  129.     p1 = *phead1;
  130.     p2 = *phead2;
  131.     for (p1, p2; p1 != NULL && p2 != NULL; p1 = p1->next, p2 = p2->next)
  132.         if (p1->koeff != p2->koeff || p1->power != p2->power)
  133.             return false;
  134.     return true;
  135. }
  136.  
  137. /// <summary>
  138. /// Функция вычисления полинома в точке X
  139. /// </summary>
  140. /// <param name="phead">"голова" списка</param>
  141. /// <param name="x">целочисленная точка X</param>
  142. /// <returns>Результат вычислений</returns>
  143. int getResult(list* phead, int x)
  144. {
  145.     list p = *phead;
  146.     int res = 0;
  147.     for (p = *phead; p != NULL; p = p->next)
  148.         res += pow(x, p->power) * p->koeff;
  149.     return res;
  150. }
  151.  
  152. int main(void)
  153. {
  154.     setlocale(LC_ALL, "RUSSIAN");
  155.     list L1, L2;
  156.     int  x;
  157.  
  158.     // Создаем первый список, заполняем его и выводим на экран многочлен
  159.     createList(&L1);
  160.     enterListElems(&L1);
  161.     printList(&L1);
  162.  
  163.     // Считаем первый многочлен в точке X
  164.     cout << endl;
  165.     cout << "Введите целочисленную точку X для вычисления многочлена: ";
  166.     cin >> x;
  167.     cout << "Многочлен в точке " << x << " = " << getResult(&L1, x) << endl;
  168.     cout << endl;
  169.  
  170.     // Создаем второй список, заполняем его и выводим на экран многочлен
  171.     createList(&L2);
  172.     enterListElems(&L2);
  173.     printList(&L2);
  174.  
  175.     // Считаем второй многочлен в точке X
  176.     cout << endl;
  177.     cout << "Введите целочисленную точку X для вычисления многочлена: ";
  178.     cin >> x;
  179.     cout << "Многочлен в точке " << x << " = " << getResult(&L2, x) << endl;
  180.     cout << endl;
  181.  
  182.     // Проверяем 2 списка на равенство
  183.     if (checkEquality(&L1, &L2))
  184.         cout << "Многочлены равны" << endl;
  185.     else
  186.         cout << "Многочлены не равны" << endl;
  187.     return 0;
  188. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement