⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 calculator.cpp

📁 实现小心的CVM
💻 CPP
字号:
#include<iostream.h>
#include"calculator.h"
#include"store.h"

store * myStore = NULL;

elem::elem()
{
	number = 0;
	left = NULL;
	right = NULL;
	varName = NULL;
}
elem::elem(char t)
{
	if(t == '+')
		elemType = ADD;
	if(t == '-')
		elemType = SUB;
	if(t == '*')
		elemType = MUL;
	if(t == '=')
		elemType = EQU;
	number = 0;
	left = NULL;
	right = NULL;
	varName = NULL;
}
elem::elem(int num)
{
	elemType = NUM;
	number = num;
	left = NULL;
	right = NULL;
	varName = NULL;
}
elem::elem(char * ivar)
{
	elemType = VAR;
	number = 0;
	int i = 0;
	while(*(ivar + i) != '\0')
		i++;
	varName = new char[i];
	while(i >= 0)
	{
		*(varName + i) = *(ivar + i);
		i--;
	}
	left = NULL;
	right = NULL;
	
}
void elem::print()
{
	
	if(elemType == NUM)
	{
		cout<<"节点类型为NUM, 数字为"<<number<<endl;
	}
	if(elemType == ADD)
	{
		cout<<"节点类型为ADD"<<endl;
	}
	if(elemType == SUB)
	{
		cout<<"节点类型为SUB"<<endl;
	}
	if(elemType == MUL)
	{
		cout<<"节点类型为MUL"<<endl;
	}
	if(elemType == EQU)
	{
		cout<<"节点类型为EQUAL"<<endl;
	}
}

//Tree函数将运算式作为一个字符串作为输入,构造出运算式的结构树
elem Tree(char * list)                     
{
	int i = 0;
	int k = 0;
	int length;
	int num = 0;

//处理 = 优先级
	while(*(list + i)!= '\0')
	{
		if(*(list + i) == '=')
		{
			elem t(*(list + i));
			char * list1 = new char[i + 1];

			for(int j = 0;j < i;j++)
				*(list1 + j) = * (list + j);

			*(list1 + i) = '\0';
			char * list2 = list + i + 1;
			t.left = new elem();
			*(t.left) = Tree(list1);
			t.right = new elem();
			*(t.right) = Tree(list2);

		//	t.print();

			return t;
		}
		i++;
	}

//得到字符串长度
	i = 0;
	while(*(list + i)!= '\0')
	{
		i++;
	}
	length = i;

//处理+ - 优先级
	while(i >= 0)       
	{
		if(*(list + i)==')')
			k++;
		else if(*(list + i)=='(')
			k--;
		else if((k == 0)&&((*(list + i) == '+')||(*(list + i) == '-')))
		{	
			elem t(*(list + i));
			char * list1 = new char[i + 1];

			for(int j = 0;j < i;j++)
				*(list1 + j) = * (list + j);

			*(list1 + i) = '\0';
			char * list2 = list + i + 1;
			t.left = new elem();
			*(t.left) = Tree(list1);
			t.right = new elem();
			*(t.right) = Tree(list2);

		//	t.print();

			return t;
		}
		i--;
	}

	i = 0;

//处理 * 运算
	while(*(list + i) != '\0')
	{
		if(*(list + i)=='(')
			k++;
		else if(*(list + i)==')')
			k--;
		else if((k == 0)&&(*(list + i)=='*'))
		{
			elem t(*(list + i));
			char * list1 = new char[i + 1];
			for(int j = 0;j < i;j++)
				*(list1 + j) = * (list + j);
			*(list1 + i) = '\0';
			char * list2 = list + i + 1;
			t.left = new elem();
			*(t.left) = Tree(list1);
			t.right = new elem();
			*(t.right) = Tree(list2);

		//	t.print();

			return t;
		}
		i++;	
	}

	i = 0;

//处理()内的运算
	if((*(list + i) == '(') && (*(list + length - 1) == ')'))
	{
		char * list1 = new char[length - 1];
		for(int j = 0;j < length-2;j++)
			*(list1 + j) = *(list + j + 1);
		*(list1 + length - 2) = '\0';
		elem t = Tree(list1);

	//	t.print();

		return t;
	}

//处理纯数字
	if((int(*list) >= 48)&&(int(*list) <= 57))
	{
		while(*(list + i) != '\0')
		{
			num = num * 10;
			num = num - 48;
			num = num + int(*(list + i));
			i++;
		}
		elem t(num);

	//	t.print();

		return t;
	}
	
//处理变量名称
	elem t(list);
	
//	t.print();

	return t;
}

//根据算式的结构树,运算出结果
int Calculate(elem t)
{
	int t1;
	int t2;
	int t0 = 0;
	store * temp;
	char * chartemp;
//处理赋值表达式
	if(t.elemType == EQU)
	{
		t0 = Calculate(*(t.right));
		chartemp = t.left->varName;

		if(ChangeInStore(myStore,chartemp,t0))
			return 0;

		temp = new store();
		*temp = insertIntoStore(myStore,t.left->varName,t0);
		myStore = temp;
		return 0;
	}

//处理变量
	if(t.elemType == VAR)
	{
		chartemp = t.varName;
		if(!FindInStore(myStore,chartemp,t0))
		{
			cout<<"ERROR!!"<<endl;
			return 0;
		}
		return t0;
	}

	if(t.left != NULL)
		t1 = Calculate(*(t.left));
	if(t.right != NULL)
		t2 = Calculate(*(t.right));
	if(t.elemType == NUM)
		t0 = t.number;
	else if(t.elemType == ADD)
		t0 = t1 + t2;
	else if(t.elemType == SUB)
		t0 = t1 - t2;
	else if(t.elemType == MUL)
		t0 = t1 * t2;
	return t0;
}

//输出算式中的数字
void getNum(elem t)
{
	if(t.elemType == NUM)
	{
		cout<<"NUM : "<<t.number<<endl;
		return ;
	}
	if(t.left != NULL)
		getNum(*(t.left));
	if(t.right != NULL)
		getNum(*(t.right));
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -