一、题目及要求
【问题描述】
设计一个简单的算术表达式计算器。
【基本要求】
实现标准整数类型的四则运算表达式的求值(包含括号,可多层嵌入).
【测试数据】
(30+2*70)/3-12*3
5+(9*(62-37)+15)*6
要求自行设计非法表达式,进行程序测试,以保证程序的稳定运行。
【实现提示】
可以设计以下辅助函数
status isNumber(char ReadInChar); //视ReadInchar 是否是数字而返回 TRUE 或 FALSE 。
int TurnToInteger(char IntChar); // 将字符’0’.’9’ 转换为整数 9
二、问题分析和任务定义
设计2个栈,分别用于存放操作数和操作符,其中操作符有优先级。栈内存放的操作数用一个类名为Operand的类存放;操作符用Operator类存放,并且设置 相应运算符的优先级。
将用户输入的整个四则运算表达式字符串可看作由操作数,运算符和左右括弧()组成的字符串,并用事先定义的操作数类、操作符 类来表示相应的对象。用一个叫分析器的类(Analyzer)对输入的四则运算进行分析扫描,每次返回一个字符串;定义一个名为calculate的函数将Analyzer的静态方法返回的字符串构造为相应的对象,放入各自的栈,并利用四则运算规则,计算相应的结果。
calculate函数利用四则运算的规则:乘、除优先级高于加、减,则放入操作符栈的规则为:
1、操作符栈里符号进栈规则是,后进栈的操作符优先级必须高于已经进栈符号的优先级,比方如果接收的操作符优先级等于或小于(<=)栈顶操作符优先级,则先对栈顶操作符进行出栈,运算;再将后面的操作符入栈保存。这样保证操作符栈里符号优先级为由低到高,符合优先级高的操作符先出栈,参与运算的规则。
2、遇到左括弧“(”时,先将左括弧“(”进栈,当扫描到右括弧“)”时候,取操作符栈运算符出栈计算,直到栈顶为左括弧为止。
3、分析完输入字符串后,全部计算完成,计算结果便从操作数栈中取出。
三、实验过程及内容
实验中整个用一个名为sizheyunsuan.cpp的C++源文件。该源文件中相关类的成员变量以及成员函数如下所示:
类:
Operand:操作数类,包含私有成员operS,表示操作数的数值。
Operator:操作符类,包含私有成员operF,priority,分别表示操作符的符号,以及运算优先级。
template <calss Type> class STACK: 用于存放操作数和操作符的栈。
Analyzer:字符串扫描分析类,包含静态函数analysis(char *str,unsigned int& mark,char *returns)
函数:
void calculate(char *temp,STACK& sOperator,STACK& sOperand):
对扫描返回的字符串分析,构造相应的对象,并依照运算规则进行计算。
void main():程序主函数。
对象以及变量:
STACK <Operator> sOperator:存放操作数的栈
STACK <Operand> sOperand:存放操作符的栈
Analyzer analyzer:扫描分析器
char Str_input[MAX]:存放用户输入的四则表达式
char temp[12]:存放分析器返回的字符串
unsigned int mark:“游标”的作用,标示分析器每一次调用分析操作对应的输入字符串的位置。