简单计算器程序设计_第1页
简单计算器程序设计_第2页
简单计算器程序设计_第3页
简单计算器程序设计_第4页
简单计算器程序设计_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、课程名称 编译原理 实验名称 简单计算器程序设计 姓 名 学 号 专业班级 实验日期 成 绩 指导老师 (实验目的实验原理主要仪器设备实验内容与步骤实验数据记录与处理实验结果分析问题建议)1.实验目的(1)加深对语法及语义分析原理的理解,并实现对命令语句的灵活应用;(2)熟悉 microsoft visual c+6.0 的运行环境。(3)通过此次实验熟悉自己的编程能力。2.实验要求所做出的计算器代码不仅能够实验简单的加减乘除运算,而且还必须能够实现对表达式的操作。3.实验环境本次实验在vc6.0环境下编译通过。4.设计思想和原理(1)定义部分:定义常量、变量、数据结构;(2)初始化:设立lr

2、(1)分析表、初始化变量空间(包括堆栈、结构体、数组、临时变量等);(3)控制部分:从键盘输入一个表达式符号串; (4)利用 lr(1)分析算法进行表达式处理:根据 ll(1)分析表对表达式符号串进行堆栈(或 其他)操作,输出分析结果,如果遇到错误则显示错误信息.5.程序源代码#include#include#include#include#includetypedef float datatype;typedef structdatatype *data;int max;int top;stack;void setstack(stack *s,int n)s-data=(datatype*)

3、malloc(n*sizeof(datatype);if(s-data=null)printf(overflow);exit(1);s-max=n;s-top=-1;void freestack(stack *s)free(s-data);int stackempty(stack *s)if(s-top=-1)return(1);return(0);datatype peek(stack *s)if(s-top=s-max-1)printf(stack is empty!n);exit(1);return(s-datas-top);void push(stack *s,datatype ite

4、m)if(s-top=s-max-1)printf(stack is full!n);exit(1);s-top+;s-datas-top=item;datatype pop(stack *s)if(s-top=-1)printf(pop an empty stack!n);exit(1);s-top-;return(s-datas-top+1);typedef structchar op;int inputprecedence;int stackprecedence;datatype1;typedef structdatatype1 *data;int max;int top;stack1;

5、void setstack1(stack1 *s,int n)s-data=(datatype1*)malloc(n*sizeof(datatype1);if(s-data=null)printf(overflow);exit(1);s-max=n;s-top=-1;void freestack1(stack1 *s)free(s-data);int stackempty1(stack1 *s)if(s-top=-1)return(1);return(0);datatype1 peek1(stack1 *s)if(s-top=s-max-1)printf(stack1 is empty!n);

6、exit(1);return(s-datas-top);void push1(stack1 *s,datatype1 item)if(s-top=s-max-1)printf(stack is full!n);exit(1);s-top+;s-datas-top=item;datatype1 pop1(stack1 *s)if(s-top=-1)printf(pop an empty stack!n);exit(1);s-top-;return(s-datas-top+1);datatype1 mathoptr(char ch)datatype1 optr;optr.op=ch;switch(

7、optr.op)case+:case-:optr.inputprecedence=1;optr.stackprecedence=1;break;case*:case/:optr.inputprecedence=2;optr.stackprecedence=2;break;case(:optr.inputprecedence=3;optr.stackprecedence=-1;break;case):optr.inputprecedence=0;optr.stackprecedence=0;break;return(optr);void evaluate(stack *opndstack,dat

8、atype1 optr)datatype opnd1,opnd2;opnd1=pop(opndstack);opnd2=pop(opndstack);switch(optr.op)case+:push(opndstack,opnd2+opnd1);break;case-:push(opndstack,opnd2-opnd1);break;case*:push(opndstack,opnd2*opnd1);break;case/:push(opndstack,opnd2/opnd1);break;int isoptr(char ch)if(ch=+|ch=-|ch=*|ch=/|ch=()ret

9、urn(1);return(0);void infix(char *str)int i,k,n=strlen(str);char ch,numstr10;datatype opnd;datatype1 optr;stack opndstack;stack1 optrstack;setstack(&opndstack,n);setstack1(&optrstack,n);k=0;ch=strk;while(ch!=)if(isdigit(ch)|ch=.)for(i=0;isdigit(ch)|ch=.;i+)numstri=ch;k+;ch=strk;numstri=0;opnd= atof(

10、numstr);push(&opndstack,opnd);elseif(isoptr(ch)optr=mathoptr(ch);while(peek1(&optrstack).stackprecedence=optr.inputprecedence)evaluate(&opndstack,pop1(&optrstack);push1(&optrstack,optr);k+;ch=strk;else if(ch=)optr=mathoptr(ch);while(peek1(&optrstack).stackprecedence=optr.inputprecedence)evaluate(&opndstack,pop1(&optrstack);pop1(&optrstack);k+;ch=strk;while(!stackempty1(&optrstack)evaluate(&opndstack,pop1(&optrstack);opnd=pop(&opndstack);cout你输入表达式的

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论