《简单计算器程序设计.doc》由会员分享,可在线阅读,更多相关《简单计算器程序设计.doc(7页珍藏版)》请在三一办公上搜索。
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(&Op
11、ndStack,Pop1(&OptrStack);Pop1(&OptrStack);k+;ch=strk;while(!StackEmpty1(&OptrStack)Evaluate(&OpndStack,Pop1(&OptrStack);opnd=Pop(&OpndStack);cout你输入表达式的计算结果为endl;printf(%-6.2fn,opnd);FreeStack(&OpndStack);FreeStack1(&OptrStack);void main()cout请输入你要计算的表达式,并以“=”号结束。endl;char str50;gets(str);Infix(str);getchar();6.实验结果