目录
一.算术表达式求解
实现标准整数类型的四则运算表达式的求值(包含括号,可多层嵌入).
1.需求分析
要把一个表达式翻译成正确求值的一个机器指令序列,或者直接对表达式求值,首先要正确解释表 达式。表达式求值应按照下述算术四则运算法则来进行运算
(1) 先乘除,后加减;(2) 从左算到右; (3) 先括号内,后括号外。
1. 能通过设计的按钮控件输入并实现算术表达式,运算结果输出显示;
2.能够检验算术表达式的合法性;
3.能够实现混合运算的求解,算术表达式中包括加、减、乘、除、括号等运算符;
4.要求交互界面友好,程序健壮。
2.逻辑设计
算符优先算法思想
1)首先置操作数栈OPND为空栈,再置操作符(运算符)栈OPTR为空栈,然后将表达式起始符“#”作为运算符栈的栈底元素。
(2)依次读入表达式中每个字符,若是操作数,则进OPND栈;若是运算符,
运算符栈OPTR的栈顶运算符比较优先级后作相应操作,直至整个表达式求值完毕。
调用关系图
主要函数
int isoperator(char ch) //检查字符ch是否为运算符或左右圆括号的函数
int iswhitespace(char ch) // 检查字符ch是否为空格、制表符或换行符的函数
int order(char op) // 将运算符号内部赋数字值的函数
void Evaluate(char op) //
void CalAnyExp() // 根据操作符进行计算的函数
3.物理设计
- 先定义一个顺序栈MyStack,并设有Push(),Pop(),GetTop()和InitStack()操作,使用栈模板。
- 开始进行操作,首先向初始化的字符栈中存入一个“#”用于以后判断计算是否结束,在初始化一个数据栈存放整型数据,并返回相应的字符,若不是操作符,则判断是否是整型,若是则先将整型的每个字符一次存入数组,最后转成整型存入数据栈顶,若不是,说明输入的字符不合法,则提示错误。当判断到最后一个字符是“#“时,停止接受字符转而调用operate()函数先进行数据和操作符的出栈操作
-
{ char* p = NULL; char numtmp[16]; int state = OK, rtn; cout << "算术表达式求值\n" << "请输入表达式(输入首字符为'#'时退出程序):"; MAINLOOP: while (true) { state = OK; countS = 0; if (ERROR == InitProcess()) //初始化 { Message(0, ERROR, "初始化失败。"); } p = &input[0]; countS++; if (input[0] == '#') //首个字符为#时退出程序 { break; } if (!CheckExpress()) { continue; } while ('#' != *p || '#' != OPTR.GetTop()) {