《数据结构实验报告总结 .docx》由会员分享,可在线阅读,更多相关《数据结构实验报告总结 .docx(24页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、精品名师归纳总结数据结构试验报告总结设计题目:模拟运算器程序同学姓名:谢先斌系 别:运算机与通信工程学院专 业:运算机科学与技术班 级: 1 班学 号: 541007010144指导老师:卢冰李晔XX 年 6月 21日 郑州轻工业学院课 程 设 计 任 务 书题目 模拟运算器程序专 业 、 班 级计 算 机 科 学 与 技 术 10-01班学 号541007010144 姓名 谢先斌主要内容:设计一个模拟运算器的程序,要求能对包含加、减、 乘、除、括号运算符及SQR和 ABS函数的任意整型表达式进行求解。基本要求:要检查有关运算的条件,并对错误的条件产生报警。主要参考资料:严蔚敏 吴伟民 编著
2、数据结构 C 语言版 清华大可编辑资料 - - - 欢迎下载精品名师归纳总结学出版社 第 44 页 栈、第 52 页表达式求值完 成 期 限: XX 年 6 月 21 日指导老师签名:课程负责人签名: XX年 6 月 21日一、 设计题目模拟运算器的程序设计一个模拟运算器的程序,要求能对包含加、减、乘、除、括号运算符及SQR和 ABS函数的任意整型表达式进行求解。设计要求:要检查有关运算的条件,并对错误的条件产生报警。二、 算法设计的思想本程序设计主要是应用了栈,利用栈的“先进后出”原理,建立了两个栈,分别为运算符栈pOStack 和运算数栈pDStack 。算法的基本思想 参考课本 p53
3、页 是:(1) 第一置操作数栈为pDStack空栈,表达式起始符为“ =”,位运算符栈的栈底元素;(2) 依次读入表达式中的每个字符,如是操作数就进入 pDStack 栈,如是运算符就和pOStack 栈的栈定运算符比较优先权后作相应操作,直到整个表达式求值完毕 即pOStack 栈的栈定元素和当前读入的字符均为“=” 。可编辑资料 - - - 欢迎下载精品名师归纳总结三、 算法的流程图本程序的流程如下附图 1 所示:附图 1 程序流程图四、 算法设计分析第一创建了两个栈:typedef struct OPStack /定义运算符栈char opStack; int top;OPStack,
4、*pOPStack;typedef struct DATAStack /定义运算数栈double stack; int top;DATAStack, *pDATAStack;来分别存放运算符和运算数。在两个结构体中均有一个 top 数据域,当 top=-1时,表示该站为空栈。定义一个 Evaluateexpression_r函数来完成函数运算的主要功能:读入表达式,并运算结果。以下是对该函数的分析:当一次运算开头时, 分别调用 InitpOPStackpOPStack&pOStack 函数和 InitpDATAStackpDATAStack &pDStack可编辑资料 - - - 欢迎下载精品
5、名师归纳总结函 数 分 别 对 运 算 符 栈 和 运 算 数 栈 进 行 初 始 化 。 调 用PushOPStackpOStack, =函数来完成运算符栈栈低元素 的设置。通过 PushOPStackpOPStack &pOStack, char ch 函数、PopOPStackpOPStack &pOStack, char &ch函数、PushDATAStackpDATAStack &pDStack, double d函数和 PopDATAStackpDATAStack &pDStack, double &d函数来 分 别 完 成 运 算 符 和 运 输 数 的 进 出 栈 操 作 。g
6、etToppOPStackpOPStack&pOStack函数和getToppDATAStackpDATAStack &pDStack函数主要是进行得到栈定元素的作用,特殊是在对运算符栈优先级的比较中非常重要,其中仍会调用IsOPchar &ch函数来区分读入的是运算符仍是运算数。ChangeCharchar &c函数当每次读入一个字符是都会调用一次,主要的作用就是完成不用区分A、S 的大小的功能。Precedechar op1, char op2函数主要是通过一个二维字符串数组来存放9 种运算符的优先级比较的结果,每当读到一个运算符后就进行与运算符栈顶元素比较,通过返回 的“、 =”结果来进
7、行下一步的操作:表示运算符和运算数 各 退 栈 一 次 并 调 用 Operatedoublea,chartheta, double b函数 主要是对出栈的运算符和运算数进行运算 ,可编辑资料 - - - 欢迎下载精品名师归纳总结最终将运算结果压入运算数栈pDStack 。当操作终止时运算数栈的栈顶元素就是运算结果,分别 调 用 ClearpOPStackpOStack函 数 清 空 运 算 符 栈 、ClearpDATAStackpDStack函数清空运算数栈以待下一次连续进行相关操作。print_user函数和 exit_E函数开头和终止时个调用一次,分别完成欢迎界面和退出界面的布置。ma
8、in 是本程序的主函数,主要通过while语句和 switch语句来完成本程序的运行, 当输入 Yy 时调用 Evaluateexpression_r函数完成运算,当输入Nn 时,调用exit_E函数退出本程序的运行。本程序仍考虑到各种反常的处理,如运算时除数为0、被开方数为 0 等情形的显现,最终的处理是直接退出程序的运行。五、 运行结果分析1. 程序开头界面,如附图2: 附图 2 开头界面2. 如下附图 3,附图 4 分别是挑选进入和退出程序界面:附图 3 在以下界面输入运算式即可运行出运算结果如附图 5附图 4 退出界面附图 5 运行界面可编辑资料 - - - 欢迎下载精品名师归纳总结2
9、. 对反常的处理a) 对反常 1 除数为 0,如输入“ 1+2/0= ”程序将直接退出,如附图 6:附图 6 反常 1 除数为 0b) 对反常 2 被开方数为负数,如输入“3+S-9= ”程序将直接退出,如附图7:附图 7 反常 2 被开方数为负数3. 以下是对各种简洁运算的运行结果,如附图8: 附图 8 简洁运算3.综合运算:如式子“ 1/2+A7-8-S9*8=”运行结果如附图 9附图 9 综合运算六、 收成及体会本程序以C 语言的栈的相关学问为基础,通过掌握两个栈 运算数栈和运算符栈 的进出的栈操作,来实现对包含加、减、乘、除、括号运算符及SQRT和 ABS函数的任意整型表达式的求解运算
10、。从程序的编写来看,感觉这次自己真的学到了好多, 特殊是对程序的开发流程。从最初的选定程序,到最终的程序运行胜利,让我感到假如是仅仅把握课本上的学问是远远不能够很好的应用到实际的编程中去的。在这个过程中仍需要我们更多的去考虑到实际条件的种种限制和约束。可编辑资料 - - - 欢迎下载精品名师归纳总结我在写本程序的过程中也遇到了许多的问题,当然本 程序的核心问题就是对两个栈的压出栈操作,需要做优先级 判定,并要考虑什么时候进栈,什么时候出栈等操作。我采 用了课本上第 52-54 页讲的通过一个二维字符串数组来掌握比较“ +-* 、AS= ”共 9 个运算符的优先级掌握。对反常, 如除数为 0、被
11、开方数小于 0 等反常也进行了细心的处理。对操作过程中要用到的Y、N、A、S 等字符也进行了改进, 最终本程序可以不区分大小写就完成相关操作。总之,经过本次专业课程设计,让我把握了开发应用 软件的基本流程,运用所学编程技能的基本技巧,也让我初 步明白了软件设计的基本方法,提高进行工程设计的基本技 能及分析、解决实际问题的才能,为以后毕业设计和工程实 践等打下良好的基础。信任通过这次的课程设计,我对所学 的数据结构 C 语言版 和各种编程语言都有了一个全新的熟悉。我也会积极吸取本次课程设计的体会,连续讨论数 据结构和所学的各种编程语言。七、 源代码# include # include # in
12、clude # include# define MAX_OPERATOR_NUM 100 / 运算符栈数组长可编辑资料 - - - 欢迎下载精品名师归纳总结度# define MAX_DATA_NUM 100 /运算数栈数组长度typedef struct OPStack /定义运算符栈char opStack; int top;OPStack, *pOPStack;typedef struct DATAStack /定义运算数栈double stack; int top;DATAStack, *pDATAStack;void InitpOPStackpOPStack &pOStack /初始
13、化运算符栈if.pOStack=pOPStackmallocsizeofOPStack /为运算符栈安排空间printf安排内存空间失败 . ; exit-1;可编辑资料 - - - 欢迎下载精品名师归纳总结pOStack-top = -1;void InitpDATAStackpDATAStack &pDStack /初始化运算数栈if.pDStack=pDATAStackmallocsizeofDATAStack /为运算数栈安排空间printf安排内存空间失败 . ; exit-1;pDStack-top = -1;void PushOPStackpOPStack &pOStack, c
14、har ch /运算符进栈pOStack-opStack = ch;void PopOPStackpOPStack &pOStack, char &ch /运算符出栈可编辑资料 - - - 欢迎下载精品名师归纳总结ch = pOStack-opStack; pOStack-top-;voidPushDATAStackpDATAStack &pDStack,doubled/ 运算数进栈+pDStack-top; pDStack-stack = d;voidPopDATAStackpDATAStack &pDStack, double&d/ 运算数出栈d = pDStack-stack; pDSt
15、ack-top-;void ClearpOPStackpOPStack &pOStack /清空运算符栈pOStack-top = -1;void ClearpDATAStackpDATAStack &pDStack /清空运算数栈可编辑资料 - - - 欢迎下载精品名师归纳总结pDStack-top = -1;char GetToppOPStackpOPStack &pOStack /猎取运算符栈顶元素return pOStack-opStack;double GetToppDATAStackpDATAStack &pDStack /猎取运算数栈顶元素return pDStack-stack
16、;bool IsOPchar &ch /区分 运算符和 运算数 的函数,是运算符时返回true,否就返回 false /判定是否为符号if ch = + | ch = - | ch = * |ch= /|ch= =|ch= A|ch= S| ch = a | ch = s | ch = | ch = return true;else可编辑资料 - - - 欢迎下载精品名师归纳总结return false;char Precedechar op1, char op2 /参考数据结构 C 语言版 第 53 页 表达式求值 表char tab; /定义字符串的二维数组来存放运算符优先级的关系strc
17、py tab, ;strcpy tab, ;strcpy tab, ;strcpy tab, ;strcpy tab, strcpy tab, E ; strcpy tab, ;strcpy tab, ;strcpy tab, printf | *欢迎您的下次使用. 感谢.* | ; /退出访用printf| ;doubleOperatedoublea, chartheta,double b /对出栈的运算符和运算数进行运算可编辑资料 - - - 欢迎下载精品名师归纳总结double s; switchthetacase +:s = a + b; break; case -:s = a - b
18、; break; case *:s = a * b; break; case /:if b .= 0 /判定除数是否为 0,如为 0,退出程序s = a/b; break;else可编辑资料 - - - 欢迎下载精品名师归纳总结;程序printf# 除数为 0,非法运算。程序终止 . #exit_E; /打印终止菜单exit-1;case A:s = fabsb; /调用 FABS函数break;case S:if b = 0 /判定被开方数是否为0,如为 0,退出s = sqrtb; /调用 SQRT函数break;elseprintf #求负数的平方根是非法运算。程序终可编辑资料 - -
19、- 欢迎下载精品名师归纳总结止. # ;exit_E; /打印终止菜单exit-1;可编辑资料 - - - 欢迎下载精品名师归纳总结return s;char ChangeCharchar &c /通过 ChangeChar 函数来把 a、s 的小写字母改为大写的if c = a c = A;else if c = s c = S;return c;/ 参考数据结构 C 语言版 第 53 页 表达式求值算法 Evaluateexpression_r函数void Evaluateexpression_r /运算函数:读入表达式,并运算结果pOPStack pOStack; /声明运算符栈pDAT
20、AStack pDStack; /声明运算数栈double result; /存运算的结果char x, theta, c; /c存放读取的字符 ,x 、theta存放运算符栈的栈顶元素可编辑资料 - - - 欢迎下载精品名师归纳总结int flag, data; /标识符,用来读入连续的数字double s;double getd; /存放 GetTop* 的结果double a, b, cc; /a,b存放数据栈出栈的栈顶元素, c 存放运算结果flag = 0; /初始化标识符,用来判定字符串中的连续数字data = 0; /InitpOPStackpOStack; /初始化运算符栈In
21、itpDATAStackpDStack; /初始化运算数栈PushOPStackpOStack, =; /在运算符栈底放入可编辑资料 - - - 欢迎下载精品名师归纳总结=printf &请输入表达式以 =终止: ; c = get; /读入字符ChangeCharc;/ 通过调用函数来实现把小写的a、s可编辑资料 - - - 欢迎下载精品名师归纳总结改为大写的 A、Swhilec .= =|GetToppOPStackpOStack.= =if .IsOPc /不是运算符进栈s = c - 0; /把字符转化为数字if flag = 1 可编辑资料 - - - 欢迎下载精品名师归纳总结Pop
22、DATAStackpDStack, getd; s = getd*10 + s;PushDATAStackpDStack, s; flag = 1;c = get; ChangeCharc;elseflag = 0;switchPrecedeGetToppOPStackpOStack,c /输入元素和运算符栈顶元素比较case PushOPStackpOStack, c; c = get;ChangeCharc;break;case =: /托括号并接受下一个字符PopOPStackpOStack, x; c = get;可编辑资料 - - - 欢迎下载精品名师归纳总结ChangeCharc;
23、 break;case : /退栈并将运算结果进栈PopOPStackpOStack, theta; PopDATAStackpDStack, b; PopDATAStackpDStack, a; cc = Operatea, theta, b; PushDATAStackpDStack, cc; break;/switch/else/whileresult = GetToppDATAStackpDStack; /运算终止时,运算数栈的栈底元素就是运算结果ClearpOPStackpOStack; /清空运算符栈ClearpDATAStackpDStack; /清空运算数栈printf -运算
24、结果为: %.2f , result; /输出运算结果return ;void print_user /欢迎界面可编辑资料 - - - 欢迎下载精品名师归纳总结printf欢迎使用 C语言版模拟运算器 ;printf* ;printf| ;printf |模拟运算器使用说明| ; printf |作者:谢先斌 | ;printf |本程序包括对 +、-、*、/、的运算 | ;printf |本程序中ABS 算用 A 替代、 SQRT运算用 S 代替 | ;printf |本程序中的一切字母均不区分大小写|可编辑资料 - - - 欢迎下载精品名师归纳总结;printf正确的表达式如: 1+A7-
25、8+S9*8= ; printf |输入 = 表示表达式输入终止 . | ;printf |欢迎使用 .- | ;可编辑资料 - - - 欢迎下载精品名师归纳总结printf| ;可编辑资料 - - - 欢迎下载精品名师归纳总结printf* ;int main /主函数char in;bool b; /标识符,用来标识是否终止程序b = true; /初始化,不终止 print_user; /打印欢迎界面printf *请确认使用运算器 Y/N:; while1scanf%c, ∈ /确认是否连续操作get; /吃掉会车,防止干扰switchincase Y:case y:Evaluateexpression_r; /进入运算函数:读入表达式,并运算结果break;可编辑资料 - - - 欢迎下载精品名师归纳总结case N:case n:exit_E; b = false; break;/default:/ printf *输入错误,请重新输入Y/N:;/ break;ifb=false /假如 b=false ,退出整个程序break;printf *您确定要连续使用运算机Y/N:;get; /用 getchar吃掉回车,防止对后续输入中in的干扰return 0;可编辑资料 - - - 欢迎下载
限制150内