您好,欢迎来到爱站旅游。
搜索
您的当前位置:首页数据结构课程设计报告(二)表达式求值(计算器)

数据结构课程设计报告(二)表达式求值(计算器)

来源:爱站旅游
.

. .

课程设计报告

课程名称: 数据构造课程设计 设计题目: 表达式求值〔计算器〕 学 院: 信息科学与工程学院 专 业: 计算机科学与技术〔软件外包〕 姓 名:

二零一五年 十二月 二十九日

.word.zl.

指导教师: .

.

一、设计容与要求

1、问题描述

设计一个算术计算器,能运算包括四那么运算、括号的表达式的运算。

2、设计要求

实现〔〕、+、-、*、/、^ 等运算,实现小数和整数混合运算,优先级的处理,能判断算术表达式是否正确等。

二、算法设计

1、输入并建立表达式,运用数组构造体构建将整型数字与操作符结合定义运算符的优先级。

typedef struct yxj { char operat; int rank; }yxj; 2、分别建立一个操作数栈和操作符栈存放数字和操作符,定义操作符栈第一个元素优先级最低。 3、自左向右扫描字符串遇到字符串中的数字时一律提取转换成double型存入操作数栈。遇到操作符时,那么将当前运算符的优先级数与运算符栈顶元素的优先级数相比拟。假设当前运算符的优先级数大,那么进栈;反之,那么取出栈顶的运算符,并在数栈中连续取出两个栈顶元素作为运算对象进展运算,并将运算结果存入数栈,然后继续比拟当前运算符与栈顶元素的优先级。直到当前运算符进栈。

4、比照运算符进展+ - * /〔〕^ 运算。

三、程序代码

#include #include #include #include #define N 100 typedef struct yxj { char operat; int rank; }yxj;

typedef struct str { char data[N]; }zs;

void szys(yxj mark[]) { yxj os[N]; char ch;

. .word.zl.

.

.

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]; printf(\"请输入算术〔+ - * / ^〕表达式〔以 = 完毕〕:\\n\"); scanf(\"%s\ Len=strlen(data); numb[0]=0; for(i=0;i<20;i++) zhan[i].data[0]='\\0'; for(i=0;i='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); p++; for(j=0;j<8;j++) if(mark[j].operat==data[i]) break; while(1) {

. .word.zl.

.

.

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; ch=os[--o].operat; if(ch=='+') { numb1=ns[--n]; numb2=ns[--n]; numb=numb1+numb2; ns[n++]=numb; } if(ch=='-') { numb1=ns[--n]; numb2=ns[--n]; numb=numb2-numb1; ns[n++]=numb; } if(ch=='*') { numb1=ns[--n]; numb2=ns[--n]; numb=numb2*numb1; ns[n++]=numb; } if(ch=='/') { numb1=ns[--n]; numb2=ns[--n]; if(numb1==0) { printf(\"无效操作\\n\"); return; }

. .word.zl.

.

.

else { numb=numb2/numb1; ns[n++]=numb; } } if(ch=='^') { numb1=ns[--n]; numb2=ns[--n]; numb=pow(numb2,numb1); ns[n++]=numb; } } } } else if(data[i]>='0'&&data[i]<='9'); else if(data[i]=='.'); else { printf(\"格式错误,请重新输入:\\n\"); szys(mark); break; } } printf(\"%lf\\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;

. .word.zl.

.

.

mark[7].operat='='; mark[7].rank=0; mark[8].operat='^'; mark[8].rank=3; while(1) { char i[N]; printf(\"*****1、计算器*****\\n\"); printf(\"*****0、退出 *****\\n\"); scanf(\"%s\ if(strcmp(i,\"0\")==0) break; else if(strcmp(i,\"1\")==0) szys(mark); else printf(\"没有该选项\\n\"); }

}

四、运行测试

1.正常四那么运算

2.乘方运算

3.除数为零时

4.格式出现错误

. .word.zl.

.

.

5.小数运算

五、结 论

这次课程设计让我们更加了解大一学到的C和这个学期学到的数据构造。课设题目要求不仅要求对课本知识有较深刻的了解,同时要求程序设计者有较强的思维和动手能力和更加了解编程思想和编程技巧。

这次课程设计也让我们有一个深刻的体会,那就是细节决定成败,编程最需要的是严谨,如何的严谨都不过分,往往检查了半天发现错误发生在某个括号,分号,引号,或者数据类型上。程序设计时,也不要怕遇到错误,在实际操作过程中犯的一些错误还会有意外的收获。在具体操作中这学期所学的数据构造的理论知识得到稳固,到达课程设计的根本目的,也发现自己的缺乏之出,在以后的上机中应更加注意,同时体会到C语言具有的语句简洁,使用灵活,执行效率高等特点。

这个程序是我们3个人完成的,我们的工作是一个团队的工作,团队需要个人,个人也离不开团队,必须发扬团结协作的精神。某个人的离群都可能导致导致整项工作的失败。实习中只有一个人知道原理是远远不够的,必须让每个人都知道,否那么一个人的错误,就有可能导致整个工作失败。团结协作是我们成功的一项非常重要的保证。而这次课程设计也正好锻炼我们这一点,这也是非常珍贵的。

. .word.zl.

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- azee.cn 版权所有

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务