Advertisement
Guest User

Namolem

a guest
Sep 15th, 2010
195
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.47 KB | None | 0 0
  1. /*
  2.     Многочлен P(x)=anxn + an-1xn-1 +...+ a1x + a0 с целыми коэффициентами можно представить в виде списка,
  3.     причем если ai=0, то соответствующее звено не включать в список. Определить процедуру, которая строит
  4.     многочлен p – произведение многочленов q и r.
  5. */
  6. #include <iostream>
  7. #include <cmath>
  8. #include <cstdlib>
  9. #include <ctime>
  10. using namespace std;
  11.  
  12. class Element
  13. {
  14. public:
  15.     unsigned int num;
  16.     double a;
  17.     Element *nextElement;
  18.    
  19.     Element()
  20.     {
  21.         a = 0;
  22.         num = 0;
  23.         nextElement = NULL;
  24.     }
  25.     Element(int newNum,double newA)
  26.     {
  27.         a = newA;
  28.         num = newNum;
  29.         nextElement = NULL;
  30.     }
  31.     Element(const Element* copyElement)
  32.     {
  33.         a = copyElement->a;
  34.         num = copyElement->num;
  35.         nextElement = copyElement->nextElement;
  36.     }
  37. };
  38.  
  39. class PolinomList
  40. {
  41.     Element *firstElement;
  42.     Element *lastElement;
  43.     unsigned int size;
  44.     unsigned int degree;
  45.  
  46. public:
  47.     PolinomList();
  48.     PolinomList(Element *firstElement);
  49.     ~PolinomList();
  50.  
  51.     bool isBlank();
  52.     void addElement(Element *newElement);
  53.     void addElement(int newNum,double newA);
  54.  
  55.     double calculatePolinom(double x);
  56.     void printElements();
  57.     double getKoeffitientByNum(int reqNum);
  58.     PolinomList operator*(PolinomList second);
  59.  
  60. };
  61.  
  62.  
  63. PolinomList::PolinomList()
  64. {
  65.     firstElement = lastElement = NULL;
  66.     size = 0;
  67.     degree = 0;
  68. }
  69. PolinomList::PolinomList(Element *newfirstElement)
  70. {
  71.     firstElement = lastElement = new Element(newfirstElement);
  72.     size = 1;
  73.     degree = firstElement->num;
  74. }
  75. PolinomList::~PolinomList()
  76. {
  77.     Element *currentElement = firstElement;
  78.     Element *tempElement;
  79.     while (currentElement != lastElement && currentElement != NULL)
  80.     {
  81.         tempElement = currentElement;
  82.         currentElement = currentElement->nextElement;
  83.         delete tempElement;
  84.     }
  85.     delete currentElement;
  86. }
  87. bool PolinomList::isBlank()
  88. {
  89.     return (size)?  true : false;
  90. }
  91. void PolinomList::addElement(Element *newElement)
  92. {
  93.     addElement(newElement->num,newElement->a);
  94. }
  95. void PolinomList::addElement(int newNum,double newA)
  96. {
  97.     Element *newElement = new Element(newNum,newA);
  98.     if (firstElement == NULL)
  99.     {
  100.         firstElement = lastElement = newElement;
  101.     }
  102.     else
  103.     {
  104.         lastElement->nextElement = newElement;
  105.         lastElement = newElement;
  106.     }
  107.     size++;
  108.     if (lastElement->num > degree) degree = lastElement->num;
  109. }
  110. double PolinomList::calculatePolinom(double x)
  111. {
  112.     Element *currentElement = firstElement;
  113.     double result = 0;
  114.     if (currentElement == NULL)
  115.         return 0;
  116.     do
  117.     {
  118.         result += pow(x,(double)currentElement->num)*currentElement->a;
  119.         currentElement = currentElement->nextElement;
  120.     }
  121.     while (currentElement!=lastElement);
  122.  
  123.     return result;
  124. }
  125. void PolinomList::printElements()
  126. {
  127.     Element *currentElement = firstElement;
  128.     if (currentElement == NULL)
  129.     {
  130.         cout <<"Попытка напечатать пустой список\n";
  131.         return;
  132.     }
  133.  
  134.     do
  135.     {
  136.         if (currentElement->a != 0)
  137.             cout <<"("<<currentElement->num<<","<<currentElement->a<<") ";
  138.         currentElement = currentElement->nextElement;
  139.     }
  140.     while (currentElement!=lastElement);
  141.     cout <<endl;
  142. }
  143. double PolinomList::getKoeffitientByNum(int reqNum)
  144. {
  145.     Element *currentElement = firstElement;
  146.    
  147.     do
  148.     {
  149.         if (currentElement == NULL) return 0;
  150.         if (currentElement->num == reqNum)
  151.             return currentElement->a;
  152.         currentElement = currentElement->nextElement;
  153.     }
  154.     while (currentElement != lastElement);
  155.     return 0;
  156. }
  157. PolinomList PolinomList::operator*(PolinomList second)
  158. {
  159.     unsigned int newDegree = this->degree+second.degree;
  160.     double *newKoeffitients = new double[newDegree];
  161.     PolinomList resultPolinom;
  162.  
  163.     for (unsigned int i = 0;i<newDegree;i++)
  164.         newKoeffitients[i] = 0;
  165.     for (unsigned int i = 0;i<this->degree;i++)
  166.         for (unsigned int j = 0;j<second.degree;j++)
  167.             newKoeffitients[i+j] += this->getKoeffitientByNum(i) * second.getKoeffitientByNum(j);
  168.     for (unsigned int i = 0;i<newDegree;i++)
  169.     {
  170.         if (newKoeffitients[i] != 0)
  171.             resultPolinom.addElement(i,newKoeffitients[i]);
  172.     }
  173.     return resultPolinom;
  174. }
  175.  
  176.  
  177. int main()
  178. {
  179.     srand(time(NULL));
  180.     PolinomList q,r,p;
  181.     for (int i = 0;i<7;i++)
  182.     {
  183.         double a;
  184.         a = (rand()%5 <2)?  0 : rand()%20;
  185.         q.addElement(i,a);
  186.  
  187.         a = (rand()%5 <2)?  0 : rand()%20;
  188.         r.addElement(i,a);
  189.  
  190.     }
  191.     cout <<"Q: "; q.printElements();
  192.     cout <<"R: "; r.printElements();
  193.  
  194.     p = q*r;
  195.     cout <<"Q*R: "; p.printElements();
  196.     //system("pause");
  197.    
  198.     return 0;
  199. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement