表达式求值程序设计说明书

合集下载

表达式求值问题课程设计

表达式求值问题课程设计

表达式求值问题课程设计一、课程目标知识目标:1. 学生能理解并掌握表达式求值的基本概念和规则,包括运算符优先级、括号的运用等。

2. 学生能够正确构建并简化数学表达式,熟练运用算术运算规则进行求值。

3. 学生能运用所学知识解决实际问题,如根据给定的条件编写表达式,并计算出结果。

技能目标:1. 学生培养逻辑思维能力,通过分析问题,能合理设计表达式并进行求值。

2. 学生通过实际操作,提高解决数学问题的计算速度和准确性。

3. 学生通过小组讨论和问题解决,提升合作能力和交流表达能力。

情感态度价值观目标:1. 学生培养对数学的兴趣,认识到数学在日常生活和未来学习中的重要性。

2. 学生在学习过程中树立正确的价值观,明白诚实求是的科学态度是学习数学的基础。

3. 学生通过解决表达式求值问题,增强自信心,培养勇于尝试和克服困难的积极态度。

课程性质分析:本课程为数学学科,针对五年级学生设计。

该阶段学生具备一定的数学基础和逻辑思维能力,需要通过表达式求值问题进一步巩固算术运算规则,提高解题能力。

学生特点分析:五年级学生处于好奇心强、求知欲旺的时期,他们喜欢探索和解决问题。

但同时,个别学生可能在数学学习上存在困难,需要教师关注并给予个性化指导。

教学要求:1. 教学内容紧密联系课本,确保学生能够掌握基础知识。

2. 教学过程中注重启发式教学,引导学生主动思考、积极参与。

3. 教学评价关注学生的过程表现,鼓励合作与交流,注重培养学生的综合能力。

二、教学内容本课程依据课程目标,结合课本第五章“数的运算”相关内容,组织以下教学大纲:1. 表达式求值基本概念:- 运算符的种类及优先级- 表达式的构成要素- 括号在表达式中的作用2. 算术运算规则:- 加、减、乘、除四则运算- 混合运算的表达式构建与简化- 乘方和开方的运算规则3. 表达式求值方法:- 逐步计算法- 分步骤代入法- 运用算术性质简化表达式4. 实际问题与表达式求值:- 根据实际问题编写表达式- 应用表达式求解问题- 分析实际问题的数量关系教学内容安排与进度:第一课时:表达式求值基本概念及运算符优先级第二课时:算术运算规则及表达式构建第三课时:表达式求值方法及简化技巧第四课时:实际问题与表达式求值的综合应用教材章节关联:《数学》五年级上册第五章“数的运算”:- 第1节 运算顺序与运算定律- 第2节 四则混合运算- 第3节 乘方与开方- 第4节 应用题与表达式求值三、教学方法为有效达成教学目标,本课程将采用以下多样化的教学方法:1. 讲授法:教师通过生动的语言和形象的比喻,对表达式求值的基本概念、运算规则进行讲解,确保学生掌握必要的理论知识。

表达式求值程序设计说明书

表达式求值程序设计说明书

汇编语言实训课程设计任务书题目:表达式求值程序班级:计算机科学与技术一班学生姓名:赵旭尧学号: 14730141 题目类型:软件工程(R)指导教师:刘树群一.题目简介该设计要求学生使用汇编语言,设计并开发出针对四则运算表达式进行求值的命令行或窗口程序。

通过该题目的设计过程,可以培养学生结构化程序设计的思想,加深对汇编语言基本语言要素和流程结构的理解,针对汇编语言中的重点和难点内容进行训练,独立完成有一定工作量的程序设计任务,同时强调好的程序设计风格。

得到软件工程的综合训练,提高解决实际问题的能力。

二.设计任务1、查阅文献资料,一般在5篇以上;2、通过键盘输入表达式,进行针对整数的“加减乘除”四则运算表达式进行求值,有良好的界面;3、完成软件结构设计和算法设计;4、完成系统的软件开发和测试工作;5、撰写设计说明书;6、做好答辩工作。

三.主要内容、功能及技术指标1、实现功能及指标:①使用Win32的窗口程序模式,实现表达式求值程序及测试界面程序的设计与开发;②支持整数的四则运算、位运算和小括号等;③使用文本框对表达式进行交互式编辑和输出。

2、问题分析及解决方案框架确定:充分地分析和理解问题本身,弄清要求做什么。

在确定解决方案框架过程中,综合考虑系统功能,考虑怎样使系统结构清晰、合理、简单和易于调试。

最后确定每个过程和函数的简单功能,以及过程(或函数)之间的调用关系,并画出函数之间的调用关系图。

3、详细设计和编码:定义相应的存储结构,确定各个函数的算法,并画出流程图,在此基础上进行代码设计,每个明确的功能模块程序一般不超过200行,否则要进一步划分。

4、完成课程设计报告①需求和规格说明:设计题目和问题描述:题目要解决的问题是什么;②设计思路:主要算法思想,程序功能图,函数之间的调用关系图;设计表示:每个函数或过程的功能,列出每个过程或函数所调用的过程或函数,并画出各函数的流程图;详细设计:主要算法的伪代码;③调试报告:调试过程中遇到的主要问题,是如何解决的;对设计和编码的回顾讨论和分析;改进设想;经验和体会等;④程序实现注释;⑤附录:源程序清单和结果。

数据结构课程设计-表达式求值【完整版】

数据结构课程设计-表达式求值【完整版】

XXXXXX大学《数据结构》课程设计报告班级:学号:姓名:指导老师:目录一算术表达式求值一、需求分析二、程序得主要功能三、程序运行平台四、数据结构五、算法及时间复杂度六、测试用例七、程序源代码二感想体会与总结算术表达式求值一、需求分析一个算术表达式就是由操作数(operand)、运算符(operator)与界限符(delimiter)组成得。

假设操作数就是正整数,运算符只含加减乘除等四种运算符,界限符有左右括号与表达式起始、结束符“#”,如:#(7+15)*(23—28/4)#。

引入表达式起始、结束符就是为了方便.编程利用“算符优先法”求算术表达式得值.二、程序得主要功能(1)从键盘读入一个合法得算术表达式,输出正确得结果。

(2)显示输入序列与栈得变化过程。

三、程序运行平台Visual C++6、0版本四、数据结构本程序得数据结构为栈。

(1)运算符栈部分:struct SqStack //定义栈{char *base; //栈底指针char *top; //栈顶指针intstacksize; //栈得长度};intInitStack (SqStack &s) //建立一个空栈S{if (!(s、base= (char *)malloc(50*sizeof(char))))exit(0);s、top=s、base;s、stacksize=50;return OK;}char GetTop(SqStack s,char &e) //运算符取栈顶元素{if (s、top==s、base) //栈为空得时候返回ERROR{ﻩ printf("运算符栈为空!\n");ﻩ return ERROR;}elsee=*(s、top-1); //栈不为空得时候用e做返回值,返回S得栈顶元素,并返回OK returnOK;}int Push(SqStack&s,char e) //运算符入栈{if (s、top—s、base >= s、stacksize)ﻩ{printf("运算符栈满!\n");ﻩs、base=(char*)realloc(s、base,(s、stacksize+5)*sizeof(char));//栈满得时候,追加5个存储空间if(!s、base)exit (OVERFLOW);s、top=s、base+s、stacksize;s、stacksize+=5;}ﻩ*(s、top)++=e;//把e入栈ﻩreturn OK;}int Pop(SqStack &s,char &e) //运算符出栈{if (s、top==s、base) //栈为空栈得时候,返回ERROR{printf("运算符栈为空!\n”);ﻩ return ERROR;}else{ﻩﻩe=*-—s、top;//栈不为空得时候用e做返回值,删除S得栈顶元素,并返回OK return OK;}}int StackTraverse(SqStack&s)//运算符栈得遍历{ﻩchar *t;ﻩt=s、base;ﻩif (s、top==s、base){ﻩ printf(”运算符栈为空!\n”); //栈为空栈得时候返回ERRORreturn ERROR;}while(t!=s、top){ﻩﻩprintf(" %c",*t); //栈不为空得时候依次取出栈内元素t++;ﻩ}return ERROR;}(2)数字栈部分:struct SqStackn//定义数栈{int *base; //栈底指针int*top; //栈顶指针int stacksize; //栈得长度};intInitStackn (SqStackn &s) //建立一个空栈S{s、base=(int*)malloc(50*sizeof(int));if(!s、base)exit(OVERFLOW);//存储分配失败s、top=s、base;s、stacksize=50;return OK;}int GetTopn(SqStackn s,int&e) //数栈取栈顶元素{if(s、top==s、base){printf("运算数栈为空!\n");//栈为空得时候返回ERRORﻩ return ERROR;}elseﻩe=*(s、top-1);//栈不为空得时候,用e作返回值,返回S得栈顶元素,并返回OKreturnOK;}int Pushn(SqStackn &s,int e) //数栈入栈{if(s、top—s、base>=s、stacksize){ﻩﻩprintf("运算数栈满!\n");//栈满得时候,追加5个存储空间ﻩs、base=(int*)realloc (s、base,(s、stacksize+5)*sizeof(int));if(!s、base) exit (OVERFLOW);ﻩs、top=s、base+s、stacksize;//插入元素e为新得栈顶元素s、stacksize+=5;}*(s、top)++=e; //栈顶指针变化returnOK;}int Popn(SqStackn &s,int &e)//数栈出栈{ﻩif (s、top==s、base){ﻩ printf("运算符栈为空!\n");//栈为空栈得视时候,返回ERRORﻩ return ERROR;ﻩ}else{ﻩﻩe=*—-s、top;//栈不空得时候,则删除S得栈顶元素,用e返回其值,并返回OK ﻩreturnOK;}}int StackTraversen(SqStackn &s)//数栈遍历{ﻩint*t;ﻩt=s、base ;ﻩif(s、top==s、base)ﻩ{printf("运算数栈为空!\n”);//栈为空栈得时候返回ERRORﻩ return ERROR;ﻩ}ﻩwhile(t!=s、top)ﻩ{printf(” %d”,*t); //栈不为空得时候依次输出t++;}return ERROR;}五、算法及时间复杂度1、算法:建立两个不同类型得空栈,先把一个‘#’压入运算符栈。

数据结构课程设计四则运算表达式求值(C语言版)

数据结构课程设计四则运算表达式求值(C语言版)

数据结构课程设计四则运算表达式求值(C语⾔版) 明⼈不说暗话,直接上,输⼊提取码z3fy即可下载。

⽂件中包含程序,程序运⾏⽂件,设计报告和测试样例,应有尽有,欢迎⼩伙伴们在中下载使⽤。

本课程设计为四则运算表达式求值,⽤于带⼩括号的⼀定范围内正负数的四则运算标准(中缀)表达式的求值。

注意事项:1、请保证输⼊的四则表达式的合法性。

输⼊的中缀表达式中只能含有英⽂符号“+”、“-”、“*”、“/”、“(”、“)”、“=”、数字“0”到“9”以及⼩数点“.”,输⼊“=”表⽰输⼊结束。

例如9+(3-1)*3.567+10/2=,特别是请勿输⼊多余空格和中⽂左右括号。

2、输⼊的中缀表达式默认限定长度是1001,可根据具体情况调整字符串数组的长度。

3、请保证输⼊的操作数在double数据类型范围内,单个数字有效数字长度不可超过15位。

本课程设计中操作数是C语⾔中的双精度浮点数类型。

4、本课程设计中的运算数可以是负数,另外如果是正数可直接省略“+”号(也可带“+”号)。

 下⾯的程序正常运⾏需要在上⾯的百度⽹盘中下载相应⽂件,否则⽆法正常使⽤哦。

1/*本程序为四则运算表达式求值系统,⽤于计算带⼩括号的四则运算表达式求值。

2具体算法:3先将字符串处理成操作单元(操作数或操作符),再利⽤栈根据四则运算4的运算法则进⾏计算,最后得出结果。

*/56 #include<stdio.h>7 #include<ctype.h>8 #include<stdlib.h>9 #include<string.h>10 #include<stdlib.h>11 #include<ctype.h>1213const int Expmax_length = 1001;//表达式最⼤长度,可根据适当情况调整14struct Ope_unit15 {//定义操作单元16int flag;//=1表⽰是操作数 =0表⽰是操作符 -1表⽰符号单元17char oper;//操作符18double real;//操作数,为双精度浮点数19 };2021void Display();//菜单22void Instru(); //使⽤说明23int Check(char Exp_arry[]);24void Evalua(); //先调⽤Conver操作单元化,再调⽤Calculate函数计算结果并输出25int Conver(struct Ope_unit Opeunit_arry[],char Exp_arry[]);//将字符串处理成操作单元26int Isoper(char ch);//判断合法字符(+ - * / ( ) =)27int Ope_Compar(char ope1,char ope2);//操作符运算优先级⽐较28double Calculate(struct Ope_unit Opeunit_arry[],int Opeunit_count,int &flag);//⽤栈计算表达式结果29double Four_arithm(double x,double y,char oper);//四则运算3031int main()32 {33int select;34while(1)35 {36 Display();37 printf("请输⼊欲执⾏功能对应的数字:");38 scanf("%d",&select);39 printf("\n");40switch(select)41 {42case1: Evalua(); break;43case2: Instru(); break;44case0: return0;45default : printf("⽆该数字对应的功能,请重新输⼊\n");46 system("pause");47 }48 }49return0;50 }5152int Check(char Exp_arry[])53 {//检查是否有⾮法字符,返回1表⽰不合法,0表⽰合法54int Explength=strlen(Exp_arry),i;55for(i=0;i<Explength;i++)56 {57if(!Isoper(Exp_arry[i]) && Exp_arry[i] != '.' && !isdigit(Exp_arry[i]))58return1;59if(isdigit(Exp_arry[i]))60 {61int Dig_number=0,Cur_positoin=i+1;62while(isdigit(Exp_arry[Cur_positoin]) || Exp_arry[Cur_positoin]=='.')63 {64 Dig_number++;65 Cur_positoin++;66 }67if(Dig_number >= 16)//最多能够计算15位有效数字68return1;69 }70 }71return0;72 }7374void Evalua()75 {//先调⽤Conver函数将字符串操作单元化,再调⽤Calculate函数计算结果并输出76char Exp_arry[Expmax_length];77int flag=0;//假设刚开始不合法,1表达式合法,0不合法78struct Ope_unit Opeunit_arry[Expmax_length];7980 getchar();//吃掉⼀个换⾏符81 printf("请输⼊四则运算表达式,以=结尾:\n");82 gets(Exp_arry);83 flag=Check(Exp_arry);84if(flag)85 printf("该表达式不合法!\n");86else87 {88int Opeunit_count = Conver(Opeunit_arry,Exp_arry);89double ans = Calculate(Opeunit_arry,Opeunit_count,flag);90if(flag)91 {92 printf("计算结果为:\n");93 printf("%s%lf\n",Exp_arry,ans);94 }95else96 printf("该表达式不合法!\n");97 }98 system("pause");99 }100101int Conver(struct Ope_unit Opeunit_arry[],char Exp_arry[])102 {//将字符串操作单元化103int Explength=strlen(Exp_arry);104int i,Opeunit_count=0;105for(i=0;i<Explength;i++)106 {107if(Isoper(Exp_arry[i]))//是操作符108 {109 Opeunit_arry[Opeunit_count].flag=0;110 Opeunit_arry[Opeunit_count++].oper=Exp_arry[i];111 }112else//是操作数113 {114 Opeunit_arry[Opeunit_count].flag=1;115char temp[Expmax_length];116int k=0;117for(; isdigit(Exp_arry[i]) || Exp_arry[i]=='.' ;i++)118 {119 temp[k++]=Exp_arry[i];120 }121 i--;122 temp[k]='\0';123 Opeunit_arry[Opeunit_count].real=atof(temp);//将字符转化为浮点数124125//负数126if(Opeunit_count == 1 && Opeunit_arry[Opeunit_count-1].flag==0127 && Opeunit_arry[Opeunit_count-1].oper=='-')128 {129 Opeunit_arry[Opeunit_count-1].flag = -1;130 Opeunit_arry[Opeunit_count].real *= -1;131 }// -9132if(Opeunit_count >= 2 && Opeunit_arry[Opeunit_count-1].flag==0133 && Opeunit_arry[Opeunit_count-1].oper=='-' && Opeunit_arry[Opeunit_count-2].flag==0 134 && Opeunit_arry[Opeunit_count-2].oper !=')')135 {136 Opeunit_arry[Opeunit_count-1].flag = -1;137 Opeunit_arry[Opeunit_count].real *= -1;138 }// )-9139140//正数141if(Opeunit_count == 1 && Opeunit_arry[Opeunit_count-1].flag==0142 && Opeunit_arry[Opeunit_count-1].oper=='+')143 {144 Opeunit_arry[Opeunit_count-1].flag = -1;145 }// +9146if(Opeunit_count >= 2 && Opeunit_arry[Opeunit_count-1].flag==0147 && Opeunit_arry[Opeunit_count-1].oper=='+' && Opeunit_arry[Opeunit_count-2].flag==0148 && Opeunit_arry[Opeunit_count-2].oper !=')')149 {150 Opeunit_arry[Opeunit_count-1].flag = -1;151 }// )+9152 Opeunit_count++;153 }154 }155/*for(i=0;i<Opeunit_count;i++)156 {//查看各操作单元是否正确,1是操作数,0是操作符157 if(Opeunit_arry[i].flag == 1)158 printf("该单元是操作数为:%lf\n",Opeunit_arry[i].real);159 else if(Opeunit_arry[i].flag == 0)160 printf("该单元是操作符为:%c\n",Opeunit_arry[i].oper);161 else162 printf("该单元是负号符为:%c\n",Opeunit_arry[i].oper);163 }*/164return Opeunit_count;165 }166167double Calculate(struct Ope_unit Opeunit_arry[],int Opeunit_count,int &flag)168 {//根据运算规则,利⽤栈进⾏计算169int i,dS_pointer=0,oS_pointer=0;//dS_pointer为操作数栈顶指⽰器,oS_pointer为操作符栈顶指⽰器170double Dig_stack[Expmax_length];//操作数栈(顺序存储结构)171char Ope_stack[Expmax_length];//操作符栈172173for(i=0;i<Opeunit_count-1;i++)174 {175if( Opeunit_arry[i].flag != -1 )176 {177if(Opeunit_arry[i].flag)//是操作数178 {179 Dig_stack[dS_pointer++]=Opeunit_arry[i].real;//⼊操作数栈180//printf("%lf\n",Digit[dS_pointer-1]);181 }182else//是操作符 + - * / ( )183 {184//操作符栈为空或者左括号⼊栈185if(oS_pointer==0 || Opeunit_arry[i].oper=='(')186 {187 Ope_stack[oS_pointer++]=Opeunit_arry[i].oper;188//printf("%oS_pointer\Ope_u_count",Operator[oS_pointer-1]);189 }190else191 {192if(Opeunit_arry[i].oper==')')//是右括号将运算符⼀直出栈,直到遇见左括号193 {194 oS_pointer--;//指向栈顶195 dS_pointer--;//指向栈顶196while(Ope_stack[oS_pointer] != '(' && oS_pointer != 0)197 {198 Dig_stack[dS_pointer-1] = Four_arithm(Dig_stack[dS_pointer-1],Dig_stack[dS_pointer], 199 Ope_stack[oS_pointer--]);//oS_pointer--为操作符出栈200201 dS_pointer--;//前⼀个操作数出栈202//printf("操作数栈顶元素等于%lf\n",Digit[dS_pointer]);203 }204 oS_pointer--;//左括号出栈205206 oS_pointer++;//恢复指向栈顶之上207 dS_pointer++;208 }209else if(Ope_Compar(Opeunit_arry[i].oper,Ope_stack[oS_pointer-1]))//和栈顶元素⽐较210 {211 Ope_stack[oS_pointer++]=Opeunit_arry[i].oper;212//printf("%oS_pointer\Ope_u_count",Operator[oS_pointer-1]);213 }214else//运算符出栈,再将该操作符⼊栈215 {216 oS_pointer--;//指向栈顶217 dS_pointer--;//指向栈顶218while(Ope_Compar(Opeunit_arry[i].oper,Ope_stack[oS_pointer])==0 && oS_pointer != -1) 219 {//当前操作符⽐栈顶操作符优先级⾼220 Dig_stack[dS_pointer-1]=Four_arithm(Dig_stack[dS_pointer-1],Dig_stack[dS_pointer], 221 Ope_stack[oS_pointer--]);222 dS_pointer--;223//printf("操作数栈顶元素等于%lf\n",Digit[dS_pointer]);224 }225 oS_pointer++;//恢复指向栈顶之上226 dS_pointer++;227 Ope_stack[oS_pointer++]=Opeunit_arry[i].oper;228 }229 }230 }231 }232 }233/*for(i=0;i<oS_pointer;i++)234 printf("操作符栈%oS_pointer\Ope_u_count",Operator[i]);235 for(i=0;i<dS_pointer;i++)236 printf("操作数栈%lf\n",Digit[i]);*/237 oS_pointer--;//指向栈顶元素238 dS_pointer--;//指向栈顶元素239while(oS_pointer != -1)240 {241 Dig_stack[dS_pointer-1]=Four_arithm(Dig_stack[dS_pointer-1],Dig_stack[dS_pointer], 242 Ope_stack[oS_pointer--]);//oS_pointer--为操作符出栈243 dS_pointer--;//前⼀个操作数出栈244//printf("操作数栈顶元素为%lf\Ope_u_count",Digit[dS_pointer]);245 }246//printf("%dS_pointer,%dS_pointer\n",oS_pointer,dS_pointer);247if(oS_pointer==-1 && dS_pointer==0)248 flag=1;//为1表⽰表达式合法249return Dig_stack[0];250 }251252int Ope_Compar(char ope1,char ope2)253 {//操作符运算优先级⽐较254char list[]={"(+-*/"};255int map[5][5]={//先⾏后列,⾏⽐列的运算级优先级低为0,⾼为1256// ( + - * /257/* ( */1,0,0,0,0,258/* + */1,0,0,0,0,259/* - */1,0,0,0,0,260/* * */1,1,1,0,0,261/* / */1,1,1,0,0 };262int i,j;263for(i=0;i<5;i++)264if(ope1==list[i]) break;265for(j=0;j<5;j++)266if(ope2==list[j]) break;267return map[i][j];268 }269270double Four_arithm(double x,double y,char oper)271 {//四则运算272switch(oper)//保证不含其它运算符273 {274case'+': return x+y;275case'-': return x-y;276case'*': return x*y;277case'/': return x/y;//y不能为0278default : return0;279 }280 }281282int Isoper(char ch)283 {//判断合法字符 + - * / ( ) =284if(ch=='+' || ch=='-' || ch=='*' || ch=='/' || ch=='(' || ch==')' || ch=='=')285return1;286return0;287 }288289void Display()290 {//打印菜单291 system("cls");292 printf("/******************************************************************************/\n");293 printf("\t\t 欢迎使⽤本四则运算表达式求值系统\n");294 printf("\n\t说明:建议请您先阅读使⽤说明,再输⼊相应的数字进⾏操作,谢谢配合!\n"); 295 printf("\n\t\t1 四则运算表达式求值\n");296 printf("\n\t\t2 使⽤说明\n");297 printf("\n\t\t0 退出\n");298 printf("/******************************************************************************/\n");299 }300301void Instru()302 {//打印使⽤说明303 FILE *fp;304char ch;305if( ( fp=fopen("使⽤说明.txt","r") ) == NULL)306 {307 printf("⽂件打开失败!\n");308 exit(0);309 }310for(; (ch = fgetc(fp)) != EOF; )311 putchar(ch);312 fclose(fp);313 printf("\n");314 system("pause");315 }。

算术表达式的求解课程设计说明书

算术表达式的求解课程设计说明书

一、设计题目算术表达式的求解二、设计内容给定一个算术表达式,通过程序求出最后的结果。

具体内容如下:(1)从键盘输入要求解的算术表达式;(2)采用栈结构进行算术表达式的求解过程;(3)能够判断算术表达式正确与否;(4)对于错误表达式给出提示;(5)对于正确的表达式给出最后的结果;三、概要设计设计的内容,可以确定所需的模块及模块间调用关系如流程图所示:模块的关系图四、算法描述栈结构进行算术表达式的求解过程,其各个模块的流程图,如下图所示:创建栈出栈栈的索引值index遍历栈设计源代码#include "iostream.h" #include "stdlib.h" #include "math.h" #include "time.h" #define TRUE 1 #define FALSE 0 #define ERROR -1压栈简单的四则运算运算符typedef int Status; //用模板实现的链式结构堆栈类template <class T>class stack{private:struct link{T data; //结点数据域link *next; //下一结点指针link(T Data,link* Next){//结构体构造函数data=Data;next=Next;}}*head; //堆栈顶指针public:stack(); //构造函数(初始化栈)~stack(); //析构函数(销毁栈)void push(T Data); //压栈操作T gettop()const; //取栈顶元素T pop(); //出栈操作T getvalue(int index); //返回栈底开始第INDEX个栈中值void traverse(int n); //遍历栈N个数换行int empty(); //判断栈是否为空,1是,0非int sizeofstack(); //返回栈的大小void clear(); //清空栈};//类模板成员函数的实现template<class T> stack<T>::stack()//构造函数{head=0;}template<class T> stack<T>::~stack()//析构函数{link* cursor=head;while(head){cursor=cursor->next;delete head;head=cursor;}}template<class T>void stack<T>::push(T Data)//压栈操作{head=new link(Data,head);}template<class T>T stack<T>::gettop()const //取栈顶元素{return head->data;}template<class T>T stack<T>::pop() //出栈操作{if(head==0)return 0;T result=head->data;link* oldhead=head;head=head->next;delete oldhead;return result;}template <class T>T stack<T>::getvalue(int index)//返回栈底开始第INDEX个栈中值{link *cursor=head;int i=1;int stacklen=sizeofstack();if(index<=0||index>stacklen)return 0;while(i<=(stacklen-index)){cursor=cursor->next;i++;}return cursor->data;}template <class T> void stack<T>::traverse(int n)//遍历栈{link * cursor=head;int iEnterSign=1; //换行标识while(cursor){cout<<cursor->data<<" ";if(iEnterSign%n==0)cout<<endl;cursor=cursor->next;iEnterSign++;}if((iEnterSign-1)%n!=0)cout<<endl;}template <class T>int stack<T>::empty() //判断栈是否为空,1是,0非{return head==0?1:0;}template <class T>int stack<T>::sizeofstack() //返回栈的大小{int size=0;link *cursor=head;while(cursor){cursor=cursor->next;size++;}return size;}template<class T> void stack<T>:: clear() //清空栈{link *cursor=head;while(cursor&&cursor->next){cursor=cursor->next;delete head;head=cursor;}}int Operator(char ch){if(ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch=='('||ch==')'||ch=='#')return(TRUE);elsereturn(FALSE);}char Precede(char ch1,char ch2){char ch;switch(ch1){case '+':case '-':{switch(ch2){case '+':case '-':case ')':case '#':ch='>'; break;case '*':case '/':case '(':ch='<';break;}break;}case '*':case '/':{if(ch2=='(')ch='<';elsech='>';break;}case '(':{if(ch2==')')ch='=';elsech='<';break;}case ')':{ch='>';break;}case '#':{if(ch2=='#')ch='=';elsech='<';break;}}return(ch);}int calc(int x,char ch,int y){int z;switch(ch){case '+': z=x+y; break;case '-': z=x-y; break;case '*': z=x*y; break;case '/': if(y!=0)z=x/y;else//z=0;cout<<"分母不能仅为0!"<<endl;break;}return(z);}int middexpression(char *exp) //求解算式表达式{stack<int> *opnd=new(stack<int>);stack<char> *optr=new(stack<char>);char ch=*exp;int x=0,y,z;int result;optr->push('#');while(ch!='#'||optr->gettop()!='#'){if(!Operator(ch)){x=ch-48;opnd->push(x);ch=*++exp;if(ch!='\0'&&!Operator(ch)){cout<<"不符合要求,运算数必须是0~9之间的数"<<endl;exit(0);}}else{switch(Precede(optr->gettop(),ch)){case '<': //栈顶元素优先权低optr->push(ch);ch=*++exp;break;case '=': //脱括号并接收下一字符optr->pop();ch=*++exp;break;case '>': //退栈并将运算结果入栈if(opnd->sizeofstack()<2){cout<<"表达式不合法!"<<endl;exit(0);}x=opnd->pop();y=opnd->pop();z=calc(y,optr->pop(),x);opnd->push(z);x=0;break;}}if(ch=='\0'){cout<<"表达式应该以'#'结束!"<<endl;exit(0);}}result=opnd->pop();if(opnd->empty()&&optr->pop()=='#')return(result);else{cout<<"输入不合法!"<<endl;exit(0);}}void main(void) //程序入口函数{char exp[50];cout<<"数据结构课程设计-请输入算术表达式(以#结束):"<<endl;cin>>exp;cout<<middexpression(exp)<<endl;}五、测试结果及分析运行程序,输入数据及所得结果如下表;通过实际的将程序输入软件中,执行后所列出的表中,并且通过记录的所得的上表可知,给定的一个算术表达式,通过程序所求出来的值是正确的,并且当输入数值出现错误或者是表达式输入错误时,也会给出相应的错误提示,所以程序达到了原先所要的设计的要求。

表达式求值

表达式求值

课程设计报告课程名称数据结构课题名称表达式求值专业计算机科学与技术班级0901学号200903010102姓名覃宇星指导教师李珍辉邓作杰郭芳2011年7月7日湖南工程学院课程设计任务书课程名称C语言程序设计课题表达式求值专业班级计算机0901学生姓名学号指导老师周铁山审批任务书下达日期2011年6月23 日任务完成日期2011年7月7日《数据结构课程设计》一、课程设计的性质和目的数据结构课程设计是计算机专业的专业课程,通过课程设计使学生进一步巩固课堂所学知识,全面熟悉、掌握数据结构的基本设计方法和技巧,进一步提高分析问题、解决问题及上机操作能力,为将来从事计算机工作打下一定的专业基础。

二、设计课题课题一:迷宫问题详细内容见后课题二:马踏遍棋盘问题详细内容见后课题三:表达式求值问题详细内容见后课题四:B+树的实现详细内容见后三、课程设计报告要求课程设计报告每人一份,必须包含如下几个方面的内容:1.基本设计思想;2.主要数据结构;3.主要实施流程;4.所有源代码;5.课程设计总结与体会。

四、分组及选题办法1、一人一组。

2、若选择课题四,则只需完成一题即可;否则,必须至少完成前三个课题中的任意两个。

3、成绩考核按个人课题完成情况、设计报告质量及对课程设计的态度等综合评定。

五、设计进度安排1、讲课及上机调试时间安排:各班具体时间另行安排2、其余时间:查阅资料,确定方案,设计课题相关程序。

3、分组答辩,交课程设计报告。

设计课题三:表达式求值问题一、问题提出在高级语言程序中出现的数学表达式要进行求值运算,本课程设计要求模拟编译程序的求值过程,利用栈这种数据结构,对包含四则算术运算及多重括号及常量的表达式进行求值运算。

二、设计要求1.一次性输入一个表达式,包含数值常量、四则算术运算符、括号等。

2.能输出表达式的正确结果。

1.输入输出界面清晰明了。

三、设计提示1.可用两个栈(操作数栈和运算符栈)来存储运算过程中的原始数据及中间结果。

程序设计实训报告—表达式求值问题

程序设计实训报告—表达式求值问题

程序设计实训报告—表达式求值问题完成者:何炜班级:计科1501学号:完成日期:2016年7月14日星期四目录一、题目的内容及要求................................. 错误!未定义书签。

二、需求分析 ................................................ 错误!未定义书签。

三、概要设计 ................................................ 错误!未定义书签。

四、详细设计 ................................................ 错误!未定义书签。

五、源代码 .................................................... 错误!未定义书签。

六、运行结果及分析..................................... 错误!未定义书签。

七、收获及体会............................................. 错误!未定义书签。

一、题目的内容及要求求解形如(a+b)*((c+d)*e+f*h*g)的简单算术表达式的求值问题。

这种表达式只包括加、减、乘、除4种运算符。

为了实现表达式求值,可以首先读入原表达式(包括括号)并创建对应二叉树,其次对二叉树进行前序遍历、中序遍历、后续遍历(非递归),并输出逆波兰表达式,最后求解原表达式的值,同时对非法表达式格式能予以判断。

用二叉树的结构来存储表达式,后续遍历二叉树即可得到逆波兰表达式二、需求分析本程序能解决形如(a+b)*((c+d)*e+f*h*g)并以’#’作为结束标志的简单算术表达式的求值问题。

不仅能够求解出多位浮点数,而且能够对简单的非法表达式进行判断以避免程序异常退出。

三、概要设计1.用户输入中缀表达式2.程序将中缀表达式用二叉树的链式存储结构存储下来3.前序、中序遍历这颗二叉树,输出对应的前缀、中缀表达式4.后续遍历(非递归)这颗二叉树,并把遍历结果存储在顺序栈内,并输出后缀表达式5.对后缀表达式进行求值四、详细设计以下对概要设计进行详细的原理分析。

表达式求值(数据结构)(2023版)

表达式求值(数据结构)(2023版)

表达式求值(数据结构) 表达式求值(数据结构)1.引言1.1 目的1.2 背景1.3 范围2.表达式类型2.1 算术表达式2.1.1 运算符2.1.2 运算数2.2 逻辑表达式2.2.1 逻辑运算符2.2.2 逻辑运算数2.3 字符串表达式2.3.1 字符串连接运算符2.3.2 字符串操作函数3.表达式求值算法3.1 递归下降分析法3.2 栈表达式求值法3.2.1 中缀表达式转后缀表达式3.2.2 后缀表达式求值4.数据结构4.1 操作数栈4.2 运算符栈4.3 后缀表达式栈5.算法实现步骤5.1 输入表达式5.2 初始化栈5.3 处理表达式字符串5.4 根据算法选择相应的方法求值5.5 输出结果6.实例演示6.1 算术表达式求值示例6.2 逻辑表达式求值示例6.3 字符串表达式求值示例7.测试与验证7.1 正常表达式测试7.2 异常表达式测试7.3 性能测试8.总结与展望8.1 本文主要工作8.2 结果评估8.3 存在问题8.4 后续工作附件:附件1、算术表达式求值示例代码附件2、逻辑表达式求值示例代码附件3、字符串表达式求值示例代码法律名词及注释:1.递归下降分析法: 一种基于上下文无关文法进行递归分析的方法,用于处理表达式求值等问题。

2.栈表达式求值法: 使用栈数据结构进行表达式求值的方法。

3.中缀表达式: 常见的数学表达式写法,运算符位于运算数之间。

4.后缀表达式: 也称为逆波兰表达式,运算符位于运算数之后。

5.操作数栈: 用于存储表达式中的操作数的栈。

6.运算符栈: 用于存储表达式中的运算符的栈。

7.后缀表达式栈: 用于存储后缀表达式的栈。

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

汇编语言实训课程设计任务书题目:表达式求值程序班级:计算机科学与技术一班学生姓名:赵旭尧学号: 14730141 题目类型:软件工程(R)指导教师:刘树群一.题目简介该设计要求学生使用汇编语言,设计并开发出针对四则运算表达式进行求值的命令行或窗口程序。

通过该题目的设计过程,可以培养学生结构化程序设计的思想,加深对汇编语言基本语言要素和流程结构的理解,针对汇编语言中的重点和难点内容进行训练,独立完成有一定工作量的程序设计任务,同时强调好的程序设计风格。

得到软件工程的综合训练,提高解决实际问题的能力。

二.设计任务1、查阅文献资料,一般在5篇以上;2、通过键盘输入表达式,进行针对整数的“加减乘除”四则运算表达式进行求值,有良好的界面;3、完成软件结构设计和算法设计;4、完成系统的软件开发和测试工作;5、撰写设计说明书;6、做好答辩工作。

三.主要内容、功能及技术指标1、实现功能及指标:①使用Win32的窗口程序模式,实现表达式求值程序及测试界面程序的设计与开发;②支持整数的四则运算、位运算和小括号等;③使用文本框对表达式进行交互式编辑和输出。

2、问题分析及解决方案框架确定:充分地分析和理解问题本身,弄清要求做什么。

在确定解决方案框架过程中,综合考虑系统功能,考虑怎样使系统结构清晰、合理、简单和易于调试。

最后确定每个过程和函数的简单功能,以及过程(或函数)之间的调用关系,并画出函数之间的调用关系图。

3、详细设计和编码:定义相应的存储结构,确定各个函数的算法,并画出流程图,在此基础上进行代码设计,每个明确的功能模块程序一般不超过200行,否则要进一步划分。

4、完成课程设计报告①需求和规格说明:设计题目和问题描述:题目要解决的问题是什么;②设计思路:主要算法思想,程序功能图,函数之间的调用关系图;设计表示:每个函数或过程的功能,列出每个过程或函数所调用的过程或函数,并画出各函数的流程图;详细设计:主要算法的伪代码;③调试报告:调试过程中遇到的主要问题,是如何解决的;对设计和编码的回顾讨论和分析;改进设想;经验和体会等;④程序实现注释;⑤附录:源程序清单和结果。

如果题目规定了测试数据,则结果要求包含这些测试数据和运行输出,当然还可以含其他测试数据和运行输出。

四.提交的成果1. 设计说明书一份,内容包括:1) 中文摘要100字;关键词3-5个;2) 前言;3) 系统分析(包含需要的系统流程图);4) 系统总体设计(包含总体软件结构图、总体数据结构);5) 详细设计;6) 系统测试(包含测试方案、测试用例、测试结果及软件可靠性分析);7) 软件使用说明书(核心界面说明);8) 设计总结、参考文献、致谢等。

2. 刻制光盘一张。

五.主要参考文献1 王爽.汇编语言(第二版).清华大学出版社, 2008。

2 沈美明,温冬婵.IBM-PC汇编语言程序设计(第二版).清华大学出版社, 2001。

3[美]Kip R.Irvine著,温玉洁,等译.Intel汇编语言程序设计(第五版).电子工业出版社, 2007。

4 钱晓捷.汇编语言程序设计(第二版). 电子工业出版社, 2003。

5 罗云彬.Windows环境下32位汇编语言程序设计(第二版).电子工业出版社,2006。

6Windows API函数参考手册.人民邮电出版社, 2002。

六.各阶段时间安排(共1周):摘要随着时代的进步,人们不再使用古代的计算器。

取而代之的是现今利用计算机编程技术的产品——计算器,这节省了人们大量的计算时间。

通过电流在晶体管等上面的存储信息,将人们想要计算的数字,通过重复的加减乘除运算从而计算实现出来。

本程序是利用汇编语言的编译环境masmplus来实现的。

程序通过将读入的中缀表达式转换为后缀表达式,然后读取后缀表达式,输出结果。

关键字:汇编语言;Masmplus;中缀表达式;后缀表达式目录1 概述 (1)1.1课程了解 (1)1.2 课程设计目的 (1)1.3 课程设计内容 (1)1.4系统功能模块的划分 (1)2 系统需求分析 (3)2.1 系统目标 (3)2.2 主体功能 (3)2.3 开发环境 (3)2.4系统功能模块的分析 (3)3系统分析 (4)3.1系统总体分析 (4)3.2优先级的判断 (5)3.3表达式的四则运算 (5)4系统详细设计 (6)4.1在汇编环境下输入并保存操作数 (6)4.2保存运算符和比较运算符的优先级 (6)4.3表达式的四则运算 (9)4.4算法的清零和回车换行 (9)4.5输出计算结果 (11)4.6括号和负号的细节问题 (13)5系统测试 (15)5.1加法运算 (15)5.2减法运算 (15)5.3乘法运算 (15)5.4除法运算 (16)5.5混合运算 (16)6软件使用说明 (17)设计总结 (18)参考文献 (19)致谢 (20)附录 (21)1 概述1.1课程了解表达式计算是实现程序设计语言的基本问题之一。

设计一个程序,演示通过将数学表达式字符串转化为后缀表达式,并通过后缀表达式结合栈的应用实现对算术表达式进行四则混合运算。

在计算机中,算术表达式由常量、变量、运算符和括号组成。

由于不同的运算符具有不同的优先级,又要考虑括号,因此,算术表达式的求值不可能严格地从左到右进行。

在读入表达式的字符序列的同时完成运算符和运算数的识别处理,然后进行运算数的数值转换在进行四则运算。

在运算之后输出正确运算结果。

1.2 课程设计目的1.要求学生达到熟练掌握汇编语言的基本知识和技能。

2.了解并掌握汇编语言的设计方法,具备初步的独立分析和设计能力。

3.提高程序设计和调试能力。

学生通过上机实习,验证自己设计的算法的正确性。

学会有效利用基本调试方法,迅速找出程序代码中的错误并且修改。

4.培养算法分析能力。

分析所设计算法的时间复杂度和空间复杂度,进一步提高程序设计水平。

5.初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能。

1.3 课程设计内容程序功能:对实数内的加减乘除乘方运算能正确的运算出结果,并能正确对错误输入和无定义的运算报错,能连续测试多组数据。

设计一个表达式求值的程序。

该程序必须可以接受包含(,),+,-,*,/,%,和^(求幂运算符,a^b=ab)的中缀表达式,并求出结果。

如果表达式正确,则输出表达式的结果;如果表达式非法,则输出错误信息。

算法运行:将输入的中缀表达式改为后缀表达式,并进行运算。

算法输出:输出后缀表达式和表达式运算结果。

1.4系统功能模块的划分“表达式求值”包括四个模块:保存输入的操作数和运算符;比较各个元素的优先级高低;对算术表达式进行四则运算;输出所得的结果。

2 系统需求分析2.1 系统目标设计一个程序,演示用算符优先法对算术表达式求值的过程。

利用算符优先关系,实现对算术四则混合运算表达式的求值。

其中涉及到对输入数据和运算符号的保存,比较各个元素之间优先级高低,算法完成清零和按回车换行按等号出结果等问题。

2.2 主体功能能够处理以字符序列的形式输入的不含变量的实数表达式,正确处理负数与小数,判断表达式是否语法正确(包含分母不能为零的情况),正确实现对算术四则混合运算表达式的求值,能够将计算中遇到的问题和结果以文件的形式予以存储。

2.3 开发环境Masmplus2.4系统功能模块的分析保存输入的操作数和运算符:只要功能就是把输入的操作数字和运算符号保存在程序中,再经过子程序的调用,从而来完成算法的计算;比较各个元素的优先级高低:在输入操作数和运算符号以后,应该先比较元素运算符号的优先级高低从而来决定算法的先后;对算术表达式进行四则运算:这是计算模块的功能,对已经保存好的操作数和运算符号根据优先级的高低来进行运算;输出结果:将最后运算所得的结果输出。

3系统分析3.1系统总体分析图3.1讲述在算法的开始,先保存输入到程序的操作数和运算符并且比较各个运算符之间的优先级先后,然后才能进行计算。

最后,若是输入的表达式错误则会输出错误指令,若是正确将会输出此表达式的计算结果。

3.2优先级的判断图3.2判断优先级模块流程图图3.2是子程序判断元素优先级的流程图。

若是取得的元素优先级低则返回“<”,若是取得的优先级高,则输出“>”。

3.3表达式的四则运算图3.3 四则运算模块流程图图 3.3是子程序运算模板流程图。

先输入操作数和运算符,最后得到结果。

4系统详细设计我们在编写整体程序代码的时候应该先行编写各个子程序模块,在确定输入操作数和运算符的存储和确定优先级的高低才能进行一个算法表达式的运算。

4.1在汇编环境下输入并保存操作数DSEG SEGMENTSTR1 DB 0AH,0DH, 'please input the expression:("N"jump out)$'SIGN1 DW 0SIGN2 DW 0SIGN3 DW 0NUMB DW 20H DUP(0)在汇编语言的程序编码坏境下判断数字是否输入完毕,判断括号是否是配对的并且保存已经输入的数值。

4.2保存运算符和比较运算符的优先级NUMB DW 20H DUP(0)MARK DB 'A'DB 10H DUP(0) ;ERROR DB 'YOUR INPUT ARE WRONG$'DSEG ENDSDISP MACRO MLEA DX,MMOV AH,9INT 21HENDMCHOICE MACRO ASC1,HAO1,HHCMP AL,ASC1 ;JNE OTHER&HAO1 ;MOV CH,HH ;JMP OTHER7 ;ENDMCSEG SEGMENTSTART:ASSUME CS:CSEG,DS:DSEG CALL CLEARMOV AX,DSEG ;MOV DS,AX ;LEA DI,NUMB ;LEA SI,MARK ;DISP STR1CALL CRdisp errorMOV AX,0MOV DX,0MOV BX,0MOV CX,0STA1 : CALL CR INPUT:MOV AH,01 ;INT 21H ;CMP AL,'N'JE J_SHUCMP AL,'='JE PDCMP AL,28H ;JB INPUT ;CMP AL,39H ;JA INPUT ;CMP AL,2FHJBE JUDINC WORD PTR SIGN1SUB AL,30H MOV AH,0 ;XCHG AX,[DI] ;MOV BX,10 ;MUL BX ;XCHG AX,[DI] ;ADD [DI],AX ;JMP INPUT ;PD:CMP WORD PTR SIGN2,0 JE JUD ; JMP BC ;JUD:CMP WORD PTR SIGN1,0JNE FUH ;CMP AL,'-'JNE FUH1MOV DX,0MOV [DI],DXFUH:ADD DI,2 ;MOV WORD PTR SIGN1,0;FUH1:CALL ADVANCECMP CH,5JNE PYINC WORD PTR SIGN2MOV WORD PTR SIGN3,1;PY:CMP CH,1JNE AGAIN ;DEC WORD PTR SIGN2在保存输入的数值以后,继续保存输入的运算符并且给运算符赋权值,进而判断各个运算符的优先级。

相关文档
最新文档