




已阅读5页,还剩16页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
本科实验报告实验名称: 计算器 课程名称:数据结构实验时间:任课教师:实验地点:良乡机房实验教师:实验类型: 原理验证 综合设计 自主创新学生姓名:学号/班级:组 号:学 院:同组搭档:专 业:成 绩:一、 实验目的1、熟悉VC环境,学习使用C语言实现链表的存储结构。 2、通过编程、上机调试,进一步理解线性表、链表、栈的基本概念,并了解进栈,退栈和运用栈的思想解决问题的能力。3、锻炼动手编程,独立思考的能力。二、实验题目简易计算器(栈)(1)问题描述通过模拟一个简单的计算器来进行+、-、*、/、%、(乘方)等运算,从键盘上输入一算术表达式(一般为中缀表达式),计算出表达式的值。(2)基本要求编写程序,要求可对一实数算术表达式进行简单的数学运算。可以识别带加减乘除等运算符及括号的中缀表达式。a. 按照四则运算规则,求表达式的值。一般规则如下:1)先括号内,再括号外。2)先乘方,再乘除,后加减。b. 同级运算从左到右顺序执行。c如表达式有误,应给出相应的提示信息。(3)数据结构与算法分析解决表达式求值问题的方法之一是:第一步将中缀表达式转换为后缀表达式,第二步按后缀表达式求值。解题时可以结合字符串的相关知识。(4)测试 4.5+5+6.5*1.06=16.39三、实验基础知识 线性表、链表、栈的基本概念的熟练掌握并实际运用。并了解进栈,退栈和运用栈的思想解决问题的能力四、实验设计方法1、概要设计 InitStack(OPTR); Push(OPTR,#);initStack(OPND); c=getchar();while(c!=#|GetTop(OPTR)!=#)if(!In(c,OP)Push(OPND,c);c=getchar(); /不是运算符则进栈 else switch(Precede(GetTop(OPTR),c) case : /退栈并将运算结果入栈 Pop(OPTR,theta); Pop(OPND,b); Pop(OPND,a); Push(OPND, Operate(a,theta,b); break; /switch/return GetTop(OPND);4.详细设计:(1) 栈的建立#define STACK_INIT_SIZE100#defineSTACKINCREMENT10#defineTempLen20#define ERROR0#define OK1#define TRUE 1#define FALSE0#include#include#includetypedef intcount;typedef double opndElem;typedef char optrElem;typedef struct/运算符栈optrElem *base;optrElem *top;int stacksize;SqStack_OPTR;typedef struct/运算数栈opndElem *base;opndElem *top;int stacksize;SqStack_OPND;建立头文件,建立算数栈和算符栈,可以考虑使用算符优先算法来实现运算。(2) 主函数main()SqStack_OPTR A;SqStack_OPND B;InitStack_OPTR(A);InitStack_OPND(B);Push_OPTR(A,=);printf(* n);printf(n);printf( 简易计算器 n);printf(n);printf(*n);printf(nn请输入算式,以=结束:n);Output(A,B);if(error=0)printf(%lfn,B.base0);return OK;进行表达式的输入,输出菜单页面给予使用方法的提示,调用子函数并用判断变量error完成计算,输出结果。(3) 判断优先级子函数char Precede(optrElem a,optrElem b)/判断a和b优先级的高低,返回,=switch(a) case +: switch(b) case *: case /: case (: case : case %: return ; break; break; case -: switch(b) case *: case /: case (:case : case %: return ; break; break; case *: switch(b) case (: case : case %: return ; break; break; case /: switch(b) case (: case : case %: return ; break; break; case (: switch(b) case ): return =; break; default: return ; break; break; case =: switch(b) case =: return =; break; default: return ; break; break; case : switch(b) case (: return ; break;break;case %: switch(b) case (: case : return ; break;break; default: return ; break;调用switch语句进行运算优先级的判断,从而确定运算顺序。(4) 运算子函数double Operate(opndElem a,optrElem theta,opndElem b)/对操作数a,b进行theta运算 double rs_i; switch(theta) case +: rs_i=a+b; break; case -: rs_i=a-b; break; case *: rs_i=a*b; break; case /: if(b=0) printf(错误!除数为0!n); error=1; exit(0); rs_i=a/b; break; case :rs_i=pow(a,b);break;case %:if(a != (int)a|b!=(int)b)printf(错误!取余为整数!n);error=1;rs_i=(int)a%(int)b; break; default: printf(Is not a operator.n); break; return rs_i; 运用switch语句进行运算符的分类,case语句中包含运算符的运算规律,方便函数调用。(3)、模块调用关系: 由主函数模块调用创建模块,查找模块与计算模块。 由计算模块将结果输出。五、实验结果及数据分析1、4.5+5+6.5*1.06=16.39数据完全正确2、次方运算2.132=4.5369数据完全正确3、混合运算2+(2.5+2.32)*3-5=20.37结果完全正确六、总结 此次编程实验,让我了解到全面思考的重要性,再开始的程序设计中,我只考虑了加减乘除和括号这几种最简单的四则运算,但是没有考虑小数,平方等较为复杂的计算,在花费了大量时间将先前考虑的四则运算编写完成并调试通过后,发现计算器的应用范围非常小,不实用,于是重新大量改写代码,又花费了大量时间。倘若在刚开始就考虑到这些问题,就省去了后来改代码的这一步繁琐的操作,节省大量时间。以后要多加注意。七、附录 程序清单#define STACK_INIT_SIZE100#defineSTACKINCREMENT10#defineTempLen20#define ERROR0#define OK1#define TRUE 1#define FALSE0#include#include#includetypedef intcount;typedef double opndElem;typedef char optrElem;typedef struct/运算符栈optrElem *base;optrElem *top;int stacksize;SqStack_OPTR;typedef struct/运算数栈opndElem *base;opndElem *top;int stacksize;SqStack_OPND;int error=0;int InitStack_OPTR(SqStack_OPTR &S)/初始化运算符空栈S.base=(optrElem*)malloc(STACK_INIT_SIZE*sizeof(optrElem);if(!S.base) exit(-1);S.top=S.base;S.stacksize=STACK_INIT_SIZE;return OK;int InitStack_OPND(SqStack_OPND &S)/初始化运算数空栈S.base=(opndElem*)malloc(STACK_INIT_SIZE*sizeof(opndElem);if(!S.base) exit(-1);S.top=S.base;S.stacksize=STACK_INIT_SIZE;return OK;int Push_OPTR(SqStack_OPTR &S,optrElem e)/插入运算符元素e至运算符栈顶if(S.top-S.base=S.stacksize)S.base=(optrElem*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(optrElem);if(!S.base) exit(-1);S.top=S.base+S.stacksize;S.stacksize+=STACKINCREMENT;*S.top+=e;return OK;int Push_OPND(SqStack_OPND &S,opndElem e)/插入运算数元素e至栈顶 if(S.top-S.base=S.stacksize)S.base=(opndElem*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(opndElem);if(!S.base) exit(-1);S.top=S.base+S.stacksize;S.stacksize+=STACKINCREMENT;*S.top+=e;return OK;int Pop_OPTR(SqStack_OPTR &S,optrElem &e)/删除运算符栈顶元素,返回其值 if(S.top=S.base) return ERROR;e=*-S.top;return OK;int Pop_OPND(SqStack_OPND &S,opndElem &e)/删除运算数栈顶元素,返回其值 if(S.top=S.base) return ERROR;e=*-S.top;return OK;char GetTop_OPTR(SqStack_OPTR &S)/取栈运算符顶元素 if(S.top=S.base) return ERROR;return *(S.top-1);char GetTop_OPND(SqStack_OPND &S)/取栈运算数顶元素 if(S.top=S.base) return ERROR;return *(S.top-1);int Isoperator(optrElem e)/判断e是否是一个运算操作符 switch(e)case +: case -: case *: case /: case (: case ): case =:case :case %: return TRUE; break; default: return FALSE; break;char Precede(optrElem a,optrElem b)/判断a和b优先级的高低,返回,=switch(a) case +: switch(b) case *: case /: case (: case : case %: return ; break; break; case -: switch(b) case *: case /: case (:case : case %: return ; break; break; case *: switch(b) case (: case : case %: return ; break; break; case /: switch(b) case (: case : case %: return ; break; break; case (: switch(b) case ): return =; break; default: return ; break; break; case =: switch(b) case =: return =; break; default: return ; break; break; case : switch(b) case (: return ; break;break;case %: switch(b) case (: case : return ; break;break; default: return ; break;double Operate(opndElem a,optrElem theta,opndElem b)/对操作数a,b进行theta运算 double rs_i; switch(theta) case +: rs_i=a+b; break; case -: rs_i=a-b; break; case *: rs_i=a*b; break; case /: if(b=0) printf(错误!除数为0!n); error=1; exit(0); rs_i=a/b; break; case :rs_i=pow(a,b);break;case %:if(a != (int)a|b!=(int)b)printf(错误!取余为整数!n);error=1;rs_i=(int)a%(int)b; break; default: printf(Is not a operator.n); break; return rs_i; int
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年北京专升本测试题及答案
- 合肥市H小学流动儿童家校合作:困境剖析与突破路径
- 合建式奥贝尔氧化沟工艺:低成本与高脱氮除磷的协同探索
- 合募配穴针法对改善应激性胃溃疡胃电的实验探究
- 2026届高考政治一轮复习统编版选必一 9.2 中国与新兴国际组织 课件
- 甘肃省张掖市甘州区2024-2025学年七年级下学期第一次月考历史试题及答案
- 2025年教师招聘之《小学教师招聘》考前冲刺测试卷包(轻巧夺冠)附答案详解
- 2025年教师招聘之《幼儿教师招聘》模拟考试题库B卷带答案详解(达标题)
- 教师招聘之《小学教师招聘》题库(得分题)打印含完整答案详解【各地真题】
- 教师招聘之《小学教师招聘》通关模拟卷及参考答案详解【预热题】
- 水库除险加固及主体工程投入使用验收鉴定书
- 《铸牢中华民族共同体意识》课件
- 教科版四年级科学上册全册教学设计(表格式)
- 义乌市建筑工程质量通病防治措施100条(2022版本)
- 动静脉内瘘的物理学检查
- JTG-T5521-2019公路沥青路面再生技术规范
- XX集团落实子企业董事会职权工作方案
- 【培训课件】商务礼仪培训教材(非常全面系统)
- 防性防侵害安全教育幼儿园
- 途虎服务流程
- 中小学人工智能教育的教师专业发展与学科知识素养的提升
评论
0/150
提交评论