资源预览内容
第1页 / 共27页
第2页 / 共27页
第3页 / 共27页
第4页 / 共27页
第5页 / 共27页
第6页 / 共27页
第7页 / 共27页
第8页 / 共27页
第9页 / 共27页
第10页 / 共27页
亲,该文档总共27页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
郑州轻工业学院本科本科数据结构课程设计总结报告数据结构课程设计总结报告设计题目设计题目:模拟计算器程序学生姓名学生姓名:谢先斌系系 别别:计算机与通信工程学院专专 业业:计算机科学与技术班班 级级:1 班学学 号号:541007010144指导教师指导教师:卢冰 李晔2012 年 6 月 21 日2郑州轻工业学院课课 程程 设设 计计 任任 务务 书书题目题目 模拟计算器程序模拟计算器程序 专业、班级专业、班级 计算机科学与技术计算机科学与技术 10-0110-01 班班 学号学号 541007010144541007010144 姓名姓名 谢先斌谢先斌 主要内容:主要内容:设计一个模拟计算器的程序,要求能对包含加、减、乘、除、括号运算符及 SQR 和 ABS 函数的任意整型表达式进行求解。基本要求:基本要求:要检查有关运算的条件,并对错误的条件产生报警。主要参考资料:主要参考资料:1 严蔚敏 吴伟民 编著数据结构(C 语言版) 清华大学出版社 第 44 页 3.13.1 栈、第 52 页 3.2.53.2.5 表达式求值完完 成成 期期 限:限: 2 20 01 12 2 年年 6 6 月月 2 21 1 日日 指指导导教教师师签签名名: 课程负责人签名:课程负责人签名: 20122012 年年 6 6 月月 2121 日日3一、一、设计题目设计题目模拟计算器的程序设计一个模拟计算器的程序,要求能对包含加、减、乘、除、括号运算符及 SQR 和 ABS 函数的任意整型表达式进行求解。设计要求:要检查有关运算的条件,并对错误的条件产生报警。二、二、算法设计的思想算法设计的思想本程序设计主要是应用了栈,利用栈的“先进后出”原理,建立了两个栈,分别为运算符栈 pOStack 和运算数栈 pDStack。算法的基本思想(参考课本 p53 页)是: (1)首先置操作数栈为 pDStack 空栈,表达式起始符为“=” ,位运算符栈的栈底元素;(2)依次读入表达式中的每个字符,若是操作数则进入pDStack 栈,若是运算符则和 pOStack 栈的栈定运算符比较优先权后作相应操作,直到整个表达式求值完毕(即 pOStack 栈的栈定元素和当前读入的字符均为“=” ) 。三、三、算法的流程图算法的流程图本程序的流程如下附图 1 所示:4附图 1 程序流程图四、四、算法设计分析算法设计分析首先创建了两个栈:typedef struct OPStack/定义运算符栈char opStackMAX_OPERATOR_NUM;int top;5OPStack, *pOPStack;typedef struct DATAStack/定义运算数栈double stackMAX_DATA_NUM;int top;DATAStack, *pDATAStack;来分别存放运算符和运算数。在两个结构体中均有一个 top 数据域,当 top=-1 时,表示该站为空栈。定义一个 EvaluateExpression()函数来完成函数运算的主要功能:读入表达式,并计算结果。以下是对该函数的分析:当一次运算开始时,分别调用 InitpOPStack(pOPStack int top;OPStack, *pOPStack;typedef struct DATAStack/定义运算数栈double stackMAX_DATA_NUM;int top;DATAStack, *pDATAStack;void InitpOPStack(pOPStack exit(-1);pOStack-top = -1;void InitpDATAStack(pDATAStack exit(-1);pDStack-top = -1;void PushOPStack(pOPStack void PopOPStack(pOPStack pOStack-top-;void PushDATAStack(pDATAStack pDStack-stackpDStack-top = d;void PopDATAStack(pDATAStack pDStack-top-;16void ClearpOPStack(pOPStack void ClearpDATAStack(pDATAStack char GetToppOPStack(pOPStack double GetToppDATAStack(pDATAStack bool IsOP(char elsereturn false;char Precede(char op1, char op2) /参考数据结构 (C 语言版)第 53 页 3.2.5 表达式求值 表 3.1char tab910;/定义字符串的二维数组来存放运算符优先级的关系strcpy( tab0, “ );strcpy( tab1, “ );strcpy( tab2, “E“ );strcpy( tab6, “ );strcpy( tab7, “ );strcpy( tab8, “= 0)/判断被开方数是否为 0,若为0,退出程序s = sqrt(b);/调用 SQRT()函数break;elseprintf(“n# 求负数的平方根是非法运算。程序终止! #n“);exit_E();/打印结束菜单exit(-1);return s;21char ChangeChar(char else if( c = s )c = S; return c;/参考数据结构 (C 语言版)第 53 页 3.2.5 表达式求值 算法 3.4 EvaluateExpression()函数void EvaluateExpression()/计算函数:读入表达式,并计算结果pOPStack pOStack;/声明运算符栈pDATAStack pDStack;/声明运算数栈double result;/存运算的结果char x, theta, c;/c 存放读取的字符,x、theta 存放运算符栈的栈顶元素int flag, data;/标识符,用来读入连续的数字double s;22double getd;/存放 GetTop*的结果double a, b, cc;/a,b 存放数据栈出栈的栈顶元素, c 存放运算结果flag = 0;/初始化标识符,用来判断字符串中的连续数字data = 0;/InitpOPStack(pOStack);/初始化运算符栈InitpDATAStack(pDStack);/初始化运算数栈PushOPStack(pOStack, =);/在运算符栈底放入=printf(“c = getchar();/读入字符ChangeChar(c);/通过调用函数来实现把小写的a、s 改为大写的 A、Swhile( c != = | GetToppOPStack(pOStack) != =)if( !IsOP(c) )/不是运算符进栈s = c - 0;/把字符转化为数字if ( flag = 1 )23PopDATAStack(pDStack, getd);s = getd*10 + s;PushDATAStack(pDStack, s);flag = 1;c = getchar();ChangeChar(c);elseflag = 0;switch( Precede(GetToppOPStack(pOStack), c) )/输入元素和运算符栈顶元素比较case :/退栈并将运算结果进栈24PopOPStack(pOStack, theta);PopDATAStack(pDStack, b);PopDATAStack(pDStack, a);cc = Operate(a, theta, b);PushDATAStack(pDStack, cc);break;/switch/else/whileresult = GetToppDATAStack(pDStack);/运算结束时,运算数栈的栈底元素就是计算结果ClearpOPStack(pOStack);/清空运算符栈ClearpDATAStack(pDStack);/清空运算数栈printf(“-计算结果为:%.2fnn“, result);/输出运算结果return ;void print_user()/欢迎界面printf(“n欢迎使用 C 语言版模拟计算器nn“);25printf(“*n“);printf(“|n“);printf(“|模拟计算器使用说明|nn“);printf(“| 作者:谢先斌|nn“);printf(“|本程序包括对+、-、*、/、()的运算|n“);printf(“|本程序中 ABS()算用 A()替代、SQRT()运算用S()代替|n“);printf(“|本程序中的一切字母均不区分大小写|n“);printf(“正确的表达式如:1+A(7-8)+S(9*8)=n“);printf(“|输入=表示表达式输入结束!|nn“);printf(“| 欢迎使用! |n“);printf(“|n“);printf(“*nn“);26int main()/主函数char in;bool b;/标识符,用来标识是否结束程序b = true;/初始化,不结束print_user();/打印欢迎界面printf(“*请确认使用计算器 Y/N:“);while(1)scanf(“%c“, /确认是否继续操作getchar();/吃掉会车,避免干扰switch(in)case Y:case y:EvaluateExpression();/进入计算函数:读入表达式,并计算结果break;case N:27case n:exit_E();b = false;break;/default:/ printf(“*输入错误,请重新输入 Y/N:“);/ break;if(b=false)/如果 b=false ,退出整个程序break;printf(“*您确定要继续使用计算机 Y/N:“);getchar();/用 getchar 吃掉回车,避免对后续输入中 in 的干扰return 0;
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号