您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > 利用栈求表达式的值,可供小学生作业,并能给出分数-数据结构课程设计说明书格式
中北大学数据结构课程设计说明书学生姓名:刘敏杰学号:1021011545学院:软件学院专业:软件开发与测试题目:利用栈求表达式的值,可供小学生作业,并能给出分数指导教师何志英2011年12月20日11.设计任务概述(包括系统总体框图及功能描述)此课题是研究表达式求值的问题,以帮助小学生完成测试。为了达到这个功能,实际我们要做的就是出题,和计算分数给出评价的工作。整体设计都是以这个要求为轴心进行的。为了直观和方便,现画出软件整体设计模块图。整体设计模块图可以清晰的看出软件的几大模块。整个系统的操作流程图可以看出操作的整体流程,如下图利用栈求表达式的值创建试题库试题测试查看历史分数随时退出开始结束菜单选择试题测试查看历史分数输入1输入2输入022.本设计所采用的数据结构(如:链表、栈、树、图等)根据以上功能说明,设计运算信息,堆栈的存储结构,设计程序完成功能;3.功能模块详细设计在此说明每个部分的算法设计说明(可以是描述算法的流程图),每个程序中使用的存储结构设计说明(如果指定存储结构请写出该存储结构的定义)。3.1详细设计思想学生要进行测试,首先要有试题。那么我们就要先建立试题库。这个试题库的试题是我们在程序运行过程中手动输入,存放在一个shujuku.txt的文件中。首先在主函数中调用创建试题库函数,将试题存入到试题库文件shitiku.txt中,然后将该调用从主函数中删除。创建试题库函数:创建指向xuanti类型的指针,利用循环将输入的测试题该指针的xuanti单元中,最后将该指针中的测试题写入试题库文件shitiku.txt中。3.2核心代码(正文宋体小四号字,1.5倍行距)#includestdio.h#includestdlib.h#includetime.h#includestring.h#includeconio.h#defineSTACK_INIT_SIZE100#defineSTACKINCREMENT10#defineERROR03#defineOK1//定义表达式typedefstructshiti{chara[20];longresult;}xuanti;typedefstructSqStack1{//建立数字栈int*base;int*top;intstacksize;}SqStack1;typedefstructSqStack2{//建立运算符栈char*base;char*top;intstacksize;}SqStack2;voidWriteToFile(xuanti*pstu,intnum);voidReadFromFile(xuanti*pstu,intnum);voidpage_title(char*menu_item){//建立菜单printf(数学习题库\n\n-%s-\n\n,menu_item);}voidreturn_confirm()4{printf(\n按任意键返回……\n);getch();}voidIntInitStack(SqStack1*S1){S1-base=(int*)malloc(STACK_INIT_SIZE*sizeof(int));if(!S1-base)exit(ERROR);S1-top=S1-base;S1-stacksize=STACK_INIT_SIZE;}//IntInitStackvoidCharInitStack(SqStack2*S2){S2-base=(char*)malloc(STACK_INIT_SIZE*sizeof(char));if(!S2-base)exit(ERROR);S2-top=S2-base;S2-stacksize=STACK_INIT_SIZE;}//CharInitStacklongIntGetTop(SqStack1*S1){//取栈顶元素longe1;if((*S1).top==(*S1).base)return0;e1=*((*S1).top-1);5returne1;}//IntGetTopcharCharGetTop(SqStack2*S2){//取栈顶元素chare2;if((*S2).top==(*S2).base)return0;e2=*((*S2).top-1);returne2;}//IntGetTopintIntPush(SqStack1*S1,inte1){//入栈*(*S1).top++=e1;returnOK;}//IntPushintCharPush(SqStack2*S2,chare2){//入栈*(*S2).top++=e2;returnOK;}//CharPushintIntPop(SqStack1*S1){//出栈inte1;if((*S1).top==(*S1).base)return0;e1=*--(*S1).top;6returne1;}//IntPopintCharPop(SqStack2*S2){//出栈chare2;if((*S2).top==(*S2).base)return0;e2=*--(*S2).top;returne2;}//CharPopcharPrecede(chara,charb){inti,j;charTable[8][8]={'','+','-','*','/','(',')','#','+','','','','','','','','-','','','','','','','','*','','','','','','','','/','','','','','','','','(','','','','','','=','',')','','','','','','','','#','','','','','','','=',};//优先级表格for(i=0;i8;i++)if(Table[0][i]==a)//纵坐标寻找break;for(j=0;j8;j++)//横坐标寻找if(Table[j][0]==b)7break;returnTable[j][i];}//PrecedeintOperate(inta,chartheta,intb){//计算表达式值:主要是将大的表达式转化成小的表达式进行逐步求值intc;if(theta=='+')c=a+b;elseif(theta=='-')c=a-b;elseif(theta=='*')c=a*b;elsec=a/b;returnc;}//OperateintIsOptr(charch){charptr[10]={'+','-','*','/','(',')','#'};for(inti=0;i7;i++){if(ch==ptr[i])returntrue;}returnfalse;}longresult(char*a,SqStack1*OPND,SqStack2*OPTR){//求值chartheta;intb,d,k=0,i=0,j=0,num2=0;IntInitStack(OPND);CharInitStack(OPTR);8CharPush(OPTR,'#');while(a[i]!='='){if(!IsOptr(a[i])){k++;if(k=j){num2=(int(a[i])-48);i++;}if(kj){num2=num2*10+(int(a[i])-48);k=j=0;i++;}if(!IsOptr(a[i]))k++;if(k==j)IntPush(OPND,num2);}elseif(IsOptr(a[i])){switch(Precede(a[i],CharGetTop(OPTR))){case'':CharPush(OPTR,a[i++]);if(a[i]!='('&&a[i]!=')')j++;9break;case'=':CharPop(OPTR);i++;break;case'':theta=CharPop(OPTR);d=IntPop(OPND);b=IntPop(OPND);IntPush(OPND,Operate(b,theta,d));break;}//switch}//elseif}//whileprintf(表达式的正确结果为:);printf(%d\n,IntGetTop(OPND));return(IntGetTop(OPND));}//reslutvoidBuilt_shitiKu(){inti,num;xuanti*pstu;printf(输入试题数目:\n);scanf(%d,&num);fflush(stdin);pstu=(xuanti*)malloc(num*sizeof(xuanti));//动态分配内存if(pstu==NULL){printf(没有足够的内存空间!\n);return;}10for(i=0;inum;i++){//输入试题printf(第%d道试题:,i+1);gets(pstu[i].a);fflush(stdin);printf(\n);}WriteToFile(pstu,num);//将pstu所指向的学生信息写入文件中memset(pstu,0,num*sizeof(xuanti));//将pstu所指向的内存块清0ReadFromFile(pstu,num);//从文件中读取学生信息到pstu所指向的内存块中printf(试题列表:\n);for(i=0;inum;i++){//输入试题printf(第%d道试题:,i+1);printf(%s,pstu[i].a);printf(\n);}free(pstu);//释放动态分配的内存}voidWriteToFile(xuanti*pstu,intnum){//将pstu所指向的试题息写入文件shitiku.txt中FILE*fp;fp=fopen(shitiku.txt,at);if(fp==NULL){printf(不能创建shitiku.txt\n);11free(pstu);exit(0);}fwrite(pstu,sizeof(xuanti),num,fp);fclose(fp);}voidReadFromFile(xuanti*pstu,intnum){//从试题库中提取试题FILE*fp;fp=fopen(shitiku.txt,rt);if(fp==NULL){printf(不能打开shitiku.txt\n);free(pstu);exit(0);}fread(pstu,sizeof(xuanti),num,fp);fclose(fp);}//******************************************voidRecMark(int*m,intnum){//把得分记录到markrec.txt中FILE*mp;mp=fopen(markrec.txt,at);if(mp==NULL){printf(不能创建markrec.txt\n);12free(m);exit(0);}fwrite(m,sizeof(int),num,mp);fclose(mp);}//RecmarkvoidLookMark(int*m,intnum){//查看得分记录FILE*mp;mp=fopen(markrec.txt,rt);if(mp==NULL){printf(不能打开markrec.txt\n);free(m);exit(0);}fread(m,sizeof(int),num,mp);fclose(mp);}//*************************************voidRecN(int*m,intnum){//把m的值记录到n_rec.txt中FILE*mp;mp=fopen(n_rec.txt,wt);if(mp==
本文标题:利用栈求表达式的值,可供小学生作业,并能给出分数-数据结构课程设计说明书格式
链接地址:https://www.777doc.com/doc-5529035 .html