Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- using namespace std;
- class Expression {
- public:
- virtual Expression* diff() = 0;
- virtual void print() = 0;
- };
- class Number : public Expression {
- double value;
- public:
- Number(double x) : value(x) {}
- Expression* diff() { return new Number(0); }
- void print() { cout << value; }
- };
- class Variable : public Expression {
- char value;
- public:
- Variable(char x) : value(x) {}
- Expression* diff() { return new Number(1); }
- void print() { cout << value; }
- };
- class Add : public Expression {
- Expression *left, *right;
- public:
- Add(Expression* l, Expression* r) : left(l), right(r) {}
- Expression* diff() { return new Add(left->diff(), right->diff()); }
- void print() {
- cout << "(";
- left->print();
- cout << ")";
- cout << '+';
- cout << "(";
- right->print();
- cout << ")";
- }
- };
- class Sub : public Expression {
- Expression *left, *right;
- public:
- Sub(Expression* l, Expression* r) : left(l), right(r) {}
- Expression* diff() { return new Sub(left->diff(), right->diff()); }
- void print() {
- cout << "(";
- left->print();
- cout << ")";
- cout << '-';
- cout << "(";
- right->print();
- cout << ")";
- }
- };
- class Mul : public Expression {
- Expression *left, *right;
- public:
- Mul(Expression* l, Expression* r) : left(l), right(r) {}
- Expression* diff() {
- return new Add(new Mul(left->diff(), right), new Mul(left, right->diff()));
- }
- void print() {
- cout << "(";
- left->print();
- cout << ")";
- cout << '*';
- cout << "(";
- right->print();
- cout << ")";
- }
- };
- class Div : public Expression {
- Expression *left, *right;
- public:
- Div(Expression* l, Expression* r) : left(l), right(r) {}
- Expression* diff() {
- return new Div(
- new Sub(new Mul(left->diff(), right), new Mul(left, right->diff())),
- new Mul(right, right));
- }
- void print() {
- cout << "(";
- left->print();
- cout << ")";
- cout << "/";
- cout << "(";
- right->print();
- cout << ")";
- }
- };
- class Ln : public Expression { //защищенный член класса доступен только методам этого класса и всех производных от него классов.
- protected:
- Expression* x;
- public:
- Ln(Expression* v) : x(v) {}
- Expression* diff() { return new Div(new Number(1), x); }
- void print() {
- cout << "ln(";
- x->print();
- cout << ')';
- }
- };
- class Log : public Ln {
- double a;
- public:
- Log(double n, Expression* v) : a(n), Ln(v) {}
- Expression* diff() {
- return new Div(new Number(1), new Mul(x, new Ln(new Number(a))));
- }
- void print() {
- cout << "log_" << a << '(';
- x->print();
- cout << ')';
- }
- };
- int main() {
- //Expression* e = new Log(3, new Add(new Number(1), new Variable('x')));
- Expression *e = new Add(new Number('x'), new Variable('x'));
- Expression* de = e->diff();
- e->print();
- cout << "\n";
- de->print();
- cout << "\n";
- delete e;
- delete de;
- system("pause");
- }
Advertisement
Add Comment
Please, Sign In to add comment