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

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
while(s[i]!='\0')
{
if(s[i]>='0'&&s[i]<='9')
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");
{
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=cos(x*pai/180);
}
else if(strstr(s,"tan")!=0)
{
int i=0,j=0;
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)
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、执行结果:

设计过程中遇到的问题及解决办法:
{
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",data);
if(strcmp(data,"+")==0||strcmp(data,"-")==0||strcmp(data,"*")==0||strcmp(data,"/")==0
||strcmp(data,"^")==0||strcmp(data,"=")==0)
{
printf("格式错误\n");
}yxj;
3、分别建立一个操作数栈和操作符栈存放数字和操作符,定义操作符栈第一个元素优先级最低。
4、自左向右扫描字符串遇到字符串中的数字时一律提取转换成double型存入操作数栈。遇到操作符时,则将当前运算符的优先级数与运算符栈顶元素的优先级数相比较。若当前运算符的优先级数大,则进栈;反之,则取出栈顶的运算符,并在数栈中连续取出两个栈顶元素作为运算对象进行运算,并将运算结果存入数栈,然后继续比较当前运算符与栈顶元素的优先级。直到当前运算符进栈。
}
}
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);
||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++)
数据结构课程设计实验报告
起止时间:2015.12.28-2015.12.31
课程设计题目
表达式求值(计算器)
设计小组成员
及成绩分配
班级:
成员列表:
编译系统、运行环境和已实现的功能:
1.编译系统:Visual C++ 6.0;运行环境:Windows XP
2.实现功能:(a)实数的加减乘除混合运算;(b)带括号运算;
问题:算数表达式以字符串输入,操作数和操作符的提取;
解决办法:两两操作符之间如有数字将中间的数字提取强制转换成double型;
参考文献:(在设计中参考的书籍、网站等资料)
1. 朱振元,《数据结构——C++语言描述》,清华大学出版社,2008年,页码:
2.http://download.csdn.net/detail/gszhouyi/738777
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");
}
}
5、对比运算符进行+ - * /()^ 运算。
二、三角函数
1、自左向右扫描字符串遇到字符串中的数字时提取转换成double型存入数栈。
2、进行三角函数运算。
测试实例与测试结果(输入数据与运行结果,以及执行结果的截屏):
1.输入:10*(12+16)/2-15=
2.输出:125
执行结果:
1.输入:5^5+6-10/2=
}
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;
numb=pow(numb2,numb1);
ns[n++]=numb;
break;
}
}
}
}
}
else if(data[i]>='0'&&data[i]<='9');
else if(data[i]=='.');
else
{
printf("格式错误,请重新输入:\n");
szys(mark);
break;
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];
||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]=='+'
else
printf("没有该选项\n");
}
int main ()
{Leabharlann Baidu
yxj mark[9];
mark[0].operat='#';
mark[0].rank=-1;
mark[1].operat='+';
mark[1].rank=1;
mark[2].operat='-';
mark[2].rank=1;
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!='(')
return;
}
Len=strlen(data);
numb[0]=0;
for(i=0;i<20;i++)
zhan[i].data[0]='\0';
for(i=0;i<Len;i++)
{
int t=0;
if((data[i]=='^'||data[i]=='+'||data[i]=='-'||data[i]=='*'
(c)乘方运算;(d)三角函数运算
程序功能流程框图:
主要算法描述:(可以使用流程图或其它的算法描述方法)
一、四则运算
1、链栈实现括号和四则运算优先级
2、输入并建立表达式,运用数组结构体构建将整型数字与操作符结合定义运算符的优先级。
typedef struct yxj
{
char operat;
int rank;
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='=';
指导老师评议:
成绩评定:指导教师签名:
附件:(程序源代码)
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#define N 100
#define pai 3.1415926
typedef struct yxj
{
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;
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");
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);
}
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];
相关文档
最新文档