Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- Многочлен P(x)=anxn + an-1xn-1 +...+ a1x + a0 с целыми коэффициентами можно представить в виде списка,
- причем если ai=0, то соответствующее звено не включать в список. Определить процедуру, которая строит
- многочлен p – произведение многочленов q и r.
- */
- #include <iostream>
- #include <cmath>
- #include <cstdlib>
- #include <ctime>
- using namespace std;
- class Element
- {
- public:
- unsigned int num;
- double a;
- Element *nextElement;
- Element()
- {
- a = 0;
- num = 0;
- nextElement = NULL;
- }
- Element(int newNum,double newA)
- {
- a = newA;
- num = newNum;
- nextElement = NULL;
- }
- Element(const Element* copyElement)
- {
- a = copyElement->a;
- num = copyElement->num;
- nextElement = copyElement->nextElement;
- }
- };
- class PolinomList
- {
- Element *firstElement;
- Element *lastElement;
- unsigned int size;
- unsigned int degree;
- public:
- PolinomList();
- PolinomList(Element *firstElement);
- ~PolinomList();
- bool isBlank();
- void addElement(Element *newElement);
- void addElement(int newNum,double newA);
- double calculatePolinom(double x);
- void printElements();
- double getKoeffitientByNum(int reqNum);
- PolinomList operator*(PolinomList second);
- };
- PolinomList::PolinomList()
- {
- firstElement = lastElement = NULL;
- size = 0;
- degree = 0;
- }
- PolinomList::PolinomList(Element *newfirstElement)
- {
- firstElement = lastElement = new Element(newfirstElement);
- size = 1;
- degree = firstElement->num;
- }
- PolinomList::~PolinomList()
- {
- Element *currentElement = firstElement;
- Element *tempElement;
- while (currentElement != lastElement && currentElement != NULL)
- {
- tempElement = currentElement;
- currentElement = currentElement->nextElement;
- delete tempElement;
- }
- delete currentElement;
- }
- bool PolinomList::isBlank()
- {
- return (size)? true : false;
- }
- void PolinomList::addElement(Element *newElement)
- {
- addElement(newElement->num,newElement->a);
- }
- void PolinomList::addElement(int newNum,double newA)
- {
- Element *newElement = new Element(newNum,newA);
- if (firstElement == NULL)
- {
- firstElement = lastElement = newElement;
- }
- else
- {
- lastElement->nextElement = newElement;
- lastElement = newElement;
- }
- size++;
- if (lastElement->num > degree) degree = lastElement->num;
- }
- double PolinomList::calculatePolinom(double x)
- {
- Element *currentElement = firstElement;
- double result = 0;
- if (currentElement == NULL)
- return 0;
- do
- {
- result += pow(x,(double)currentElement->num)*currentElement->a;
- currentElement = currentElement->nextElement;
- }
- while (currentElement!=lastElement);
- return result;
- }
- void PolinomList::printElements()
- {
- Element *currentElement = firstElement;
- if (currentElement == NULL)
- {
- cout <<"Попытка напечатать пустой список\n";
- return;
- }
- do
- {
- if (currentElement->a != 0)
- cout <<"("<<currentElement->num<<","<<currentElement->a<<") ";
- currentElement = currentElement->nextElement;
- }
- while (currentElement!=lastElement);
- cout <<endl;
- }
- double PolinomList::getKoeffitientByNum(int reqNum)
- {
- Element *currentElement = firstElement;
- do
- {
- if (currentElement == NULL) return 0;
- if (currentElement->num == reqNum)
- return currentElement->a;
- currentElement = currentElement->nextElement;
- }
- while (currentElement != lastElement);
- return 0;
- }
- PolinomList PolinomList::operator*(PolinomList second)
- {
- unsigned int newDegree = this->degree+second.degree;
- double *newKoeffitients = new double[newDegree];
- PolinomList resultPolinom;
- for (unsigned int i = 0;i<newDegree;i++)
- newKoeffitients[i] = 0;
- for (unsigned int i = 0;i<this->degree;i++)
- for (unsigned int j = 0;j<second.degree;j++)
- newKoeffitients[i+j] += this->getKoeffitientByNum(i) * second.getKoeffitientByNum(j);
- for (unsigned int i = 0;i<newDegree;i++)
- {
- if (newKoeffitients[i] != 0)
- resultPolinom.addElement(i,newKoeffitients[i]);
- }
- return resultPolinom;
- }
- int main()
- {
- srand(time(NULL));
- PolinomList q,r,p;
- for (int i = 0;i<7;i++)
- {
- double a;
- a = (rand()%5 <2)? 0 : rand()%20;
- q.addElement(i,a);
- a = (rand()%5 <2)? 0 : rand()%20;
- r.addElement(i,a);
- }
- cout <<"Q: "; q.printElements();
- cout <<"R: "; r.printElements();
- p = q*r;
- cout <<"Q*R: "; p.printElements();
- //system("pause");
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement