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

合集下载

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

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

课程设计报告题目:计算表达式的值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);
//操作数栈初始化
  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)
相关文档
最新文档