数据结构课程设计_实验报告(一)表达式求值(计算器)

合集下载

数据结构计算器(包括中缀转换后缀)课程设计报告

数据结构计算器(包括中缀转换后缀)课程设计报告

课程设计报告题目:计算表达式的值1.问题描述对于给定的一个表达式,表达式中可以包括常数、算术运行符(“+”、“-”、“*”、“/”)和括号,编写程序计算表达式的值。

基本要求:从键盘输入一个正确的中缀表达式,将中缀表达式转换为对应的后缀表达式,并计算后缀表达式的值。

对于表达式中的简单错误,能够给出提示,并给出错误信息;表达式中可以包括单个字母表示的变量。

测试数据:任意选取一个符合题目要求的表达式。

提高要求:(1)能够处理多种操作符。

(2)实现包含简单运算的计算器。

(3)实现一个包含简单运算和函数运算的计算器。

2.需求分析(1)软件的基本功能本软件实在win32工程下实现的带有界面和图标的功能较为齐全的计算器。

此计算器分三个方面进行计算,分别为数值表达式的计算,字母表达式的计算和函数计算。

可由键盘或用鼠标点击按键输入带有数字或字母的中缀表达式,程序可以将输入的带有数字或字母的中缀表达式转换成对应的后缀表达式,并计算只含有数字的后缀表达式的值。

本软件支持含小数、多位数等多种操作数的处理,可以计算含加、减、乘、除、百分号、求余、求幂,求阶乘,求三角函数的值等多种运算符和函数的表达式(2)输入/输出形式用户可通过打开图标弹出来的计算器界面任意点击操作。

对于在输入时发生的简单错误,软件通过弹出对话框给出提示并且在提示错误的同时自动将用户的出错输入略去转化成正确的表达式进行计算,用户也可选择清楚操作然后重新输入a.对于数值和函数表达式软件会输出其表达式的后缀表达式和计算结果并保留六位小数;b.对于字母表达式因字母无法进行数值运算,软件仅输出其后缀表达式的值;清楚按钮可以清楚有已经输入或输出的数据从头计算;软件窗口可实现最小化。

并且输入编辑框可进行修改,复制,粘贴等操作,但后缀表达式和求值结果的编辑框中的内容不可修改,只能执行复制操作。

(3)测试数据要求用户可以输入一个符合要求的中缀表达式,也可以输入一个包含简单错误的表达式。

数据结构课程设计算术表达式求值-计算器(Word)

数据结构课程设计算术表达式求值-计算器(Word)

高级语言程序设计《算术表达式求值》课程设计报告算术表达式求值系统可以实现实现对算术四则混合运算表达式求值,并打印求值过程中运算符栈、操作数栈的变化过程。

第二章系统分析开始运行时界面如下:你可以输入一个表达式,按E对其进行求值。

#include <stdio.h>#include <conio.h>#include <stdlib.h>#include <string.h>#define N 100double numStack[N]={0};//操作数栈int numTop;char opStack[N];//运算符栈int opTop;void print_num(double str1[],int n) {int i;printf("\n操作数栈:\n");for(i=0;i<n;i++)printf("%g ",str1[i]);}void print_op(char str2[],int m) {int j;printf("\n运算符栈:\n");for(j=0;j<m;j++)printf("%c ",str2[j]);}int op(char ch)//判断运算符优先级{if(ch=='+'||ch=='-') return 2;if(ch=='*'||ch=='/') return 3;if(ch=='(') return -1;return 0;}double result(double num1,char op,double num2)//计算{if(op=='+') return num1+num2;if(op=='-') return num1-num2;if(op=='*') return num1*num2;if(op=='/') return num1/num2;return 0;}int compute(char str[]){double num=0;int i=0,j=1,k=1;numTop=opTop=0;while(str[i]!='\0'||opTop>0){if(str[i]>='0'&&str[i]<='9')num=num*10+str[i]-'0';else if( k==1&&str[i]=='-'&&(i==0||op(str[i-1])) )k=-1;else{if(i>0&&!op(str[i-1])&&str[i]!='('&&str[i-1]!=')') {numStack[numTop++]=num*k;if(opTop!=0&&numTop!=0)print_num(numStack,numTop);num=0; j=1; k=1;}if(opTop==0||str[i]=='('){opStack[opTop++]=str[i];print_op(opStack,opTop);}else if(str[i]==')'){while(opTop>0&&opStack[--opTop]!='('){numStack[numTop-2]=result(numStack[numTop-2],opStack[opTop],numStack[numTop-1]);if(opTop!=0&&numTop!=0){print_num(numStack,numTop);print_op(opStack,opTop);}numTop--;}if(opStack[opTop]!='(') return 0;}else{if(str[i]=='\0'&&numTop==0) return 0;while(opTop>0&&op(str[i])<=op(opStack[opTop-1])){numStack[numTop-2]=result(numStack[numTop-2],opStack[--opTop],numStack[numTop-1]);if(opTop!=0&&numTop!=0){print_num(numStack,numTop-1); print_op(opStack,opTop);}numTop--;}if(str[i]!='\0')opStack[opTop++]=str[i];if(opTop!=0&&numTop!=0)print_op(opStack,opTop);}}if(str[i]!='\0')i++;}if(numTop!=1||opTop!=0)return 0;return 1;}void menu(){system("cls");printf("_______________________________\n");printf(" Clear(C) | Equal(E) | Quit(Q) \n");printf("-------------------------------\n");}int main(void){int i=0,j=0,k;char str[N]="\0";char num[N]="\0";char save[N]="\0";char ch;double temp;unsigned long temp2;menu();printf("input an expression,press key 'E' to compute\n");ch=getch();while( 1 ){if(ch==')'||op(ch)||ch>='0'&&ch<='9'){str[i++]=ch;str[i]='\0';menu();printf("input an expression,press key 'E' to compute\n"); printf("%s",str);if( ch=='-'&&(i==1||op(str[i-2]))||ch>='0'&&ch<='9' ){num[j++]=ch;num[j]='\0';}elsej=0;}if(ch=='C'||ch=='c'){if(strlen(str))str[--i]='\0';menu();printf("input an expression,press key 'E' to compute\n");printf("%s",str);}if(ch=='E'||ch=='e'){if(compute(str)){printf("\n=%g\n",numStack[0]); j=0; temp=numStack[0];if(temp<0){temp=-temp;num[j++]='-';num[j]='\0';}temp2=(unsigned long)temp;k=1;while(temp2/k>=10) k*=10;while(k){num[j++]=temp2/k+'0';num[j]='\0';temp2=temp2%k;k/=10;}temp=temp-(int)temp;if(temp!=0){num[j++]='.';num[j]='\0';temp+=0.0000005;}for(k=6;k>0;k--){if(temp==0) break;temp*=10;num[j++]=(int)temp+'0';num[j]='\0';temp=temp-(int)temp;}}i=0; j=0; str[0]='\0';}if(ch=='Q'||ch=='q'){printf("\nare you sure to quit?(Y/N)\n");ch=getch();if(ch=='Y'||ch=='y') break;else{menu();printf("input an expression,press key 'E' to compute\n");printf("%s",str);}}ch=getch();}return 0;}第五章系统测试1.先输入: 3+2*5 后按E求值2.再输入:12/4-5 后按E求值3.再输入Q4.输入Y,退出系统。

数据结构课程设计-实验报告(一)表达式求值(计算器)

数据结构课程设计-实验报告(一)表达式求值(计算器)

数据结构课程设计实验报告(一)表达式求值(计算器)数据结构课程设计实验报告起止时间:2015.12.28-2015.12.311、输入:tan452、输出:13、执行结果::设计过程中遇到的问题及解决办法:问题:算数表达式以字符串输入,操作数和操作符的提取;解决办法:两两操作符之间如有数字将中间的数字提取强制转换成double型;参考文献:(在设计中参考的书籍、网站等资料)1. 朱振元,《数据结构——C++语言描述》,清华大学出版社,2008年,页码:2./doc/76dd2d95ec630b1c59eef8c75fbfc77da26997be.htm l /detail/gszhouyi/738777指导老师评议:成绩评定:指导教师签名:附件:(程序源代码)#include#include#include#include#define N 100#define pai 3.1415926typedef struct yxj{char operat;int rank;}yxj;typedef struct strchar data[N];}zs;void sjhs(void){char s[10],a[10];double y,x;printf("请输入(sin cos tan 角度制)表达式:\n"); scanf("%s",s);if(strstr(s,"sin")!=0){int i=0,j=0;while(s[i]!='\0'){if(s[i]>='0'&&s[i]s[j++]=s[i];i++;}s[j]='\0';x=atof(s);y=sin(x*pai/180);}else if(strstr(s,"cos")!=0){int i=0,j=0;while(s[i]!='\0'){if(s[i]>='0'&&s[i]s[j++]=s[i];i++;}s[j]='\0';x=atof(s);y=cos(x*pai/180);}else if(strstr(s,"tan")!=0){int i=0,j=0;while(s[i]!='\0'){if(s[i]>='0'&&s[i]s[j++]=s[i];i++;}s[j]='\0';x=atof(s);y=tan(x*pai/180);}else{printf("格式错误\n");return;}printf("%lf\n",y);printf("*****1、继续*****\n");printf("*****0、返回上一层*****\n"); scanf("%s",a);if(strcmp(a,"0")==0)return;else if(strcmp(a,"1")==0)sjhs();elseprintf("没有该选项\n");}void szys(yxj mark[]){yxj os[N];char a[10];char ch;double ns[N];zs zhan[20];int numb[N];int Len,p=0,q=1,i,o=1,n=0;char data[N];os[0]=mark[0];ns[0]=0;printf("请输入算术(+ - * / ^)表达式(以= 结束):\n");scanf("%s",data);if(strcmp(data,"+")==0||strcmp(data,"-")==0||strcmp(data,"*")==0||str cmp(data,"/")==0 ||strcmp(data,"^")==0||strcmp(data,"=")==0){printf("格式错误\n");return;}Len=strlen(data);numb[0]=0;for(i=0;izhan[i].data[0]='\0';for(i=0;i{int t=0;if((data[i]=='^'||data[i]=='+'||data[i]=='-'||data[i]=='*'||data[i]=='/'||data[i]=='('||data[i]==')'||data[i]=='=')) {int j,k=0;if((data[i]=='='||data[i]=='^'||data[i]=='+'||data[i]=='-'||data[i]=='*'||data[i]=='/')&&(data[i-1]=='^'||data[i-1]=='+'||data[i-1]=='-'||data[i-1]=='*'||data[i-1]=='/')){printf("格式错误\n");return;}numb[q++]=i;while(zhan[(p+k)/2].data[0]!='\0'){k++;}for(j=numb[q-2];jif(data[j]>='0'&&data[j]zhan[(p+k)/2].data[t++]=data [j];zhan[(p+k)/2].data[t]='\0';if(zhan[(p+k)/2].data[0]!='\0')ns[n++]=atof(zhan[(p+k)/2].data);p++;for(j=0;jif(mark[j].operat==data[i])break;while(1){.if(mark[j].operat=='('){os[o++]=mark[j];break;}else if(mark[j].rank>os[o-1].rank&&mark[j].operat!='(') { os[o++]=mark[j];break;}else{double numb1,numb2,numb;switch(ch=os[--o].operat){case '+':{numb1=ns[--n];numb2=ns[--n];numb=numb1+numb2;ns[n++]=numb;break;}case '-':{numb1=ns[--n];numb2=ns[--n];numb=numb2-numb1;ns[n++]=numb;break;}case '*':{numb1=ns[--n];numb2=ns[--n];numb=numb2*numb1;ns[n++]=numb;break;}case '/':{numb1=ns[--n];numb2=ns[--n];if(numb1==0){printf("无效操作\n"); return;}else{numb=numb2/numb1;ns[n++]=numb;}break;}case '^':{numb1=ns[--n];numb2=ns[--n];numb=pow(numb2,numb1);ns[n++]=numb;break;}}}}}else if(data[i]>='0'&&data[i]else if(data[i]=='.'); else{printf("格式错误,请重新输入:\n");szys(mark);break;}}printf("%lf\n",ns[0]);printf("*****1、继续*****\n");printf("*****0、返回上一层*****\n");scanf("%s",&a);if(strcmp(a,"0")==0)return;else if(strcmp(a,"1")==0)szys(mark);elseprintf("没有该选项\n");}int main (){yxj mark[9];mark[0].operat='#';mark[0].rank=-1;mark[1].operat='+';mark[1].rank=1;mark[2].operat='-';mark[2].rank=1;mark[3].operat='*';mark[3].rank=2;mark[4].operat='/';mark[4].rank=2;mark[5].operat='(';mark[5].rank=-1;mark[6].operat=')';mark[6].rank=-1;mark[7].operat='=';mark[7].rank=0;mark[8].operat='^';mark[8].rank=3;while(1){char i[10];printf("*****1、四则运算计算器*****\n");printf("*****2、三角函数计算器*****\n"); printf("*****0、退出*****\n");scanf("%s",&i);if(strcmp(i,"0")==0)break;else if(strcmp(i,"1")==0)szys(mark);else if(strcmp(i,"2")==0)sjhs();elseprintf("没有该选项\n");}}-全文完-。

数据结构计算器实验报告

数据结构计算器实验报告

数据结构计算器实验报告1. 引言数据结构是计算机科学的基础,它提供了一种组织和存储数据的方式,以便能够高效地访问和操作这些数据。

计算器是一种常见的应用程序,它可以执行各种数学运算。

本实验的主要目的是设计和实现一个简单的数据结构计算器,用于实现基本的四则运算功能。

2. 设计思路在设计数据结构计算器时,我们需要考虑以下几个方面的问题:2.1 数据结构选择为了实现四则运算功能,我们首先需要选择合适的数据结构来存储和操作数学表达式。

在本实验中,我们选择使用栈作为数据结构,因为栈具有后进先出的特性,非常适合处理运算符和操作数的顺序。

2.2 表达式解析在计算器中,我们需要将用户输入的数学表达式解析成运算符和操作数,以便进行计算。

为了实现表达式解析功能,我们可以使用字符串的分割和转换操作来提取运算符和操作数,并将它们存储到栈中。

2.3 运算符优先级在进行四则运算时,运算符的优先级非常重要。

我们需要确保高优先级的运算符先于低优先级的运算符进行计算。

为了实现这一功能,我们可以使用栈来存储运算符,并在遇到运算符时进行比较和计算。

2.4 计算结果输出最后,我们需要将计算结果输出给用户。

为了实现这一功能,我们可以使用一个变量来存储计算结果,并在计算完成后将结果输出到屏幕上。

3. 实现步骤基于上述设计思路,我们可以按照以下步骤来实现数据结构计算器:3.1 定义栈数据结构首先,我们需要定义一个栈数据结构来存储运算符和操作数。

栈可以使用数组或链表来实现,具体选择取决于实际需求。

3.2 解析数学表达式接下来,我们需要编写代码来解析用户输入的数学表达式。

我们可以使用字符串的分割和转换操作来提取运算符和操作数,并将它们存储到栈中。

3.3 实现运算符优先级比较和计算在解析数学表达式的过程中,我们需要实现运算符的优先级比较和计算功能。

每当遇到一个运算符时,我们可以将其与栈顶的运算符进行比较,如果栈顶的运算符优先级较高,则可以进行相应的计算。

数据结构计算器实验报告

数据结构计算器实验报告

数据结构计算器实验报告数据结构计算器实验报告引言:数据结构是计算机科学中非常重要的一门课程,它研究了数据的组织、存储和管理方式,以及对数据进行操作和处理的算法和技术。

在本次实验中,我们设计了一个基于数据结构的计算器,旨在通过实践应用数据结构的知识,提高我们的编程能力和算法思维。

一、设计思路我们的计算器主要有两个功能:进行四则运算和进行括号匹配。

为了实现这两个功能,我们选择了栈这一数据结构。

栈是一种具有后进先出(LIFO)特点的数据结构,非常适合用来处理括号匹配和运算符的优先级。

二、括号匹配算法在进行四则运算之前,我们首先需要对输入的表达式进行括号匹配的检查。

我们使用了一个栈来实现这一功能。

算法的基本思路是,遍历表达式中的每个字符,当遇到左括号时,将其入栈;当遇到右括号时,将栈顶元素出栈,并判断出栈的元素是否与当前右括号匹配。

如果匹配,则继续遍历下一个字符;如果不匹配,则说明表达式存在括号不匹配的错误。

三、四则运算算法当表达式通过了括号匹配的检查后,我们就可以进行四则运算了。

我们使用两个栈来实现这一功能,一个栈用来存储操作数,另一个栈用来存储运算符。

算法的基本思路是,遍历表达式中的每个字符,当遇到数字时,将其入操作数栈;当遇到运算符时,将其入运算符栈,并根据运算符的优先级进行相应的操作。

四、运算符优先级为了正确计算表达式的值,我们需要定义运算符的优先级。

一般来说,乘法和除法的优先级高于加法和减法。

为了实现这一功能,我们可以使用一个优先级表来存储运算符的优先级。

在进行运算时,我们可以通过比较栈顶运算符和当前运算符的优先级来决定是否进行运算。

五、实验结果经过我们的努力,我们成功地实现了一个基于数据结构的计算器。

我们对该计算器进行了多组测试,包括括号匹配、四则运算等不同情况。

在所有的测试中,我们的计算器都能正确地输出结果,并且在处理大规模表达式时也能保持较好的性能。

六、总结与展望通过本次实验,我们深入理解了数据结构的应用和算法的设计。

数据结构表达式求值完整篇(含实验报告)

数据结构表达式求值完整篇(含实验报告)
char ch;
的是p*low),继续输入ch
总结:
我觉得写的好的地方在于定义了flag,low分别作为小数入栈和负号与减号区别的条
件。第一次写这么长的代码,还有就是将输入的字符再转到小数这段代码可以留着很有 用。开始考虑的大整数想麻烦了,直接用double难度降低了很多
4
【列岀你的测试结果,包括输入和岀。测试数据应该完整和严格,最好多于需求分析中所列。】
if(!s.base)
printf("\n运算符栈存储分配失败!\n");
s.top=s.base;
s.stacksize=MAXSIZE;
}
//
void OPND」n itStack(Sqstack_OPND &s)
{
s.base=new SElemType_OPND[MAXSIZE];
if(!s.base)
操作数和运算符分别入不同的栈charint进操作数栈先考虑了小于10的整数直接进栈重点是运算符的优先级这块函数的编写前面的都听简单的就是小数编写这块想了很久定义了low做判定符号的标志
数据结构表达式求值完整篇(含 实验报告)
1
(1)深入理解栈的特点及其描述方法
(2)能够在两种存储结构上实现栈抽象数据类型实现
&s,SElemType_OPND&e); //出栈
/*
#i nclude "common .h"
#include "Sqstack.h"
#in clude "other.h"
//
void OPTR_I ni tStack(Sqstack_OPTR &s)
{

数据结构课程设计报告

数据结构课程设计报告

《数据结构》课程设计报告算术表达式求值系统学号:姓名:班级:指导教师:成绩:完成时间:2011.01.02一、设计题目描述和要求1.问题:现在的计算器只能对简单的数进行运算,对复杂的多项表达式不能运算2.解决方案:设计一个表达式求值系统3.要求:以字符序列的形式从终端输入语法正确的、不含变量的整数表达式。

利用下表给出的算符优先关系,实现对算术四则混合运算表达式的求值。

算术四则运算的规则:a. 从左算到右b. 先乘除,后加减c. 先括号内,后括号外根据上述三条运算规则,在运算的每一步中,对任意相继出现的算符θ1和θ2 ,都要比较优先权关系,它们优先关系如下表所示。

二、系统分析与概要设计根据问题描述和要求,系统要求能够正确求出算术表达式的值。

在进行算术表达式求值过程中,考虑到我们输入的是中缀表达式,采用后缀表达式比较容易计算,因此先将中缀表达式转换成后缀表达式。

程序应该具有:“将算术表达式转化为后缀表达式”、“利用后缀表达式求值”等基本模块。

由于有优先级的问题,根据优先级不同的运算符运算的次序是不同的,因此更具其优先级的大小抽象的将其定义为不同的大小。

三、详细设计和编码1.数据类型定义表达式求值中运算符对应优先级的定义struct{ char ch;int pri;}lpri[7]={{'=',0},{'(',1},{'*',5},{'/',5},{'+',3},{'-',3},{')',6} },rpri[7]={{'=',0},{'(',6},{'*',4},{'/',4},{'+',2},{'-',2},{')',1 }}; //运算符优先级的定义运算符的存储struct{ char data[MaxSize];int top;}op; //用栈存储运算符2.各模块算法描述(1)计算栈顶运算符对应的数字(2)判断优先级(3)中缀转为后缀YNY NYNY NY NYN YN(5)主函数四、调试分析写程序容易调程序难,调试要求:不仅要有很好的阅读程序的能力,更要有理解,分析和纠错能力。

数据结构表达式求值完整篇(含实验报告)

数据结构表达式求值完整篇(含实验报告)
voidOPND_Pop(Sqstack_OPND
&s,SElemType_OPND&e); //出栈
/*
#i nclude "common .h"
#include "Sqstack.h"
#in clude "other.h"
//
void OPTR_I ni tStack(Sqstack_OPTR &s)
3前面的都听简单的,就是 小数编写这块想了很久,
定义了low做判定符号的标志。如果在运算符后输入负号则low=-1(将p入栈时入栈
的是p*low),继续输入ch
总结:
我觉得写的好的地方在于定义了flag,low分别作为小数入栈和负号与减号区别的条
件。第一次写这么长的代码,还有就是将输入的字符再转到小数这段代码可以留着很有 用。开始考虑的大整数想麻烦了,直接用double难度降低了很多
//取操作数的栈顶元素
voidOPTR_Push(Sqstack_OPTR
&s,SElemType_OPTR e);//入栈
voidOPND_Push(Sqstack_OPND
&s,SElemType_OPND e); //入栈
voidOPTR_Pop(Sqstack_OPTR
&s,SEIemType_OPTR&e); //出栈
//栈基本操作的函数声明
void OPTR_lnitStack(Sqstack_OPTR &s);
//运算符栈初始化
void OPBiblioteka D_InitStack(Sqstack_OPND &s);
//操作数栈初始化

数据结构表达式求值实验报告

数据结构表达式求值实验报告

数据结构表达式求值实验报告数据结构表达式求值实验报告⒈引言本实验旨在研究和实现数据结构中表达式求值的算法。

表达式求值是计算机科学中常见的问题,对于计算机程序的正确性和性能具有重要影响。

本报告将详细介绍实验设计、实验步骤、实验结果及分析,并对实验过程中遇到的问题进行讨论。

⒉实验设计⑴实验目的本实验的目的是实现一个可以对常见的算术表达式进行求值的算法,包括支持基本的加减乘除运算符和括号。

⑵实验环境●操作系统:Windows 10●开发语言:C++●开发工具:Visual Studio 2019⑶数据结构设计为了实现表达式求值的算法,我们需要设计适当的数据结构来存储和处理表达式。

本实验中,我们选择使用栈来实现表达式求值。

●表达式栈:用于存储操作数和运算符。

●运算符栈:用于存储运算符。

⑷算法设计表达式求值的算法可以分为以下几个步骤:●遍历表达式,逐个处理操作数和运算符:●如果是操作数,入表达式栈。

●如果是运算符,与运算符栈栈顶元素进行比较,根据优先级决定如何处理。

●当表达式遍历完成后,依次处理剩余的运算符。

●最终表达式栈中的元素即为求值结果。

⒊实验步骤⑴数据结构实现根据设计,我们首先实现表达式栈和运算符栈的数据结构,包括入栈、出栈等操作。

⑵表达式输入与预处理用户输入待求值的表达式,进行预处理,去除空格、验证表达式的合法性等。

⑶表达式求值算法实现根据前述的算法设计,实现表达式求值的算法,利用表达式栈和运算符栈来处理表达式。

⑷测试与结果分析对于不同的测试用例,进行表达式求值的测试,并分析结果的正确性和性能。

⒋实验结果与分析经过实验测试,我们得到了表达式求值的结果。

结果显示,我们的算法能够正确地求得表达式的值,而且性能良好。

⒌讨论与总结在实验过程中,我们遇到了一些问题,并进行了讨论和解决。

通过这个实验,我们更加深入地理解了表达式求值的算法,并对数据结构的应用有了更清晰的认识。

附件:无法律名词及注释:●无。

数据结构表达式求值实验报告

数据结构表达式求值实验报告

实验二表达式求值
实验内容:
用算符优先法设计一个具有加、减、乘、除四功能的计算程序。

实验目的与要求:
掌握栈的数据结构和基本操作。

实验原理:
1.表达式是由操作数,运算符和界限符组成。

2.实现算符优先算法,实用两个工作栈。

一个叫OPTR,用以寄存运算符;一个叫OPND,用以寄存操作数或运算结果。

3.算法的基本思路:
(1)首先置操作数栈为空栈,表达式起始符#作为运算符栈的栈底元素;
(2) 依次读入表达式中的每个字符,通过运算符判断函数In()使操作数进OPND 栈;
(3)通过函数Precede()将运算符与OPTR栈的栈底运算符比较出优先权,若栈顶元素优先权低则输入下个操作数到OPND,若两优先权相等,脱号并接受下一个字符,若栈顶元素优先高,退栈并将运算结果(通过函数Operate()运算)入栈。

循环上述操作直到表达式求值结束。

(4)返回运算结果。

4.所用的函数及作用:
InitStack():构造一个空栈
Push():插入元素进栈
GetTop():返回栈顶元素
Precede():运算符优先权进行判断
Pop():元素出栈
Operate():运算操作数
5. 测试结果与分析
上述程序在Visual C++ 6.0环境下加以实现。

经过多次测试,程序运行正确。

运行结果。

如图所示:
6. 收获与体会
通过这次课程设计:
1.我又进一步巩固了C语言的基础,尤其是栈。

2.算法中需要建很多的函数,队提高了自己的编程能力有帮助,
3.程序不够简洁,还有待改进,功能还有待更完善。

数据结构课程设计-计算器

数据结构课程设计-计算器

数据结构课程设计报告实验一:计算器设计要求1、问题描述:设计一个计算器,可以实现计算器的简单运算,输出并检验结果的正确性,以及检验运算表达式的正确性。

2、输入:不含变量的数学表达式的中缀形式,可以接受的操作符包括+、-、*、/、%、(、)。

具体事例如下:3、输出:如果表达式正确,则输出表达式的正确结果;如果表达式非法,则输出错误信息。

具体事例如下:知识点:堆栈、队列实际输入输出情况:正确的表达式对负数的处理表达式括号不匹配表达式出现非法字符表达式中操作符位置错误求余操作符左右出现非整数其他输入错误数据结构与算法描述解决问题的整体思路:将用户输入的中缀表达式转换成后缀表达式,再利用转换后的后缀表达式进行计算得出结果。

解决本问题所需要的数据结构与算法:用到的数据结构是堆栈。

主要算法描述如下:A.将中缀表达式转换为后缀表达式:1. 将中缀表达式从头逐个字符扫描,在此过程中,遇到的字符有以下几种情况:1)数字2)小数点3)合法操作符+ - * / %4)左括号5)右括号6)非法字符2. 首先为操作符初始化一个map<std::string,int> priority,用于保存各个操作符的优先级,其中+ -为0,* / %为13. 对于输入的字符串from和输出的字符串to,采用以下过程:初始化遍历器 std::string::iterator it=infix.begin()在当it!=from.end(),执行如下操作4. 遇到数字或小数点时将其加入到后缀表达式:case'1':case'2':case'3':case'4':case'5':case'6':case'7':case '8':case'9':case'0':case'.':{to=to+*it;break;}5. 遇到操作符(+,-,*,/,%)时,如果此时栈顶操作符的优先级比此时的操作符优先级低,则将其入栈,否则将栈中的操作符从栈顶逐个加入到后缀表达式,直到栈空或者遇到左括号,并将此时的操作符加入到栈中,在此过程中需判断表达式中是否出现输入错误:case'+':case'-':case'*':case'/':case'%':{if((it+1)==from.end()){cout<<"输入错误:运算符号右边缺少运算数"<<endl;return false;}if((*it=='*'||*it=='/')&&it==from.begin()){cout<<"输入错误:运算符号左边缺少运算数"<<endl;return false;}if((it+1)!=from.end()&&(*(it+1)=='+'||*(it+1)=='-'||*(it+1)=='*'||*(it+1)=='/' ||*(it+1)=='%')){cout<<"输入错误:运算符号连续出现"<<endl;return false;}to=to+" ";if(sym.empty()){sym.push(*it);break;}tem=sym.top();while(pri[*it]<=pri[tem]&&!sym.empty()&&tem!='('){to=to+tem+" ";sym.pop();if(sym.empty())break;tem=sym.top();}sym.push(*it);break;}6. 遇到“(”时,直接将其加入操作符栈,并且检测输入错误,并且当括号后的第一个符号为-时,说明用户试图输入负号,这种情况我们向目标表达式输出一个0,以达到处理负号的目的:case'(':{if((it+1)==from.end()){cout<<"输入错误:表达式以左括号结尾"<<endl;return false;}//若以+或者-开头,则按照正负号看待,向目标表达式中加入一个0if(*(it+1)=='-'||*(it+1)=='+'){to=to+'0';}if((it+1)!=from.end()&&((*(it+1)=='*'||*(it+1)=='/'||*(it+1)=='%'||*(it+1)==')'))) {cout<<"输入错误:左括号右边不能为运算符号或右括号"<<endl;return false;}if(it!=from.begin()&&(*(it-1)!='+'&&*(it-1)!='-'&&*(it-1)!='*'&&*(it-1)!='/'&&*(it-1)!='%'&&*(it-1)!='(')){cout<<"输入错误:左括号左边不能为运算数或右括号"<<endl;return false;}sym.push(*it);break;}5.遇到“)”时,将栈中的操作符从栈顶逐个弹出并放入后缀表达式中,直到在栈中遇到“(”,并将“(”从栈中弹出:case')':{if((it+1)!=from.end()&&*(it+1)!='+'&&*(it+1)!='-'&&*(it+1)!='*'&&*(it+1)!='/'&&*(it+1)!='%'&&*(it+1)!=')'){cout<<"输入错误:右括号右边不能为运算数"<<endl;return false;}if(it!=from.begin()&&(*(it-1)=='+'||*(it-1)=='-'||*(it-1)=='*'||*(it-1)=='/'||*(it-1)=='%')){cout<<"输入错误:右括号左边不能为运算符号"<<endl;return false;}to=to+" ";if(sym.empty()){cout<<"输入错误:表达式以右括号开始"<<endl;return false;}tem=sym.top();while(tem!='('){to=to+tem+" ";sym.pop();if(sym.empty()){cout<<"输入错误:括号匹配有误"<<endl;return false;}tem=sym.top();}sym.pop();break;}B.计算后缀表达式的主要思想:逐个字符的扫描后缀表达式,遇到单个数字或小数点时则先将其将其存到一个字符串中,当遇到后缀表达式中的分隔符(这里使用空格)时,则将这个字符串转化为数字放到堆栈numstack中;case'1':case'2':case'3':case'4':case'5':case'6':case'7':case '8':case'9':case'0':case'.':{numtemp+=*it;break;}case' ':{if(numtemp!=""){if(numtemp.find('.')&&numtemp.find('.',(numtemp.find('.')+1))!=string::npos){cout<<"输入错误:小数点数目超出:"+numtemp<<endl;return false;}strm.str(numtemp);strm>>d;numstack.push(d);numtemp="";strm.str("");strm.clear();break;}break;}2.遇到操作符+,-,*,/,%时,将堆栈numstack中的栈顶的两个数取出来,进行相应操作的运算,并将结果加入到堆栈numstack 中;case'+':{d2=numstack.top();numstack.pop();d1=numstack.top();numstack.pop();numstack.push(d1+d2);break;}case'-':{d2=numstack.top();numstack.pop();d1=numstack.top();numstack.pop();numstack.push(d1-d2);break;}case'*':{d2=numstack.top();numstack.pop();d1=numstack.top();numstack.pop();numstack.push(d1*d2);break;}case'/':{d2=numstack.top();numstack.pop();if(fabs(d2)<0.0000001){cout<<"输入错误:除数不能为0"<<endl;return false;}d1=numstack.top();numstack.pop();numstack.push(d1/d2);break;}case'%':{d2=numstack.top();numstack.pop();d1=numstack.top();numstack.pop();if((fabs(d2-(int)d2))<0.0000001&&(fabs(d1-(int)d1))<0.0000001){int n1=(int)d1;int n2=(int)d2;numstack.push((double)(n1%n2));break;}else{cerr<<"输入错误:求模操作只能作用于整数"<<endl;return false;}}3.直到后缀表达式扫描完并且堆栈numstack中只有一个数值,则此数值为计算的最终结果,否则说明输入有误。

数据结构算术表达式求值实验报告

数据结构算术表达式求值实验报告

软件技术基础实验报告实验名称:表达式计算器系别:通信工程年级:班级:学生学号:学生姓名:1《数据结构》课程设计报告题目简易计算表达式的演示【题目要求】要求:实现基本表达式计算的功能输入:数学表达式,表达式由整数和“+”、“-”、“×”、“/”、“(”、“)”组成输出:表达式的值基本操作:键入表达式,开始计算,计算过程和结果记录在文档中难点:括号的处理、乘除的优先级高于加减1.前言在计算机中,算术表达式由常量、变量、运算符和括号组成。

由于不同的运算符具有不同的优先级,又要考虑括号,因此,算术表达式的求值不可能严格地从左到右进行。

因而在程序设计时,借助栈实现。

算法输入:一个算术表达式,由常量、变量、运算符和括号组成(以字符串形式输入)。

为简化,规定操作数只能为正整数,操作符为+、-*、/、=,用#表示结束。

算法输出:表达式运算结果。

算法要点:设置运算符栈和运算数栈辅助分析算符优先关系。

在读入表达式的字符序列2.的同时,完成运算符和运算数的识别处理,以及相应运算。

2.概要设计2.1 数据结构设计任何一个表达式都是由操作符,运算符和界限符组成的。

我们分别用顺序栈来寄存表达式的操作数和运算符。

栈是限定于紧仅在表尾进行插入或删除操作的线性表。

顺序栈的存储结构是利用一组连续的存储单元依次存放自栈底到栈顶的数据元素,同时附设指针top 指示栈顶元素在顺序栈中的位置,base 为栈底指针,在顺序栈中,它始终指向栈底,即top=base 可作为栈空的标记,每当插入新的栈顶元素时,指针top 增1,删除栈顶元素时,指针top 减1。

2.2 算法设计为了实现算符优先算法。

可以使用两个工作栈。

一个称为OPTR ,用以寄存运算符,另一个称做OPND ,用以寄存操作数或运算结果。

1.首先置操作数栈为空栈,表达式起始符”#”为运算符栈的栈底元素;2.依次读入表达式,若是操作符即进OPND 栈,若是运算符则和OPTR 栈的栈顶运算符比较优先权后作相应的操作,直至整个表达式求值完毕(即OPTR 栈的栈顶元素和当前读入的字符均为”#”)。

数据结构课程设计报告-表达式求值

数据结构课程设计报告-表达式求值
OPTR->top--;
}
double Calculate(double a,double b,char c){ //进行二元运算
double result;
switch(c){
case '+':result=a+b;break;
case '-':result=a-b;break;
case '*':result=a*b;break;
void PushNum(OPND *OPND,double num){ //操作数进栈
OPND->top++;
OPND->array[OPND->top-1]=num;
}
void PopNum(OPND *OPND,double *num){ //操作数出栈
*num=OPND->array[OPND->top-1];
default:priority='E';
}
return priority;
}
void Process(OPND *OPND,OPTR *OPTR,char x){ //计算表达式
double a,b;char c;
static double tempnum=0.00000000;
static int len=10; //用于各数位上的值的转换
double array[N];
int top;//栈顶指针
}OPND;
typedef struct{ //定义运算符栈
char array[N];
int top;//栈顶指针
}OPTR;
int Cint(char mychar){ //将字符0-9转换成数值

表达式求值 实验报告

表达式求值 实验报告

表达式求值实验报告表达式求值实验报告一、引言表达式求值是计算机科学中一个重要的概念,它涉及到对数学表达式的计算和求解。

在本次实验中,我们将探讨表达式求值的相关算法和实现方法,并通过编程实现一个简单的表达式求值器。

二、算法原理1. 表达式的表示方法在计算机中,我们通常使用字符串来表示表达式。

例如,一个简单的数学表达式"2 + 3 * 4"可以表示为字符串"2+3*4"。

在实现表达式求值的算法时,我们需要将字符串中的数字和运算符进行分离,以便进行后续的计算。

2. 中缀表达式转后缀表达式为了方便计算,我们通常将中缀表达式转换为后缀表达式。

后缀表达式也称为逆波兰表达式,它的特点是运算符位于操作数的后面。

例如,上述的中缀表达式"2+3*4"可以转换为后缀表达式"234*+"。

转换的方法可以通过使用栈来实现。

3. 后缀表达式求值得到后缀表达式后,我们可以通过扫描表达式并使用栈来求解。

当遇到操作数时,将其压入栈中;当遇到运算符时,从栈中弹出相应数量的操作数进行计算,并将结果压入栈中。

最终,栈中的唯一元素即为表达式的求值结果。

三、实验过程1. 数据结构设计为了实现表达式求值器,我们需要设计相应的数据结构。

在本次实验中,我们选择使用栈来存储操作数和运算符。

2. 中缀表达式转后缀表达式首先,我们需要编写一个函数来将中缀表达式转换为后缀表达式。

该函数的实现可以通过使用栈和遍历字符串来实现。

具体的步骤如下:- 创建一个空栈和一个空字符串用于存储后缀表达式。

- 从左到右遍历中缀表达式的每个字符。

- 如果遇到操作数,直接将其添加到后缀表达式字符串中。

- 如果遇到运算符,将其与栈顶的运算符进行比较:- 如果栈为空或栈顶为左括号"(",则直接将运算符入栈。

- 如果栈顶的运算符优先级低于当前运算符,则将当前运算符入栈。

- 如果栈顶的运算符优先级高于或等于当前运算符,则将栈顶的运算符弹出并添加到后缀表达式字符串中,直到栈顶的运算符优先级低于当前运算符或栈为空。

数据结构表达式求值实验报告

数据结构表达式求值实验报告

数据结构表达式求值实验报告一、实验目的本次实验的主要目的是通过实现表达式求值的程序,深入理解数据结构和算法在解决实际问题中的应用。

具体包括掌握栈这种数据结构的操作和使用,熟悉表达式的转换和计算过程,提高编程能力和问题解决能力。

二、实验环境本次实验使用的编程语言为C++,开发工具为Visual Studio 2019。

三、实验原理表达式求值是程序设计中的一个常见问题,通常采用栈这种数据结构来实现。

表达式可以分为中缀表达式、后缀表达式和前缀表达式。

中缀表达式是我们日常使用的表达式形式,如“2 +3 4”,但直接对中缀表达式求值比较复杂。

而后缀表达式(如“2 3 4 +”)和前缀表达式(如“+2 3 4”)求值相对简单。

因此,在实现表达式求值时,通常先将中缀表达式转换为后缀表达式,然后对后缀表达式进行求值。

转换过程中,使用两个栈,一个用于存储操作数,另一个用于存储运算符。

求值过程中,根据后缀表达式的特点,从左到右依次处理操作数和运算符,进行相应的计算。

四、实验步骤1、定义数据结构定义栈类,用于存储操作数和运算符。

定义一个结构体来表示操作数和运算符。

2、中缀表达式转后缀表达式从左到右扫描中缀表达式。

遇到操作数,直接输出。

遇到运算符,根据其优先级与栈顶运算符的优先级进行比较,决定入栈或出栈操作。

3、后缀表达式求值从左到右扫描后缀表达式。

遇到操作数,入栈。

遇到运算符,从栈中取出两个操作数进行计算,将结果入栈。

4、主函数输入中缀表达式。

调用转换函数和求值函数,输出计算结果。

五、实验代码```cppinclude <iostream>include <stack>include <string>//定义操作符的优先级int priority(char op) {if (op =='+'|| op =='')return 1;if (op ==''|| op =='/')return 2;return 0;}//中缀表达式转后缀表达式std::string infixToPostfix(std::string infix) {std::stack<char> opStack;std::string postfix ="";for (char c : infix) {if (isdigit(c)){postfix += c;} else if (c =='('){} else if (c ==')'){while (!opStackempty()&& opStacktop()!='('){postfix += opStacktop();opStackpop();}opStackpop();//弹出'('} else {while (!opStackempty()&& priority(opStacktop())>=priority(c)){postfix += opStacktop();opStackpop();}opStackpush(c);}}while (!opStackempty()){postfix += opStacktop();}return postfix;}//后缀表达式求值int evaluatePostfix(std::string postfix) {std::stack<int> operandStack;for (char c : postfix) {if (isdigit(c)){operandStackpush(c '0');} else {int operand2 = operandStacktop();operandStackpop();int operand1 = operandStacktop();operandStackpop();switch (c) {case '+':operandStackpush(operand1 + operand2);break;case '':operandStackpush(operand1 operand2);break;case '':operandStackpush(operand1 operand2);break;case '/':operandStackpush(operand1 / operand2);break;}}}return operandStacktop();}int main(){std::string infixExpression;std::cout <<"请输入中缀表达式: ";std::cin >> infixExpression;std::string postfixExpression = infixToPostfix(infixExpression);int result = evaluatePostfix(postfixExpression);std::cout <<"表达式的计算结果为: "<< result << std::endl;return 0;}```六、实验结果输入不同的中缀表达式,如“2 +3 4”“( 2 + 3 )4”等,程序能够正确地将其转换为后缀表达式,并计算出结果。

数据结构课程设计运算器实验报告参考模板

数据结构课程设计运算器实验报告参考模板

数据结构课程设计报告实验一算术表达式求解目录一.问题描述及分析p11.问题描述p12.需求分析p1 二.功能模块及数据结构描述p11.数据结构描述 p1 2.模块描述 p2三.主要算法流程描述p3 四.使用说明p5 五.调试分析说明p6一.问题描述及分析1.问题描述以字符序列的形式从键盘输入语法正确的、不含变量的整数表达式,实现对算术四则混合运算表达式的求值。

2.需求分析自己设计界面,使用适当的数据结构对运算符、操作作数进行处理。

3.运行要求.Windows xp/2003/win 7.VS 2010运行库二.功能模块及数据结构描述1.数据结构描述int a[200][2];表达式元素分类存放数组,第一列存放表达式元素的类别(1-6,分别代表:+,-,*,/,(,)。

),第二列存放表达式各元素。

int p[200][2]表达式经过处理,转换为逆波兰式存放数组,原理同上。

int zhan1[1000]逆波兰转换模拟栈。

double zhan2[1000]逆波兰求解运算模拟栈。

2.模块描述图1.1 常规信息集C#有关程序及的常规信息,可通过特性值修改,由编译环境vs2010自动生成图1.2 有关程序集有关程序及信息,由编译环境vs2010自动生成图1.3 图形算法文件Form1.cs:为程序核心算法,其中包括界面设计,算法设计。

Program.cs:为程序入口文件,记录程序的入口点。

由于本程序核心算法没有用到子程序和子函数调用,所以没有对子函数或子程序的介绍。

三.主要算法流程描述图1.4 核心算法流程四.使用说明1.系统文件说明图1.5 运行文件本系统主程序。

2.程序界面(vs2010)图1.6 程序主界面3.使用说明:输入表达式:图1.7 说明描述点击“计算”按钮:图1.8 说明描述结果输出:图1.9 说明描述五.调试分析说明表1.1 调试遇到的问题及解决方案六.参考文献1、严蔚敏,吴伟民,《数据结构》(C语言版)[M],北京:清华大学出版社2、严蔚敏,《数据结构习题集与上机指导》[M],北京:清华大学出版社3、徐德民,《最新C语言程序设计》[M],电子工业出版社,19924、张国峰,《C++语言及其程序设计教程》[M],电子工业出版社,1992友情提示:范文可能无法思考和涵盖全面,供参考!最好找专业人士起草或审核后使用,感谢您的下载!。

数据结构课程设计计算器

数据结构课程设计计算器

数据结构课程设计 计算器一、课程目标知识目标:1. 让学生掌握计算器的基本数据结构原理,包括栈、队列等在计算器中的应用。

2. 使学生理解表达式求值的中缀转后缀方法,并能够运用数据结构实现转换过程。

3. 让学生掌握利用数据结构进行有效计算的过程,如利用栈进行算术表达式的求值。

技能目标:1. 培养学生运用数据结构解决实际问题的能力,如设计并实现一个简单的计算器程序。

2. 培养学生通过编程实践,加深对计算器内部处理机制的理解,提高编程技能。

3. 培养学生团队合作能力,通过小组合作完成课程设计任务。

情感态度价值观目标:1. 培养学生对计算机科学和编程的兴趣,激发其探究计算器内部原理的欲望。

2. 培养学生严谨的科学态度,注重细节,追求程序的正确性和效率。

3. 培养学生面对问题时,能够积极寻求解决方案,勇于克服困难的精神。

课程性质分析:本课程设计为高年级的数据结构课程实践环节,旨在通过实际案例让学生将理论知识与实际应用相结合,加深对数据结构原理的理解。

学生特点分析:学生已经具备了一定的编程基础和数理逻辑思维能力,能够理解较为复杂的数据结构,并具备一定的程序设计能力。

教学要求:1. 教师应引导学生主动探究,培养学生自主学习能力。

2. 教学过程中注重理论与实践相结合,强调动手实践能力。

3. 注重培养学生的团队协作能力和沟通能力,提高其综合素质。

二、教学内容1. 计算器的基本数据结构原理:- 栈的概念、原理及应用- 队列的概念、原理及应用2. 表达式求值:- 中缀表达式与后缀表达式的转换方法- 利用栈进行后缀表达式的求值3. 计算器程序设计:- 设计计算器程序的需求分析- 计算器程序的数据结构设计- 计算器程序的核心算法实现4. 课程实践:- 按照教学进度,分阶段完成计算器程序的设计与实现- 小组合作,进行程序调试与优化- 提交课程设计报告,分享学习成果教学内容安排与进度:1. 第1周:学习计算器基本数据结构原理,了解栈、队列的应用场景2. 第2周:学习表达式求值方法,掌握中缀转后缀及后缀求值算法3. 第3周:进行计算器程序设计,完成需求分析、数据结构设计和核心算法实现4. 第4周:课程实践,小组合作完成计算器程序的设计与实现,进行调试与优化5. 第5周:提交课程设计报告,进行成果分享和总结教材章节关联:本教学内容与教材中“数据结构”、“算法设计与分析”章节相关,结合实际案例,引导学生将所学知识应用于计算器程序设计中。

数据结构课程设计算术表达式求值

数据结构课程设计算术表达式求值

计算机科学系《数据结构课程设计》报告课题名称:算术表达式求值目录1.问题描述-----------------------------------------------------------32.基本要求-----------------------------------------------------------33.工具/准备工作----------------------------------------------------34.分析与实现--------------------------------------------------------45. 课程设计体会与感悟------------------------------------------161.问题描述从键盘上输入中缀算术表达式,包括括号,计算出表达式的值。

2.基本要求(1)程序能对所输入的表达式做简单的判断,如表达式有错,能给适当提示。

(2)能处理单目运算符:+,-。

3.工具/准备工作在开始项目之前,应回顾复习相关内容。

需要一台计算机装有visual C++。

4.分析与实现对于中缀表达式,一般运算规则如下:(1)先乘方,再乘除,最后加减;(2)同级运算从左算到右;(3)先括号内再括号外;(4)用到的头文件”utility.h”,”lk_stack.h”,”node.h”,”calculator.h”.根据实践经验,可以对运算符设置统一的优先级,从而方便比较。

表中给出了包括加、上面讨论的的+、—为双目运算符,如为单目运算符,编程实现时,可在前面加上0而转化为双目运算符。

如在+、—的前一个字符(如当前字符不是运算符时,规定用0表示)为‘=’或‘(’,则为单目运算符。

具体实现算法时,可设置两个工作栈,一个为操作栈,一个为操作符栈optr,另外一个为操作数栈opnd,算法基本思路如下:(1)将optr栈和opnd栈清空,在optr栈中加入一个‘=‘。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
||data[i-1]=='-'||data[i-1]=='*'||data[i-1]=='/'))
{
printf("格式错误\n");
return;
}
numb[q++]=i;
while(zhan[(p+k)/2].data[0]!='\0')
{
k++;
}
for(j=numb[q-2];j<numb[q-1];j++)
}
case '/':
{
numb1=ns[--n];
numb2=ns[--n];
if(numb1==0)
{
printf("无效操作\n");
return;
}
else
{
numb=numb2/numb1;
ns[n++]=numb;
}
break;
}
case '^':
{
numb1=ns[--n];
numb2=ns[--n];
scanf("%s",data);
if(strcmp(data,"+")==0||strcmp(data,"-")==0||strcmp(data,"*")==0||strcmp(data,"/")==0
||strcmp(data,"^")==0||strcmp(data,"=")==0)
{
printf("格式错误\n");
p++;
for(j=0;j<8;j++)
if(mark[j].operat==data[i])
break;
while(1)
{
if(mark[j].operat=='(')
{
os[o++]=mark[j];
break;
}
else if(mark[j].rank>os[o-1].rank&&mark[j].operat!='(')
mark[7].rank=0;
mark[8].operat='^';
mark[8].rank=3;
while(1)
{
char i[10];
printf("*****1、四则运算计算器*****\n");
printf("*****2、三角函数计算器*****\n");
printf("*****0、退出*****\n");
2.输出:3126
执行结果:
1、输入:sin30
2、输出:0.5
执行结果:
1、输入:cos60
2、输出:0.5
执行结果:
1、输入:cos60
2、输出:0.5
执行结果:
测试实例与测试结果(输入数据与运行结果,以及执行结果的截屏):
1、输入:tan45
2、输出:1
3、执行结果:

设计过程中遇到的问题及解决办法:
数据结构课程设计实验报告
起止时间:2015.12.28-2015.12.31
课程设计题目
表达式求值(计算器)
设计小组成员
及成绩分配
班级:
成员列表:
编译系统、运行环境和已实现的功能:
1.编译系统:Visual C++ 6.0;运行环境:Windows XP
2.实现功能:(a)实数的加减乘除混合运算;(b)带括号运算;
if(data[j]>='0'&&data[j]<='9'||data[j]=='.')
zhan[(p+k)/2].data[t++]=data[j];
zhan[(p+k)/2].data[t]='\0';
if(zhan[(p+k)/2].data[0]!='\0')
ns[n++]=atof(zhan[(p+k)/2].data);
mark[3].operat='*';
mark[3].rank=2;
mark[4].operat='/';
mark[4].rank=2;
mark[5].operat='(';
mark[5].rank=-1;
mark[6].operat=')';
mark[6].rank=-1;
mark[7].operat='=';
if(strstr(s,"sin")!=0)
{
int i=0,j=0;
while(s[i]!='\0')
{
if(s[i]>='0'&&s[i]<='9')
s[j++]=s[i];
i++;
}
s[j]='\0';
x=atof(s);
y=sin(x*pai/180);
}
else if(strstr(s,"cos")!=0)
}yxj;
3、分别建立一个操作数栈和操作符栈存放数字和操作符,定义操作符栈第一个元素优先级最低。
4、自左向右扫描字符串遇到字符串中的数字时一律提取转换成double型存入操作数栈。遇到操作符时,则将当前运算符的优先级数与运算符栈顶元素的优先级数相比较。若当前运算符的优先级数大,则进栈;反之,则取出栈顶的运算符,并在数栈中连续取出两个栈顶元素作为运算对象进行运算,并将运算结果存入数栈,然后继续比较当前运算符与栈顶元素的优先级。直到当前运算符进栈。
指导老师评议:
成绩评定:指导教师签名:
附件:(程序源代码)
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#define N 100
#define pai 3.1415926
typedef struct yxj
{
char operat;
int rank;
}yxj;
typedef struct str
{
char data[N];
}zs;
void sjhs(void)
{
char s[10],a[10];
double y,x;
printf("请输入(sin cos tan角度制)表达式:\n");
scanf("%s",s);
scanf("%s",&i);
if(strcmp(i,"0")==0)
break;
else if(strcmp(i,"1")==0)
szys(mark);
else if(strcmp(i,"2")==0)
sjhs();
else
printf("没有该选项\n");
}
}
}
case '-':
{
numb1=ns[--n];
numb2=ns[--n];
numb=numb2-numb1;
ns[n++]=numb;
break;
}
case '*':
{
numb1=ns[--n];
numb2=ns[--n];
numb=numb2*numb1;
ns[n++]=numb;
break;
else
printf("没有该选项\n");
}
int main ()
{
yxj mark[9];
mark[0].operat='#';
mark[0].rank=-1;
mark[1].operat='+';
mark[1].rank=1;
mark[2].operat='-';
mark[2].rank=1;
printf("*****0、返回上一层*****\n");
scanf("%s",a);
if(strcmp(a,"0")==0)
return;
else if(strcmp(a,"1")==0)
sjhs();
else
printf("没有该选项\n");
}
void szys(yxj mark[])
{
yxj os[N];
}
}
printf("%lf\n",ns[0]);
printf("*****1、继续*****\n");
printf("*****0、返回上一层*****\n");
scanf("%s",&a);
if(strcmp(a,"0")==0)
return;
else if(strcmp(a,"1")==0)
相关文档
最新文档