当前位置:首页 > 利用栈求表达式的值课程设计最后老师改- 副本
2.3运行环境
Windows XP/ 7系统 VC++6.0编译环境
2.4开发工具
C语言
9
3.总体设计
3.1设计任务与目标
编写程序实现表达式求值,即验证某算术表达式的正确性,若正确,则计算该算术表达式的值。
主要功能描述如下:
1、从键盘上输入表达式,以“=” 号结束表达式。 2、分析该表达式是否合法:
(1)是数字,则判断该数字的合法性。若合法,则压入数据到堆栈中。 (2)是规定的运算符,则根据规则进行处理。在处理过程中,将计算该表达式的值。
(3)若是其它字符,则返回错误信息。
3、若上述处理过程中没有发现错误,则认为该表达式合法,并在屏幕上打印处理结果。
附加功能:
规定表达式的合法性 小数计算
计算记录的保存与查看 判断表达式的合法性
(1)规定表达式的合法性,括号配对,不能出现“6++3”、“6+-3”等符号重叠的情况。
(2)表达式开头只能是数字或“(”,表达式中只能有一个“=”。
3.2程序中的功能函数:
void initstack():初始化堆栈 int check():语法检查并计算
int Push (czs *nu, double da):将操作数压入堆栈 char procede(char top,char code):处理操作码
int change_opnd(char code):将字符型操作码转换成优先级 int push (czm *op,char co):将操作码压入堆栈
10
char pop (czm *op):将操作码弹出堆栈
double caculate(czm *op,czs *nu):简单计算+,-,*,/
double Pop (czs *nu):弹出操作数
3.3方案设计与论证
1.定义一个expression全局表达式结构体EXPRESS [1000]存放计算过的表达式(express [MAXSIZE])和计算结果(result)、一个计量器(i)、一个表达式字符串、一个操作码栈和一个操作数栈;
2.把表达式字符串从头到尾逐一扫描,将输入的表达式进行语法检查; 3.第一个字符只能是数字或“(”,最重一个字符只能是“=”; 4.表达式括号必须配对,中间不能出现“=”;
5.在“(”前面只能是“+、-、*、/、( ”,在“+、-、*、/、=、)”前面只能是数字或“)”;
6.把表达式字符串从头到尾逐一扫描,直到表达式扫描完毕,操作码栈为空; 7.把字符根据运算优先级别选择操作;
8.把表达式中的数值部分字符串转成数值压入操作数栈;
9.是“(”直接压入到操作码栈,级别比操作码栈顶元素高的,把运算符压入操作码栈;
10.级别比操作码栈低的,弹出操作码栈的栈顶元素和操作数栈的两个栈顶元素,进行运算后再压入操作数栈;
11.是“)”,若操作码栈顶是“(”,把弹出操作码栈顶元素,否则“)”视为级别最低的元素,重复7;
12.最后计算出结果并将其存放在EXPRESS [i],计量器加1; 13.重复计算后,将结果保存在文件里,并统计计算次数; 14.查看多次计算结果,以表形式输出; 15.查看本次计算记录,以表形式输出; 16.清除计算记录,重新计算。
11
4算法说明
4.1主要功能函数
本程序的主要功能函数包括: void main()//主函数
void stack1(czm *op,czs *nu)//程序主菜单
void stack2(czm *op,czs *nu)//第二层计算选择,子菜单 void load()//显示所有计算记录 void save()//保存计算结果 void shown()//显示本次计算结果 void result(czm *op,czs *nu)//计算结果
double caculate(czm *op,czs *nu //简单计算+,-,*,/ 表达式处理函数: int check()//语法检查
double change_num(char str[])//数字字符串转成double型数字 char procede(char top,char code)//处理操作码,判断栈的操作 int change_opnd(char code)//字符型操作码转换优先级,非表达式字符返回-2 栈操作函数:
double Get (czs *nu)//查看操作数栈栈顶 double pop (czs *nu)//操作数栈出栈 int Push (czs *nu,double da)//压入操作数栈 int Empty (czs *nu)//判空
void Initstack(czs *nu) //初始化栈 char get(czm *op)//查看栈顶 char pop(czm *op)//出栈 int push(czm *op,char co)//压栈 int empty(czm *op)//判空
void initstack(czm *op)//初始化栈
12
共分享92篇相关文档