Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*CScherbakovNide.h*/
- #include "cScherbakovMonom.h"
- using std::bad_alloc;
- class cScherbakovNode
- {
- cScherbakovMonom* cScherbakovMonomPointer;
- cScherbakovNode* next;
- public:
- cScherbakovNode(char* str);
- cScherbakovNode(int c = 0, unsigned d = 0);
- cScherbakovNode(const cScherbakovMonom& m);
- cScherbakovNode(const cScherbakovNode& n);
- cScherbakovNode& operator=(const cScherbakovNode& n);
- void setCoeff(int c = 0) { cScherbakovMonomPointer->setCoeff(c); }
- void setDegree(unsigned d = 0){ cScherbakovMonomPointer->setDegree(d); }
- int getCoeff() const { return cScherbakovMonomPointer->getCoeff(); }
- unsigned getDegree() const { return cScherbakovMonomPointer->getDegree(); }
- bool getSign() const { return cScherbakovMonomPointer->getSign(); }
- cScherbakovMonom* getcScherbakovMonomPointer() const { return cScherbakovMonomPointer; }
- void setNext(cScherbakovNode* cScherbakovNodePtr) { next = cScherbakovNodePtr; }
- cScherbakovNode* getNext() const { return next; }
- cScherbakovNode operator-() const;
- cScherbakovNode operator+(const cScherbakovNode& sum) const;
- cScherbakovNode operator-(const cScherbakovNode& sub) const;
- cScherbakovNode operator*(const cScherbakovNode& mul) const;
- cScherbakovNode operator/(const cScherbakovNode& div) const;
- cScherbakovNode operator%(const cScherbakovNode& mod) const;
- friend ostream& operator<<(ostream& stream, const cScherbakovNode& n);
- ~cScherbakovNode();
- };
- /*CScherbakovNode.cpp*/
- #include "cScherbakovNode.h"
- cScherbakovNode::cScherbakovNode(char* str) : next(nullptr)
- {
- try
- {
- cScherbakovMonomPointer = new cScherbakovMonom(str);
- }
- catch (const bad_alloc& exc) { std::cout << exc.what(); }
- }
- cScherbakovNode::cScherbakovNode(int c, unsigned d) : next(nullptr)
- {
- try
- {
- cScherbakovMonomPointer = new cScherbakovMonom(c, d);
- }
- catch (const bad_alloc& exc) { std::cout << exc.what(); }
- }
- cScherbakovNode::cScherbakovNode(const cScherbakovMonom& m) : next(nullptr)
- {
- try
- {
- cScherbakovMonomPointer = new cScherbakovMonom(m);
- }
- catch (const bad_alloc& exc) { std::cout << exc.what(); }
- }
- cScherbakovNode::cScherbakovNode(const cScherbakovNode& n) : next(nullptr)
- {
- try
- {
- cScherbakovMonomPointer = new cScherbakovMonom(*n.getcScherbakovMonomPointer());
- }
- catch (const bad_alloc& exc) { std::cout << exc.what(); }
- }
- cScherbakovNode& cScherbakovNode::operator=(const cScherbakovNode& n)
- {
- setCoeff(n.getCoeff());
- setDegree(n.getDegree());
- return *this;
- }
- cScherbakovNode cScherbakovNode::operator-() const
- {
- return cScherbakovNode(-*cScherbakovMonomPointer);
- }
- cScherbakovNode cScherbakovNode::operator+(const cScherbakovNode& sum) const
- {
- return cScherbakovNode(*cScherbakovMonomPointer + *sum.getcScherbakovMonomPointer());
- }
- cScherbakovNode cScherbakovNode::operator-(const cScherbakovNode& sub) const
- {
- return cScherbakovNode(*cScherbakovMonomPointer - *sub.getcScherbakovMonomPointer());
- }
- cScherbakovNode cScherbakovNode::operator*(const cScherbakovNode& mul) const
- {
- return cScherbakovNode(*cScherbakovMonomPointer * *mul.getcScherbakovMonomPointer());
- }
- cScherbakovNode cScherbakovNode::operator/(const cScherbakovNode& div) const
- {
- return cScherbakovNode(*cScherbakovMonomPointer / *div.getcScherbakovMonomPointer());
- }
- cScherbakovNode cScherbakovNode::operator%(const cScherbakovNode& mod) const
- {
- return cScherbakovNode(*cScherbakovMonomPointer % *mod.getcScherbakovMonomPointer());
- }
- ostream& operator<<(ostream& stream, const cScherbakovNode& n)
- {
- return stream << *n.getcScherbakovMonomPointer();
- }
- cScherbakovNode::~cScherbakovNode()
- {
- delete cScherbakovMonomPointer;
- }
- /*CScherbakovMonom.h*/
- #include "exceptions.h"
- // '+' = true
- // '-' = false
- int fromStringToInt(char*);
- class cScherbakovMonom
- {
- int iScherbakovCoeff;
- unsigned uScherbakovDegree;
- public:
- cScherbakovMonom(int c = 0, unsigned d = 0) : iScherbakovCoeff(c), uScherbakovDegree(c ? d : 0) { }
- cScherbakovMonom(char* str);
- void setCoeff(int c = 0) { iScherbakovCoeff = c; }
- void setDegree(unsigned d = 0) { uScherbakovDegree = d; }
- int getCoeff() const { return iScherbakovCoeff; }
- unsigned getDegree() const { return uScherbakovDegree; }
- bool getSign() const { return iScherbakovCoeff >= 0; }
- cScherbakovMonom operator-() const;
- cScherbakovMonom operator+(const cScherbakovMonom& sum) const;
- cScherbakovMonom operator-(const cScherbakovMonom& sub) const;
- cScherbakovMonom operator*(const cScherbakovMonom& mul) const;
- cScherbakovMonom operator/(const cScherbakovMonom& div) const;
- cScherbakovMonom operator%(const cScherbakovMonom& mod) const;
- friend ostream& operator<<(ostream& stream, const cScherbakovMonom& m);
- };
- /*CScherbakovMonom.cpp*/
- #include "cScherbakovMonom.h"
- int fromStringToNum(char *str)
- {
- char* s = str;
- int result = 0;
- while (*s)
- result = result * 10 + *s++ - '0';
- return result;
- }
- cScherbakovMonom::cScherbakovMonom(char* str) : iScherbakovCoeff(0), uScherbakovDegree(0)
- {
- if (*str == 'x')
- {
- iScherbakovCoeff = 1;
- char* s = str + 1;
- if (!*s) uScherbakovDegree = 1;
- else if (*s == '^') uScherbakovDegree = fromStringToNum(s + 1);
- }
- else if (isdigit(*str))
- {
- char* s = str;
- while (*s && isdigit(*s)) s++;
- if (!*s) iScherbakovCoeff = fromStringToNum(str);
- else
- {
- char buf[100] = "", *b = buf, *s1 = str;
- while (s1 != s) *b++ = *s1++;
- *b = 0;
- iScherbakovCoeff = fromStringToNum(buf);
- if (!*(s + 1)) uScherbakovDegree = 1;
- else if (*(s + 1) == '^') uScherbakovDegree = fromStringToNum(s + 2);
- }
- }
- else if (*str == '+' || *str == '-')
- {
- bool flag = *str == '+';
- char *s = str + 1;
- if (*s == 'x')
- {
- iScherbakovCoeff = 1;
- s++;
- if (!*s) uScherbakovDegree = 1;
- else if (*s == '^') uScherbakovDegree = fromStringToNum(s + 1);
- }
- else if (isdigit(*s))
- {
- char *s1 = s;
- while (s1 && isdigit(*s1)) s1++;
- if (!*s1) iScherbakovCoeff = fromStringToNum(s);
- else
- {
- char buf[100] = "", *b = buf, *s2 = s;
- while (s2 != s1) *b++ = *s2++;
- *b = 0;
- iScherbakovCoeff = fromStringToNum(buf);
- if (!*(s1 + 1)) uScherbakovDegree = 1;
- else if (*(s1 + 1) == '^') uScherbakovDegree = fromStringToNum(s1 + 2);
- }
- }
- if (!flag) iScherbakovCoeff = -iScherbakovCoeff;
- }
- }
- cScherbakovMonom cScherbakovMonom::operator-() const
- {
- return cScherbakovMonom(-iScherbakovCoeff, uScherbakovDegree);
- }
- cScherbakovMonom cScherbakovMonom::operator+(const cScherbakovMonom& sum) const
- {
- return cScherbakovMonom(iScherbakovCoeff + sum.getCoeff(), uScherbakovDegree);
- }
- cScherbakovMonom cScherbakovMonom::operator-(const cScherbakovMonom& sub) const
- {
- return cScherbakovMonom(iScherbakovCoeff - sub.getCoeff(), uScherbakovDegree);
- }
- cScherbakovMonom cScherbakovMonom::operator*(const cScherbakovMonom& mul) const
- {
- return cScherbakovMonom(iScherbakovCoeff * mul.getCoeff(), uScherbakovDegree + mul.getDegree());
- }
- cScherbakovMonom cScherbakovMonom::operator/(const cScherbakovMonom& div) const
- {
- try
- {
- if (!div.getCoeff()) throw dividing_by_zero();
- }
- catch (const dividing_by_zero& exc) { std::cout << exc.what(); }
- if (uScherbakovDegree < div.getDegree()) return cScherbakovMonom();
- else return cScherbakovMonom(iScherbakovCoeff / div.getCoeff(), uScherbakovDegree - div.getDegree());
- }
- cScherbakovMonom cScherbakovMonom::operator%(const cScherbakovMonom& mod) const
- {
- return *this - *this / mod * mod;
- }
- ostream& operator<<(ostream& stream, const cScherbakovMonom& m)
- {
- if (!m.getCoeff()) return stream << '0';
- else if (abs(m.getCoeff()) != 1 || !m.getDegree()) stream << abs(m.getCoeff());
- if (m.getDegree()) stream << 'x';
- if (m.getDegree() != 1 && m.getDegree()) stream << '^' << m.getDegree();
- return stream;
- }
- /*CScherbakovPolynom.h*/
- #include "cScherbakovNode.h"
- class cScherbakovPolynom
- {
- cScherbakovNode* first;
- public:
- cScherbakovPolynom();
- cScherbakovPolynom(char* str);
- cScherbakovPolynom(int c, unsigned d);
- cScherbakovPolynom(const cScherbakovMonom& m);
- cScherbakovPolynom(const cScherbakovNode& n);
- cScherbakovPolynom(const cScherbakovPolynom& p);
- cScherbakovPolynom& operator=(const cScherbakovPolynom& p);
- cScherbakovNode* getFirst() const { return first; }
- void add(char* str);
- void add(int c = 0, unsigned d = 0);
- void add(const cScherbakovMonom& m);
- void add(const cScherbakovNode& n);
- cScherbakovPolynom operator-() const;
- cScherbakovPolynom operator+(const cScherbakovPolynom& sum) const;
- cScherbakovPolynom operator-(const cScherbakovPolynom& sub) const;
- cScherbakovPolynom operator*(const cScherbakovPolynom& mul) const;
- cScherbakovPolynom operator/(const cScherbakovPolynom& div) const;
- cScherbakovPolynom operator%(const cScherbakovPolynom& mod) const;
- friend ostream& operator<<(ostream& stream, const cScherbakovPolynom& p);
- friend istream& operator>>(istream& stream, cScherbakovPolynom& p);
- ~cScherbakovPolynom();
- };
- /*CScherbakovPolynom.cpp*/
- #include "cScherbakovPolynom.h"
- cScherbakovPolynom::cScherbakovPolynom() : first(nullptr) { }
- cScherbakovPolynom::cScherbakovPolynom(char* str) : first(nullptr)
- {
- char *s = str, buf[100] = "", *b = buf;
- if (*s == '+' || *s == '-') *b++ = *s++;
- while (*s)
- {
- *b++ = *s++;
- if (!*s || *s == '+' || *s == '-')
- {
- *b = 0;
- b = buf;
- add(buf);
- if (*s) *b++ = *s++;
- }
- }
- }
- cScherbakovPolynom::cScherbakovPolynom(int c, unsigned d) : first(nullptr)
- {
- if (c)
- {
- try
- {
- first = new cScherbakovNode(c, d);
- }
- catch (const bad_alloc& exc) { std::cout << exc.what(); }
- }
- }
- cScherbakovPolynom::cScherbakovPolynom(const cScherbakovMonom& m) : first(nullptr)
- {
- if (m.getCoeff())
- {
- try
- {
- first = new cScherbakovNode(m);
- }
- catch (const bad_alloc& exc) { std::cout << exc.what(); }
- }
- }
- cScherbakovPolynom::cScherbakovPolynom(const cScherbakovNode& n) : first(nullptr)
- {
- if (n.getCoeff())
- {
- try
- {
- first = new cScherbakovNode(n);
- }
- catch (const bad_alloc& exc) { std::cout << exc.what(); }
- }
- }
- cScherbakovPolynom::cScherbakovPolynom(const cScherbakovPolynom& p) : first(nullptr)
- {
- if (p.getFirst())
- {
- try
- {
- first = new cScherbakovNode(*p.getFirst());
- }
- catch (const bad_alloc& exc) { std::cout << exc.what(); }
- cScherbakovNode* pPtr = p.getFirst();
- cScherbakovNode* tPtr = first;
- while (pPtr->getNext())
- {
- try
- {
- tPtr->setNext(new cScherbakovNode(*pPtr->getNext()));
- }
- catch (const bad_alloc& exc) { std::cout << exc.what(); }
- pPtr = pPtr->getNext();
- tPtr = tPtr->getNext();
- }
- }
- }
- cScherbakovPolynom& cScherbakovPolynom::operator=(const cScherbakovPolynom& p)
- {
- if (first)
- {
- cScherbakovNode* runner1 = first;
- cScherbakovNode* runner2 = first->getNext();
- while (runner2)
- {
- delete runner1;
- runner1 = runner2;
- runner2 = runner2->getNext();
- }
- delete runner1;
- }
- first = nullptr;
- if (p.getFirst())
- {
- try
- {
- first = new cScherbakovNode(*p.getFirst());
- }
- catch (const bad_alloc& exc) { std::cout << exc.what(); }
- cScherbakovNode* pPtr = p.getFirst();
- cScherbakovNode* tPtr = first;
- while (pPtr->getNext())
- {
- try
- {
- tPtr->setNext(new cScherbakovNode(*pPtr->getNext()));
- }
- catch (const bad_alloc& exc) { std::cout << exc.what(); }
- pPtr = pPtr->getNext();
- tPtr = tPtr->getNext();
- }
- }
- return *this;
- }
- void cScherbakovPolynom::add(char* str)
- {
- add(cScherbakovNode(str));
- }
- void cScherbakovPolynom::add(int c, unsigned d)
- {
- add(cScherbakovNode(c, d));
- }
- void cScherbakovPolynom::add(const cScherbakovMonom& m)
- {
- add(cScherbakovNode(m));
- }
- void cScherbakovPolynom::add(const cScherbakovNode& n)
- {
- if (n.getCoeff())
- {
- if (!first)
- {
- try
- {
- first = new cScherbakovNode(n);
- }
- catch (const bad_alloc& exc) { std::cout << exc.what(); }
- }
- else
- {
- if (n.getDegree() > first->getDegree())
- {
- cScherbakovNode* newFirst = nullptr;
- try
- {
- newFirst = new cScherbakovNode(n);
- }
- catch (const bad_alloc& exc) { std::cout << exc.what(); }
- newFirst->setNext(first);
- first = newFirst;
- }
- else if (n.getDegree() == first->getDegree())
- {
- first->setCoeff(first->getCoeff() + n.getCoeff());
- if (!first->getCoeff())
- {
- cScherbakovNode* newFirst = first->getNext();
- delete first;
- first = newFirst;
- }
- }
- else
- {
- cScherbakovNode* runner = first;
- while (runner->getNext() && runner->getNext()->getDegree() > n.getDegree()) runner = runner->getNext();
- if (!runner->getNext())
- {
- cScherbakovNode* newLast = nullptr;
- try
- {
- newLast = new cScherbakovNode(n);
- }
- catch (const bad_alloc& exc) { std::cout << exc.what(); }
- runner->setNext(newLast);
- }
- else if (n.getDegree() > runner->getNext()->getDegree())
- {
- cScherbakovNode* tmp = runner->getNext();
- cScherbakovNode* elemToAdd = nullptr;
- try
- {
- elemToAdd = new cScherbakovNode(n);
- }
- catch (const bad_alloc& exc) { std::cout << exc.what(); }
- runner->setNext(elemToAdd);
- elemToAdd->setNext(tmp);
- }
- else if (n.getDegree() == runner->getNext()->getDegree())
- {
- runner->getNext()->setCoeff(runner->getNext()->getCoeff() + n.getCoeff());
- if (!runner->getNext()->getCoeff())
- {
- cScherbakovNode* tmp = runner->getNext()->getNext();
- delete runner->getNext();
- runner->setNext(tmp);
- }
- }
- }
- }
- }
- }
- cScherbakovPolynom cScherbakovPolynom::operator-() const
- {
- cScherbakovPolynom result;
- cScherbakovNode* runner = first;
- while (runner)
- {
- result.add(-*runner);
- runner = runner->getNext();
- }
- return result;
- }
- cScherbakovPolynom cScherbakovPolynom::operator+(const cScherbakovPolynom& sum) const
- {
- cScherbakovPolynom result = *this;
- cScherbakovNode* runner = sum.getFirst();
- while (runner)
- {
- result.add(*runner);
- runner = runner->getNext();
- }
- return result;
- }
- cScherbakovPolynom cScherbakovPolynom::operator-(const cScherbakovPolynom& sub) const
- {
- cScherbakovPolynom result = *this;
- cScherbakovNode* runner = sub.getFirst();
- while (runner)
- {
- result.add(-*runner);
- runner = runner->getNext();
- }
- return result;
- }
- cScherbakovPolynom cScherbakovPolynom::operator*(const cScherbakovPolynom& mul) const
- {
- cScherbakovPolynom result;
- cScherbakovNode* runnerThis = first;
- cScherbakovNode* runnerMul = mul.getFirst();
- while (runnerThis)
- {
- while (runnerMul)
- {
- result.add(*runnerThis * *runnerMul);
- runnerMul = runnerMul->getNext();
- }
- runnerMul = mul.getFirst();
- runnerThis = runnerThis->getNext();
- }
- return result;
- }
- cScherbakovPolynom cScherbakovPolynom::operator/(const cScherbakovPolynom& div) const
- {
- if (first->getDegree() < div.getFirst()->getDegree()) return cScherbakovPolynom();
- else if (first->getDegree() == div.getFirst()->getDegree()) return cScherbakovPolynom(first->getCoeff() / div.getFirst()->getCoeff(), 0);
- else
- {
- cScherbakovPolynom result, maincScherbakovPolynom = *this;
- while (maincScherbakovPolynom.getFirst() && maincScherbakovPolynom.getFirst()->getDegree() >= div.getFirst()->getDegree())
- {
- cScherbakovNode n(maincScherbakovPolynom.getFirst()->getCoeff() / div.getFirst()->getCoeff(), maincScherbakovPolynom.getFirst()->getDegree() - div.getFirst()->getDegree());
- if (!n.getCoeff())
- {
- maincScherbakovPolynom.add(-*maincScherbakovPolynom.getFirst());
- if (!maincScherbakovPolynom.getFirst()) break;
- }
- else
- {
- result.add(n);
- maincScherbakovPolynom = maincScherbakovPolynom - cScherbakovPolynom(n) * div;
- if (maincScherbakovPolynom.getFirst()->getDegree() == n.getDegree() + div.getFirst()->getDegree()) maincScherbakovPolynom.add(-*maincScherbakovPolynom.getFirst());
- }
- }
- return result;
- }
- }
- cScherbakovPolynom cScherbakovPolynom::operator%(const cScherbakovPolynom& mod) const
- {
- return *this - *this / mod * mod;
- }
- ostream& operator<<(ostream& stream, const cScherbakovPolynom& p)
- {
- stream << '<';
- cScherbakovNode* runner = p.getFirst();
- if (!runner) stream << '0';
- else while (runner)
- {
- if (runner == p.getFirst())
- {
- if (!runner->getSign()) stream << '-';
- stream << *runner;
- if (runner->getNext()) stream << ' ';
- }
- else
- {
- stream << (runner->getSign() ? '+' : '-') << ' ' << *runner;
- if (runner->getNext()) stream << ' ';
- }
- runner = runner->getNext();
- }
- return stream << '>';
- }
- istream& operator>>(istream& stream, cScherbakovPolynom& p)
- {
- static char buf[1000] = "";
- char* b = buf, c;
- while ((c = (char)stream.get()) != '>') *b++ = c;
- *b = 0;
- p = cScherbakovPolynom(buf);
- return stream;
- }
- cScherbakovPolynom::~cScherbakovPolynom()
- {
- if (first)
- {
- cScherbakovNode* runner = first->getNext();
- while (runner)
- {
- delete first;
- first = runner;
- runner = runner->getNext();
- }
- delete first;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement