📄 calculator.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 + -