vadimk772336

Untitled

Nov 13th, 2019
262
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.94 KB | None | 0 0
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. class Expression {
  5. public:
  6. virtual Expression* diff() = 0;
  7. virtual void print() = 0;
  8. };
  9.  
  10. class Number : public Expression {
  11. double value;
  12.  
  13. public:
  14. Number(double x) : value(x) {}
  15. Expression* diff() { return new Number(0); }
  16. void print() { cout << value; }
  17. };
  18.  
  19. class Variable : public Expression {
  20. char value;
  21.  
  22. public:
  23. Variable(char x) : value(x) {}
  24. Expression* diff() { return new Number(1); }
  25. void print() { cout << value; }
  26. };
  27.  
  28. class Add : public Expression {
  29. Expression *left, *right;
  30.  
  31. public:
  32. Add(Expression* l, Expression* r) : left(l), right(r) {}
  33. Expression* diff() { return new Add(left->diff(), right->diff()); }
  34. void print() {
  35. cout << "(";
  36. left->print();
  37. cout << ")";
  38. cout << '+';
  39. cout << "(";
  40. right->print();
  41. cout << ")";
  42. }
  43. };
  44.  
  45. class Sub : public Expression {
  46. Expression *left, *right;
  47.  
  48. public:
  49. Sub(Expression* l, Expression* r) : left(l), right(r) {}
  50. Expression* diff() { return new Sub(left->diff(), right->diff()); }
  51. void print() {
  52. cout << "(";
  53. left->print();
  54. cout << ")";
  55. cout << '-';
  56. cout << "(";
  57. right->print();
  58. cout << ")";
  59. }
  60. };
  61.  
  62. class Mul : public Expression {
  63. Expression *left, *right;
  64.  
  65. public:
  66. Mul(Expression* l, Expression* r) : left(l), right(r) {}
  67. Expression* diff() {
  68. return new Add(new Mul(left->diff(), right), new Mul(left, right->diff()));
  69. }
  70. void print() {
  71. cout << "(";
  72. left->print();
  73. cout << ")";
  74. cout << '*';
  75. cout << "(";
  76. right->print();
  77. cout << ")";
  78. }
  79. };
  80.  
  81. class Div : public Expression {
  82. Expression *left, *right;
  83.  
  84. public:
  85. Div(Expression* l, Expression* r) : left(l), right(r) {}
  86. Expression* diff() {
  87. return new Div(
  88. new Sub(new Mul(left->diff(), right), new Mul(left, right->diff())),
  89. new Mul(right, right));
  90. }
  91. void print() {
  92. cout << "(";
  93. left->print();
  94. cout << ")";
  95. cout << "/";
  96. cout << "(";
  97. right->print();
  98. cout << ")";
  99. }
  100. };
  101.  
  102. class Ln : public Expression { //защищенный член класса доступен только методам этого класса и всех производных от него классов.
  103. protected:
  104. Expression* x;
  105.  
  106. public:
  107. Ln(Expression* v) : x(v) {}
  108. Expression* diff() { return new Div(new Number(1), x); }
  109. void print() {
  110. cout << "ln(";
  111. x->print();
  112. cout << ')';
  113. }
  114. };
  115.  
  116. class Log : public Ln {
  117. double a;
  118.  
  119. public:
  120. Log(double n, Expression* v) : a(n), Ln(v) {}
  121. Expression* diff() {
  122. return new Div(new Number(1), new Mul(x, new Ln(new Number(a))));
  123. }
  124. void print() {
  125. cout << "log_" << a << '(';
  126. x->print();
  127. cout << ')';
  128. }
  129. };
  130.  
  131. int main() {
  132. //Expression* e = new Log(3, new Add(new Number(1), new Variable('x')));
  133. Expression *e = new Add(new Number('x'), new Variable('x'));
  134. Expression* de = e->diff();
  135. e->print();
  136. cout << "\n";
  137. de->print();
  138. cout << "\n";
  139. delete e;
  140. delete de;
  141. system("pause");
  142. }
Advertisement
Add Comment
Please, Sign In to add comment