Website Summary Files Commits Branches @commit @diff @stats
path: root / Polymorphism / MathExpression / main.hpp
blob: 5fa3f8f6ba9aa4a46f844b760d2256c4134dedd9 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include "Expression.hpp"
#include "Num.hpp"
#include "Operation.hpp"
bool AreTheSame(Expression* left, Expression* right);
int main()
{	
	Expression* l = new Num(3);
	Expression* r = new Num(7);
	Expression* final1 = new Operation(l, '+', r);

	Expression* l2 = new Num(3);
	Expression* r2 = new Num(7);
	Expression* final2 = new Operation(l2, '+', r2);

	std::cout << final1->Evaluate();
	
	std::cout << AreTheSame(final1, final2);

	delete final1, final2; //Винаги трием най-големите 'Expression-и'. Те се грижат за по-малките от които са образувани.

	

}
bool AreTheSame(Expression* left, Expression* right)
{
	if (left->getType() != right->getType())//гледаме дали не са от раличен тип (едното да е опрация,другото да е число)
		return false; //очевидно са различни тогава

	if (left->getType() == 1) //ако двете са числа
	{
		Num* l = (Num*)left; //Конвертираме пойнтерите
		Num* r = (Num*)right;
		return l->getNum() == r->getNum(); //сравняваме стойностите
	}
	else //Ако двете са операции
	{
		Operation* l = (Operation*)left;
		Operation* r = (Operation*)right;
		return  (l->op == l->op) && AreTheSame(l->left, r->left) && AreTheSame(l->right, r->right);
		//гледаме дали знаците на опрациите съвпадат, дали левите страни съвпадат и дали десните страни съвпадат.
	}

}