您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > 数据结构课程设计报告(二)表达式求值(计算器)
课程设计报告课程名称:数据结构课程设计设计题目:表达式求值(计算器)学院:信息科学与工程学院专业:计算机科学与技术(软件外包)姓名:指导教师:二零一五年十二月二十九日济南大学课程设计1一、设计内容与要求1、问题描述设计一个算术计算器,能运算包括四则运算、括号的表达式的运算。2、设计要求实现()、+、-、*、/、^等运算,实现小数和整数混合运算,优先级的处理,能判断算术表达式是否正确等。二、算法设计1、输入并建立表达式,运用数组结构体构建将整型数字与操作符结合定义运算符的优先级。typedefstructyxj{charoperat;intrank;}yxj;2、分别建立一个操作数栈和操作符栈存放数字和操作符,定义操作符栈第一个元素优先级最低。3、自左向右扫描字符串遇到字符串中的数字时一律提取转换成double型存入操作数栈。遇到操作符时,则将当前运算符的优先级数与运算符栈顶元素的优先级数相比较。若当前运算符的优先级数大,则进栈;反之,则取出栈顶的运算符,并在数栈中连续取出两个栈顶元素作为运算对象进行运算,并将运算结果存入数栈,然后继续比较当前运算符与栈顶元素的优先级。直到当前运算符进栈。4、对比运算符进行+-*/()^运算。三、程序代码#includestdio.h#includestdlib.h#includestring.h#includemath.h#defineN100typedefstructyxj{charoperat;intrank;}yxj;typedefstructstr{chardata[N];}zs;voidszys(yxjmark[]){yxjos[N];charch;济南大学课程设计2doublens[N];zszhan[20];intnumb[N];intLen,p=0,q=1,i,o=1,n=0;chardata[N];os[0]=mark[0];printf(请输入算术(+-*/^)表达式(以=结束):\n);scanf(%s,data);Len=strlen(data);numb[0]=0;for(i=0;i20;i++)zhan[i].data[0]='\0';for(i=0;iLen;i++){intt=0;if(data[i]=='^'||data[i]=='+'||data[i]=='-'||data[i]=='*'||data[i]=='/'||data[i]=='('||data[i]==')'||data[i]=='='){intj,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];jnumb[q-1];j++)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);p++;for(j=0;j8;j++)if(mark[j].operat==data[i])break;while(1)济南大学课程设计3{if(mark[j].operat=='('){os[o++]=mark[j];break;}elseif(mark[j].rankos[o-1].rank&&mark[j].operat!='('){os[o++]=mark[j];break;}else{doublenumb1,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;济南大学课程设计4}else{numb=numb2/numb1;ns[n++]=numb;}}if(ch=='^'){numb1=ns[--n];numb2=ns[--n];numb=pow(numb2,numb1);ns[n++]=numb;}}}}elseif(data[i]='0'&&data[i]='9');elseif(data[i]=='.');else{printf(格式错误,请重新输入:\n);szys(mark);break;}}printf(%lf\n,ns[0]);}intmain(){yxjmark[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=')';济南大学课程设计5mark[6].rank=-1;mark[7].operat='=';mark[7].rank=0;mark[8].operat='^';mark[8].rank=3;while(1){chari[N];printf(*****1、计算器*****\n);printf(*****0、退出*****\n);scanf(%s,&i);if(strcmp(i,0)==0)break;elseif(strcmp(i,1)==0)szys(mark);elseprintf(没有该选项\n);}}四、运行测试1.正常四则运算2.乘方运算3.除数为零时4.格式出现错误济南大学课程设计65.小数运算五、结论这次课程设计让我们更加了解大一学到的C和这个学期学到的数据结构。课设题目要求不仅要求对课本知识有较深刻的了解,同时要求程序设计者有较强的思维和动手能力和更加了解编程思想和编程技巧。这次课程设计也让我们有一个深刻的体会,那就是细节决定成败,编程最需要的是严谨,如何的严谨都不过分,往往检查了半天发现错误发生在某个括号,分号,引号,或者数据类型上。程序设计时,也不要怕遇到错误,在实际操作过程中犯的一些错误还会有意外的收获。在具体操作中这学期所学的数据结构的理论知识得到巩固,达到课程设计的基本目的,也发现自己的不足之出,在以后的上机中应更加注意,同时体会到C语言具有的语句简洁,使用灵活,执行效率高等特点。这个程序是我们3个人完成的,我们的工作是一个团队的工作,团队需要个人,个人也离不开团队,必须发扬团结协作的精神。某个人的离群都可能导致导致整项工作的失败。实习中只有一个人知道原理是远远不够的,必须让每个人都知道,否则一个人的错误,就有可能导致整个工作失败。团结协作是我们成功的一项非常重要的保证。而这次课程设计也正好锻炼我们这一点,这也是非常宝贵的。
本文标题:数据结构课程设计报告(二)表达式求值(计算器)
链接地址:https://www.777doc.com/doc-4616947 .html