Advertisement
AmidamaruZXC

Untitled

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