毕业设计_数据结构【a】十进制整数四则运算计算器

合集下载

【数据结构】【a】十进制整数四则运算计算器正文终稿

【数据结构】【a】十进制整数四则运算计算器正文终稿

东北大学信息科学与工程学院数据结构课程设计报告题目十进制整数四则运算计算器课题组长余灏然课题组成员魏嘉张越专业名称计算机科学与技术班级计算机1307指导教师杨雷2015 年1月课程设计任务书题目:十进制整数四则运算计算器问题描述:由输入的四则运算表达式字符串,动态生成算术表达式所对应的二叉树,通过表达式二叉树自动求值并输出。

设计要求:设计十进制整数四则运算计算器。

(1)采用二叉树、栈等数据结构。

(2)给定表达式字符串,生成二叉链表的表达式二叉树。

(3)对表达式二叉树采用后序遍历求值并输出。

(4)可以考虑加入复数四则运算功能。

(5)其它完善性功能。

指导教师签字:2014年12月28日目录1 课题概述 (1)1.1 课题任务 (1)1.2 课题原理 (1)1.3 相关知识 (4)2 需求分析 (4)2.1 课题调研 (5)2.2 用户需求分析 (5)3 方案设计 (5)3.1 总体功能设计 (5)3.2 数据结构设计 (5)3.3 函数原型设计 (5)3.4 主算法设计 (5)3.5 用户界面设计 (5)4 方案实现 (6)4.1 开发环境与工具 (6)4.2 程序设计关键技术 (6)4.3 个人设计实现(按组员分工)4.3.1余灏然设计实现 (6)4.3.2 魏嘉设计实现 (9)4.3.3 张越设计实现 (11)5 测试与调试 (13)5.1 个人测试(按组员分工) (13)5.1.1 余灏然测试 (13)5.1.2 魏嘉测试 (16)5.1.3 张越测试 (20)5.2 组装与系统测试 (25)5.3 系统运行 (25)6 课题总结 (26)6.1 课题评价 (26)6.2 团队协作 (26)6.3 个人设计小结(按组员分工) (26)6.3.1 余灏然设计小结 (26)6.3.2 魏嘉设计小结 (27)6.3.3 张越设计小结 (27)7 附录A 课题任务分工 (28)A-1 课题程序设计分工 (28)A-2 课题报告分工 (29)附录C 用户操作手册(可选) (30)C.1 运行环境说明 (30)C.2 操作说明 (30)1 课题背景1.1 课题任务【问题描述】由输入的四则运算表达式字符串,动态生成算术表达式所对应的二叉树,通过表达式二叉树自动求值并输出。

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

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

数据结构课程设计-计算器数据结构课程设计计算器在计算机科学的学习中,数据结构是一门重要的基础课程。

通过这门课程的学习,我们能够深入理解和掌握如何有效地组织和管理数据,以提高程序的运行效率和性能。

本次课程设计的任务是开发一个简单的计算器程序,通过运用所学的数据结构知识,实现基本的算术运算功能。

一、需求分析首先,我们需要明确计算器程序的功能需求。

这个计算器应该能够支持常见的四则运算,即加法、减法、乘法和除法。

用户可以通过输入表达式,例如“2 +3”、“5 2”、“3 4”、“8 /2”等,程序能够正确计算并输出结果。

此外,为了提高用户体验,计算器还应该能够处理错误输入,例如输入的表达式不符合语法规则或者除数为 0 等情况,并给出相应的错误提示信息。

二、数据结构选择为了实现上述功能,我们需要选择合适的数据结构来存储和处理输入的表达式。

在这个计算器程序中,我们可以使用栈这种数据结构。

栈是一种后进先出(Last In First Out,LIFO)的数据结构,非常适合处理表达式的计算。

我们可以创建两个栈,一个用于存储操作数,另一个用于存储操作符。

当用户输入一个表达式时,我们按照从左到右的顺序逐个字符进行处理。

如果是数字,则将其转换为整数并压入操作数栈;如果是操作符,则将其压入操作符栈。

在计算过程中,我们从操作符栈中取出操作符,从操作数栈中取出相应数量的操作数进行计算,将计算结果压回操作数栈。

三、算法设计1、表达式解析算法从左到右扫描表达式。

如果遇到数字,将其作为一个整数提取出来,并压入操作数栈。

如果遇到操作符(+、、、/),则将其压入操作符栈。

如果遇到左括号“(”,则将其压入操作符栈。

如果遇到右括号“)”,则从操作符栈中弹出操作符,从操作数栈中弹出操作数,进行计算,直到遇到左括号为止。

2、计算算法当操作符栈不为空时,从操作符栈中弹出一个操作符。

根据操作符的类型,从操作数栈中弹出相应数量的操作数。

进行计算,并将结果压回操作数栈。

数据结构课程设计算术表达式求值-计算器(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");}}-全文完-。

汇编语言课程设计四则运算计算器..【范本模板】

汇编语言课程设计四则运算计算器..【范本模板】

微机原理实验报告汇编语言课程设计报告( 2012 —- 2013 年度第1 学期)实验名称:实现加减乘除四则运算的计算器专业生物医学工程学生姓名周炳威班级B100904学号B10090406指导教师乐洋实现加减乘除四则运算的计算器1 实验目的深化学习的汇编语言课程基本知识,进一步掌握汇编语言程序设计方法,提高分析问题、解决问题的综合应用能力。

通过使用汇编语言设计实现简单计算器,以此进一步了解和掌握对数据存储,寄存器的使用,加减乘除相关指令以及模块的调用等汇编语言知识的有效运用2 实验内容课题名称:实现加减乘除四则运算的计算器主要功能:实现一个简单的计算器,要求:编写一个程序,每运行一次可执行程序,可以实现加减乘除四则运算。

计算器是最简单的计算工具,简单计算器具有加、减、乘、除四项运算功能。

3 实现方法本次汇编语言课程设计的最终目的是要实现一个简单计算器,要求编写一个程序,每运行一次可执行程序,可以实现数的加减乘除四则运算。

由自己调用中断输入到屏幕上并要用程序存储起来的数,然后才能对这两个数进行运算,而且做的是加法运算、减法运算乘法运算还是除法运算也未可知,为此我们还要判断用户所输入的运算是四则运算中的哪一个运算。

此外,运算过程中的进位或是借位,选择用什么样的方式进行输出,如何实现清屏等也是要解决的问题。

第一步,用INT 21H的1号功能调用来进行输入.利用1号功能调用来输入,即把单个字符一个个的输入并存储到一个数据区里。

我们要做的是两个数的运算,先认定输入的格式为1234+5678=或者1111*2222=,当然如果输入不是这样的格式计算出来的结果就不一定是我们想要的结果了.在存储的时候也是有选择的存储,当输入的并非格式里所要求的字符时则报错.第二步,设计程序进行判断所输入的算式是做加法运算、减法运算、乘法运算还是除法运算,即判断输入的运算符是‘+'号、‘—'号、‘*’号、‘/’号中的哪一个,因为输入的格式固定了,所以只需要把存进数据区的第三个字符拿来与加减乘除四个运算符号进行比较,和哪一个运算符号一样就调用相对应的运算模块进行计算。

毕业设计-设计并实现大整数(超过十位的整数)的加减乘除运算

毕业设计-设计并实现大整数(超过十位的整数)的加减乘除运算

目录第1章课题概述 (1)1.1课题的目的 (1)1.2课题的要求 (1)1.2.1 输入输出的要求 (1)1.2.2 程序实现的功能要求 (1)第2章概要设计 (3)2.1整个程序的模块结构及流程 (3)2.2大整数存储结构的选择 (3)2.3输入数据合法性的检测及初步处理 (4)2.4各个操作算法的描述 (5)2.4.1 相加算法 (5)2.4.2 相减算法 (7)2.4.3 相乘算法 (8)2.4.4 相除算法 (10)第3章程序功能的实现 (16)3.1主函数的实现 (16)3.2主要功能模块的实现 (18)3.2.1 加法的实现 (18)3.2.2 减法的实现 (19)3.2.3 乘法的实现 (22)3.2.4 除法的实现 (23)第4章调试及发现问题的解决 (29)第5章程序测试及分析 (31)第6章总结 (37)参考文献 (39)第1章课题概述本次数据结构课程设计的题目是设计并实现大整数(超过十位的整数)的加减乘除运算。

1.1 课题的目的整数的加减乘除运算是日常生活中常见的四则数学运算。

在不借助计算器的手工条件下,人们往往会通过列竖式的形式来计算结果。

当借助计算机来运算时,虽然不用列竖式那么麻烦了,但是由于计算机对于整数的存储往往只有2B或4B 的空间,因此能够表示的整数存储范围比较有限。

即使采用四个字节来存储整数,它所能表示的范围为:[-2147483648,+2147483647]。

一般称超过十位以上的十进制整数为大整数,这类大整数在C语言系统中因超界溢出,是不能直接用基本数据类型来表示和计算的。

因此,采用特定的数据结构和算法,通过编写计算机程序的方式来实现这些功能,无疑具有较大的实际意义。

1.2 课题的要求1.2.1 输入输出的要求(1)程序运行后应首先输出一个主菜单,并将所有的加、减、乘、除等功能罗列在主菜单上供用户进行选择,以便进行相应的操作。

(2)运算对象应能够从键盘输入,并且运算过程中可以不断更新运算的输入数据。

汇编课程设计(有符号多位十进制数的四则运算计算器)

汇编课程设计(有符号多位十进制数的四则运算计算器)

汇编语言课程设计实验报告一、课程设计目的《汇编语言程序设计》是计算机专业一门重要的核心课程,也是一门实践性很强的课程,而课程设计则是其中一个重要的应用实践环节。

本次课程设计的目的是提高分析问题、解决问题的能力以及实际动手能力,进一步加深对汇编语言程序设计基本理论的理解,熟练掌握汇编语言程序上机调试的方法技巧、结构化程序设计技术及高级汇编语言技术,能编写较复杂的应用程序,为学习后继课程打下扎实的基础二、实验环境编译机器:IBM兼容PC操作系统:Windows XP -SP2 中文版编译工具:MASM 5.0三、课程设计内容1、编写一个有符号多位十进制数的四则运算计算器程序,所输入的算式如下例所示:-278+32=-132――12=11*-32=-1234/-18=要求程序能接收键入的算式,在接收到‘=’号时,计算并以有符号十进制数的形式显示结果,然后允许用户继续键入算式。

如果键入算式后再键入‘.’,则显示结果并结束整个程序。

(‘/’为整除)程序设计框图:程序源代码:2、已知一个由英语单词组成的字符串已按字典序排好,每个单词以空格符为结束,该串的首二字节为16位无符号二进制数,用以说明串的长度。

试编程能从键盘上输入单词(以空格字符为结束),若字符串中没有该单词,则将该单词插入该串适当的位置,使其仍保持字典序,并修改串长度,显示单词在串中位置及串长度;若字符串中有该单词,则显示字符串中所有包含该单词的单词,及其在字符串中的位置。

程序设计框图:程序代码:DATA SEGMENT; DICTIONARY 字典字符串,首两个字节为 16 位无符号二进制数,说明字符串长度。

DICTIONARY DB 00,16H,"add an book dad egg "DB 100H DUP(20H) ; 空的缓冲区。

MSG_INTRO DB "Input the Word to Search : ","$"MSG_NOTFOUND DB "Not Found, Now Insert it . ",0AH,0DH,"$"MSG_NEWDICT DB 0AH,0DH,"New Dictionary : ","$"MSG_FOUND DB 0AH,0DH,"Found Word in Dictionary : ","$"MSG_POSITION DB 0AH,0DH,"Position : ","$"MSG_DICTLENGTH D B 0AH,0DH,"New Dictionary Length : ","$"MSG_NEWLINE DB 0AH,0DH,"$"BUFFER DB 10H DUP(20H) ; BUFFER 用于保存需要查询的单词。

运用数据结构实现计算器(2023版)

运用数据结构实现计算器(2023版)

运用数据结构实现计算器运用数据结构实现计算器1.简介本文档将介绍如何使用数据结构来实现一个计算器。

计算器是一种用于执行数学运算的工具,通过输入表达式来计算结果。

我们将使用数据结构来存储和处理表达式中的数据和运算符。

2.功能需求我们的计算器将具有以下功能:●支持基本的四则运算(加法、减法、乘法、除法)●支持括号运算●支持多位数和小数运算●支持优先级运算(乘法和除法的优先级高于加法和减法)3.数据结构设计我们将使用以下数据结构来实现计算器:●栈(Stack):用于存储运算符和括号,以实现运算符优先级处理和括号匹配。

●队列(Queue):用于存储数值和中间结果,以实现表达式的计算和保存结果。

4.算法设计计算器的核心算法如下:●表达式解析:将输入的表达式解析为数值和运算符,并存储在队列中。

●运算符优先级处理:使用栈来存储运算符并进行优先级处理,确保正确的运算顺序。

●括号匹配:使用栈来匹配括号,以确保括号内的表达式可以正确计算。

●表达式计算:使用队列中的数值和运算符进行计算,并得出最终结果。

5.界面设计计算器可以有一个简单的用户界面,包括一个文本框用于输入表达式和一个按钮用于计算。

在计算完成后,结果将显示在另一个文本框中。

6.实现步骤要实现计算器,可以按照以下步骤进行:1.设计数据结构:确定使用的数据结构,包括栈和队列。

2.实现表达式解析:编写代码将输入的表达式解析为队列中的数值和运算符。

3.实现运算符优先级处理:编写代码使用栈来处理运算符的优先级。

4.实现括号匹配:编写代码使用栈来匹配括号。

5.实现表达式计算:编写代码使用队列中的数据进行计算并得出结果。

6.设计界面:创建用户界面,包括输入表达式的文本框、计算按钮和显示结果的文本框。

7.组合功能:将各个模块结合起来,实现完整的计算器功能。

7.附件本文档不涉及附件。

8.法律名词及注释本文档不涉及法律名词及注释。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

东北大学信息科学与工程学院数据结构课程设计报告题目十进制整数四则运算计算器课题组长余灏然课题组成员魏嘉张越专业名称计算机科学与技术班级计算机1307指导教师杨雷2015 年1月课程设计任务书题目:十进制整数四则运算计算器问题描述:由输入的四则运算表达式字符串,动态生成算术表达式所对应的二叉树,通过表达式二叉树自动求值并输出。

设计要求:设计十进制整数四则运算计算器。

(1)采用二叉树、栈等数据结构。

(2)给定表达式字符串,生成二叉链表的表达式二叉树。

(3)对表达式二叉树采用后序遍历求值并输出。

(4)可以考虑加入复数四则运算功能。

(5)其它完善性功能。

指导教师签字:2014年12月28日目录1 课题概述 (1)1.1 课题任务 (1)1.2 课题原理 (1)1.3 相关知识 (4)2 需求分析 (4)2.1 课题调研 (5)2.2 用户需求分析 (5)3 方案设计 (5)3.1 总体功能设计 (5)3.2 数据结构设计 (5)3.3 函数原型设计 (5)3.4 主算法设计 (5)3.5 用户界面设计 (5)4 方案实现 (6)4.1 开发环境与工具 (6)4.2 程序设计关键技术 (6)4.3 个人设计实现(按组员分工)4.3.1余灏然设计实现 (6)4.3.2 魏嘉设计实现 (9)4.3.3 张越设计实现 (11)5 测试与调试 (13)5.1 个人测试(按组员分工) (13)5.1.1 余灏然测试 (13)5.1.2 魏嘉测试 (16)5.1.3 张越测试 (20)5.2 组装与系统测试 (25)5.3 系统运行 (25)6 课题总结 (26)6.1 课题评价 (26)6.2 团队协作 (26)6.3 个人设计小结(按组员分工) (26)6.3.1 余灏然设计小结 (26)6.3.2 魏嘉设计小结 (27)6.3.3 张越设计小结 (27)7 附录A 课题任务分工 (28)A-1 课题程序设计分工 (28)A-2 课题报告分工 (29)附录C 用户操作手册(可选) (30)C.1 运行环境说明 (30)C.2 操作说明 (30)1 课题背景1.1 课题任务【问题描述】由输入的四则运算表达式字符串,动态生成算术表达式所对应的二叉树,通过表达式二叉树自动求值并输出。

【设计要求】设计十进制整数四则运算计算器。

(1)采用二叉树、栈等数据结构。

(2)给定表达式字符串,生成二叉链表的表达式二叉树。

(3)对表达式二叉树采用后序遍历求值并输出。

(4)可以考虑加入复数四则运算功能。

(5)其它完善性功能。

1.2 课题原理用二叉链表处理表达式字符串,用栈处理括号在表达式计算时的优先级问题,并且使用MFC编程语言实现可视化。

1.2.1二叉链表1.2.2栈处理符号表达式1.2.3MFC编程语言实现可视化用MFC语言中对按钮Button功能的添加,将外界输入的由数字0~9,符号“+”、“-”、“*”、“/”、“(”、“)”构成的表达式传入编辑框中的变量CString 中。

与此同时,可以使用退格键“←”执行退格功能和清屏键执行清屏功能。

并且使用“=”按钮时,对输入的表达式进行计算。

最终,由编辑框输出计算结果。

流程图如下流程图1开始输入表达式表达式入栈(反转表达式)转化为先序表达式后序遍历求值输出计算结果结束流程图21.3相关知识生成二叉链表,树的后序遍历,MFC编程语言实现可视化2需求分析2.1 课题调研整数十进制四则运算计算器,用户输入算式程序程序运行并输出运算结果。

2.2 用户需求分析(1)用户可以通过MFC按钮输入多项式;(2)可输入带括号的运算;(3)该程序应该有对用户错误输入的辨别纠错功能;(4)程序应具有演示功能和调试功能。

(5)程序应具有良好的人机接口。

(6)程序应能友好的展现结果。

3方案设计3.1 总体功能设计十进制整数四则运算3.2 数据结构设计栈结构,用来储存多项式及生成树;树结构,用来后序遍历以求多项式的值。

3.3 函数原型设计函数原型参数说明功能描述void turn(Stack &T,char d[max])void change(StackT,Stack &S)栈T,字符数组d[]栈T,栈S将输入的多项式压栈并转化为前缀表达式int CreatTree(Tree&T,Stack &S)Void PostOrder(TreeT,Stack &S)树T,栈S 建立二叉链表并且后序遍历求值3.4主算法设计⑴将输入的表达式压栈,并将其转换为前缀表达式;⑵由前缀表达式生成二叉链表;⑶后序遍历二叉树求值。

3.5 用户界面设计使用MFC编程语言设计界面如下:4 方案实现4.1 开发环境与工具主要编程环境:Blend for Visual Studio 2013编程工具:C++。

4.2 程序设计关键技术⑴将输入的表达式压栈,并将其转换为前缀表达式;⑵由前缀表达式生成二叉链表;⑶后序遍历二叉树求值。

4.3 个人设计实现(按组员分工)4.3.1 余灏然设计实现数据结构定义和描述:反转表达式及转换前缀表达式:#include"head.h"#include"fuhao.cpp"#include"iostream"using namespace std;void turn(Stack &T,char d[max]);void change(Stack T,Stack &S);void turn(Stack &T,char d[max]) //字符串输入表达式且压栈{int h,r=0; //h用于重置数字,r用于计位置data b;while(1){if(d[r]=='\0') break;if( In(d[r]) ){b.k=2;b.s=d[r++];Push(T,b);}else{h=0;while(d[r]!='\0'){if(d[r]=='+'||d[r]=='-'||d[r]=='*'||d[r]=='/'||d[r]=='('||d[r]==')') break;h*=10;switch(d[r]){case '1': h+=1;break;case '2': h+=2;break;case '3': h+=3;break;case '4': h+=4;break;case '5': h+=5;break;case '6': h+=6;break;case '7': h+=7;break;case '8': h+=8;break;case '9': h+=9;break;case '0': h+=0;break;default: cout<<"表达式有误!"; exit(0);}r++;}b.k=1;b.i=h;Push(T,b);}}}void change(Stack T,Stack &S) //转前置表达式{Stack P;InitStack(P);data a,b,c;a.k=2 ; a.s='=';Push(P,a);while(1){Pop(T,b);if(b.k==2 && b.s=='=') break;if(b.k==1) { Push(S,b);continue; }if(b.k==2){if( b.s==')' ) { Push(P,b);continue; }if( b.s!='('&& b.s!=')'){while(1){GetTop(P,c);if( Compare(b.s,c.s)=='>'||Compare(b.s,c.s)=='=') {Push(P,b);break;}else { Pop(P,c); Push(S,c);}}}if( b.s=='(' ){while(1){Pop(P,c);if(c.k==2 && c.s==')') break;Push(S,c);}}}}while(1){GetTop(P,c);if(c.k==2 && c.s=='=') break;Pop(P,c);Push(S,c);}}4.3.2 魏嘉设计实现符号相关操作:#include"iostream"using namespace std;char Compare(char a,char b);int In(char c);int Operate(int b,char x,int a);/*判断运算的优先顺序*/char Compare(char a,char b){char c;switch(a){case'+':if(b=='*'||b=='/'||b=='(')c='<';else c='>';break;case'-':if(b=='*'||b=='/'||b=='(')c='<';else c='>';break;case'*':if(b=='(')c='<';else c='>';break;case'/':if(b=='(')c='<';else c='>';break;case'(':if(b==')')c='=';else c='<';break;case')':c='>';break;case'=':if(b=='=')c='=';else c='<';break;}return c;}int In(char c){if(c=='+' || c=='-' || c=='*'|| c=='/'||c=='('||c==')'||c=='=')return 1;else return 0;}int Operate(int b,char x,int a){int z;switch(x){case'+': z=a+b;break;case'-': z=a-b;break;case'*': z=a*b;break;case'/': z=a/b;break;}return z;}#include"head.h"#include"fuhao.cpp"#include"iostream"using namespace std;void turn(Stack &T,char d[max]);void change(Stack T,Stack &S);typedef struct Node{data p;struct Node *lchild,*rchild;}Node,*Tree;后序遍历求值:void PostOrder(Tree T,Stack &S) //利用递归,后序遍历并求值,T为二叉树,S为存储用的栈{data a,b,c,d;if(T!=NULL){PostOrder(T->lchild,S);PostOrder(T->rchild,S);c=T->p;if(c.k==1) Push(S,c);if(c.k==2){Pop(S,b);Pop(S,a);d.k=1;d.i=Operate(b.i,c.s,a.i);Push(S,d);}}}4.3.3 张越设计实现建立二叉链表:#include"head.h"#include"fuhao.cpp"#include"iostream"using namespace std;void turn(Stack &T,char d[max]);void change(Stack T,Stack &S);typedef struct Node{data p;struct Node *lchild,*rchild;}Node,*Tree;int CreatTree(Tree &T,Stack &S) //建立二叉链表{data b,c;Pop(S,b);if(b.k==1) //当遇数字时,在后面补两个空位,用于建立二叉树{ c.k=3; Push(S,c); Push(S,c);}if(b.k==3) T=NULL;else{if(!(T=(Node*)malloc(sizeof(Node)))) exit(-1);T->p=b;CreatTree(T->lchild,S);CreatTree(T->rchild,S);}return(1);}栈的创建与操作:#include"iostream"using namespace std;#define STACK_INIT_SIZE 100#define STACKINCREMENT 10#define max 50typedef struct Ndata{int k; // 判断用k=1: 数字2:符号3:返回,用于二叉树的建立int i; //数字char s; //符号}data;typedef struct NStack{data *base;data *top;int stacksize;}Stack;int InitStack(Stack & S){S.base=(data*)malloc(STACK_INIT_SIZE * sizeof(data) );if(!S.base) exit(0);S.top=S.base;S.stacksize=STACK_INIT_SIZE;return 1;}int GetTop(Stack S,data &e){if(S.top==S.base) return 0;e= *(S.top-1);return 1;}int Push(Stack &S,data e){if(S.top-S.base>=S.stacksize){S.base=(data*)realloc(S.base,(S.stacksize + STACKINCREMENT)* sizeof(data));if(!S.base) exit(0);S.top=S.base+S.stacksize;S.stacksize+=STACKINCREMENT;}*(S.top++) = e;return 1;}int Pop(Stack &S,data &e){if(S.top==S.base) return 0;e= *--S.top;return 1;}void ClearStack(Stack &S) //把栈置空,只留栈底{data e;while(1){GetTop(S,e);if(e.k==-1 ) break;Pop(S,e);}}5 测试与调试5.1 个人测试(按组员分工)5.1.1 余灏然测试#include"head.h"#include"fuhao.cpp"#include"iostream"using namespace std;void turn(Stack &T,char d[max]);void change(Stack T,Stack &S);void main(){static char d[max];Stack T,S,P; // T为反转栈,S用于输出先序表达式InitStack(T);InitStack(S);InitStack(P);data a,b,c;b.k=2 ; b.s='='; a.k=1;Push(T,b);Push(S,b);Push(P,b);cout<<"请输入表达式:";cin>>d;turn(P,d);cout<<"前缀表达式:";while(1){Pop(P,c);if(c.k==2&&c.s=='=') break;if(c.k==1) cout<<c.i;if(c.k==2) cout<<c.s;}turn(T,d); //反转,将栈由栈顶输出到栈底的顺序即为反转顺序change(T,S); //转化成前序表达式,T为转变前,S为转变后cout<<endl<<"前缀表达式:";while(1){Pop(S,a);if(a.k==2&&a.s=='=') break;if(a.k==1) cout<<a.i;if(a.k==2) cout<<a.s;}cout<<endl;}void turn(Stack &T,char d[max]) //字符串输入表达式且压栈{int h,r=0; //h用于重置数字,r用于计位置data b;while(1){if(d[r]=='\0') break;if( In(d[r]) ){b.k=2;b.s=d[r++];Push(T,b);}else{h=0;while(d[r]!='\0'){if(d[r]=='+'||d[r]=='-'||d[r]=='*'||d[r]=='/'||d[r]=='('||d[r]==')') break;h*=10;switch(d[r]){case '1': h+=1;break;case '2': h+=2;break;case '3': h+=3;break;case '4': h+=4;break;case '5': h+=5;break;case '6': h+=6;break;case '7': h+=7;break;case '8': h+=8;break;case '9': h+=9;break;case '0': h+=0;break;default: cout<<"表达式有误!"; exit(0);}r++;}b.k=1;b.i=h;Push(T,b);}}}void change(Stack T,Stack &S) //转前置表达式{Stack P;InitStack(P);data a,b,c;a.k=2 ; a.s='=';Push(P,a);while(1){Pop(T,b);if(b.k==2 && b.s=='=') break;if(b.k==1) { Push(S,b);continue; }if(b.k==2){if( b.s==')' ) { Push(P,b);continue; }if( b.s!='('&& b.s!=')'){while(1){GetTop(P,c);if( Compare(b.s,c.s)=='>'||Compare(b.s,c.s)=='=') {Push(P,b);break;}else { Pop(P,c); Push(S,c);}}}if( b.s=='(' ){while(1){Pop(P,c);if(c.k==2 && c.s==')') break;Push(S,c);}}}}while(1){GetTop(P,c);if(c.k==2 && c.s=='=') break;Pop(P,c);Push(S,c);}}测试结果:5.1.2 魏嘉测试符号相关操作:#include"iostream"using namespace std;char Compare(char a,char b);int In(char c);int Operate(int b,char x,int a);void main(){int i,j,k;char a,b,s;while(1){cout<<"请选择操作1.符号优先级判断2.判断是否是符号3.两个数的四则运算:";cin>>i;if(i==1){cout<<"请输入两个符号:";cin>>a>>b;s=Compare(a,b);cout<<"优先级:"<<s<<endl<<endl;}if(i==2){cout<<"请输入一个字符";cin>>s;if(In(s)) cout<<"是运算符"<<endl;else cout<<"非运算符"<<endl;}if(i==3){cout<<"请输入2个数字:";cin>>j>>k;cout<<"请选择加减乘除:";cin>>s;j=Operate(k,s,j);cout<<"结果为"<<j<<endl;}}}/*判断运算的优先顺序*/char Compare(char a,char b){char c;switch(a){case'+':if(b=='*'||b=='/'||b=='(')c='<';else c='>';break;case'-':if(b=='*'||b=='/'||b=='(')c='<';else c='>';break;case'*':if(b=='(')c='<';else c='>';break;case'/':if(b=='(')c='<';else c='>';break;case'(':if(b==')')c='=';else c='<';break;case')':c='>';break;case'=':if(b=='=')c='=';else c='<';break;}return c;}int In(char c){if(c=='+' || c=='-' || c=='*'|| c=='/'||c=='('||c==')'||c=='=') return 1;else return 0;}测试结果:int Operate(int b,char x,int a){int z;switch(x){case'+': z=a+b;break;case'-': z=a-b;break;case'*': z=a*b;break;case'/': z=a/b;break;}return z;}#include"head.h"#include"fuhao.cpp"#include"iostream"using namespace std;void turn(Stack &T,char d[max]); void change(Stack T,Stack &S); typedef struct Node{data p;struct Node *lchild,*rchild;}Node,*Tree;void main(){void PostOrder(Tree T,Stack &S);void main2(Tree &T);Stack P;Tree T;InitStack(P);data b;b.k=2 ;b.s='=';Push(P,b);main2(T);PostOrder(T,P);GetTop(P,b);cout<<"表达式值为"<<b.i<<endl;}后序遍历求值:void PostOrder(Tree T,Stack &S) //利用递归,后序遍历并求值,T为二叉树,S为存储用的栈{data a,b,c,d;if(T!=NULL){PostOrder(T->lchild,S);PostOrder(T->rchild,S);c=T->p;if(c.k==1) Push(S,c);if(c.k==2){Pop(S,b);Pop(S,a);d.k=1;d.i=Operate(b.i,c.s,a.i);Push(S,d);}}}测试结果:5.1.3 张越测试#include"head.h"#include"fuhao.cpp"#include"iostream"using namespace std;void turn(Stack &T,char d[max]);void change(Stack T,Stack &S);typedef struct Node{data p;struct Node *lchild,*rchild;}Node,*Tree;void main(){Stack main1();int CreatTree(Tree &T,Stack &S);Stack S;Tree T;InitStack(S);data b,c;int i;b.k=2 ; b.s='=';Push(S,b);S=main1();CreatTree(T,S);cout<<"表达式树建立成功!"<<endl;cout<<"根节点值为:";while(1){c=T->p;if(c.k==1) cout<<c.i<<endl;if(c.k==2) cout<<c.s<<endl;cout<<"访问左孩子1,访问右孩子2:";cin>>i;if(i==1) T=T->lchild;if(i==2) T=T->rchild;}}int CreatTree(Tree &T,Stack &S) //建立二叉链表{data b,c;Pop(S,b);if(b.k==1) //当遇数字时,在后面补两个空位,用于建立二叉树{ c.k=3; Push(S,c); Push(S,c);}if(b.k==3) T=NULL;else{if(!(T=(Node*)malloc(sizeof(Node)))) exit(-1);T->p=b;CreatTree(T->lchild,S);CreatTree(T->rchild,S);}return(1);}测试结果:栈的创建与操作:#include"iostream"using namespace std;#define STACK_INIT_SIZE 100#define STACKINCREMENT 10#define max 50typedef struct Ndata{int k; // 判断用k=1: 数字2:符号3:返回,用于二叉树的建立int i; //数字char s; //符号}data;typedef struct NStack{data *base;data *top;int stacksize;}Stack;int InitStack(Stack & S){S.base=(data*)malloc(STACK_INIT_SIZE * sizeof(data) );if(!S.base) exit(0);S.top=S.base;S.stacksize=STACK_INIT_SIZE;return 1;}int GetTop(Stack S,data &e){if(S.top==S.base) return 0;e= *(S.top-1);return 1;}int Push(Stack &S,data e){if(S.top-S.base>=S.stacksize){S.base=(data*)realloc(S.base,(S.stacksize + STACKINCREMENT)* sizeof(data));if(!S.base) exit(0);S.top=S.base+S.stacksize;S.stacksize+=STACKINCREMENT;}*(S.top++) = e;return 1;}int Pop(Stack &S,data &e){if(S.top==S.base) return 0;e= *--S.top;return 1;}void ClearStack(Stack &S) //把栈置空,只留栈底{data e;while(1){GetTop(S,e);if(e.k==-1 ) break;Pop(S,e);}}void main(){int i;Stack T;InitStack(T);cout<<"创建栈成功!"<<endl;data a,b;a.k=-1;a.i=-1;Push(T,a);while(1){cout<<"对栈进行操作:1.存入数据2.获取栈顶元素3.取出并删除栈顶元素4.置空栈,只留栈底 5.结束:";cin>>i;if(i==1){cout<<"请输入2个数字:";cin>>b.k>>b.i;Push(T,b);cout<<"已成功存入栈里!"<<endl;}if(i==2){GetTop(T,b);cout<<b.k<<" "<<b.i<<endl;}if(i==3){Pop(T,b);cout<<b.k<<" "<<b.i<<endl;}if(i==4){ClearStack(T);cout<<"置空成功!"<<endl;}getchar();getchar();if(i==5) break;}}测试结果:5.2 组装与系统测试5.3 系统运行6 课题总结6.1 课题评价按照课题的要求,我们组同学进行了分工,实现了其所规定的设计要求,并且有所拓展,运用课本上的知识及学习了一些本来未曾接触的知识,运用陌生的类模板实现了掌握较为熟练的功能。

相关文档
最新文档