利用栈求表达式的值,可供小学生作业任务,并能给出分数数据结构教学规划使用说明格式.docx

上传人:scccc 文档编号:13714040 上传时间:2022-01-22 格式:DOCX 页数:29 大小:71.48KB
返回 下载 相关 举报
利用栈求表达式的值,可供小学生作业任务,并能给出分数数据结构教学规划使用说明格式.docx_第1页
第1页 / 共29页
利用栈求表达式的值,可供小学生作业任务,并能给出分数数据结构教学规划使用说明格式.docx_第2页
第2页 / 共29页
利用栈求表达式的值,可供小学生作业任务,并能给出分数数据结构教学规划使用说明格式.docx_第3页
第3页 / 共29页
利用栈求表达式的值,可供小学生作业任务,并能给出分数数据结构教学规划使用说明格式.docx_第4页
第4页 / 共29页
利用栈求表达式的值,可供小学生作业任务,并能给出分数数据结构教学规划使用说明格式.docx_第5页
第5页 / 共29页
亲,该文档总共29页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《利用栈求表达式的值,可供小学生作业任务,并能给出分数数据结构教学规划使用说明格式.docx》由会员分享,可在线阅读,更多相关《利用栈求表达式的值,可供小学生作业任务,并能给出分数数据结构教学规划使用说明格式.docx(29页珍藏版)》请在三一文库上搜索。

1、中北大学数据结构课程设计说明书学生姓名:刘敏杰 学 号: 1021011545学 院 :软件学院专 业 :软件开发与测试题 目 :利用栈求表达式的值, 可供小学生作业, 并能给出分数指导教师何志英2011 年 12 月 20 日1. 设计任务概述(包括系统总体框图及功能描述)此课题是研究表达式求值的问题,以帮助小学生完成测试。为了达到这个功 能,实际我们要做的就是出题, 和计算分数给出评价的工作。 整体设计都是以这 个要求为轴心进行的。为了直观和方便,现画出软件整体设计模块图。利用栈求表达式的值创建试题试题 测试查随看时历退史出分数整体设计模块图可以清晰的看出软件的几大模块。 整个系统的操作流

2、程图可以看出操作的整体流程,如下图2. 本设计所采用的数据结构(如:链表、栈、树、图等) 根据以上功能说明,设计运算信息,堆栈的存储结构,设计程序 完成功能;3. 功能模块详细设计 在此说明每个部分的算法设计说明(可以是描述算法的流程图) ,每 个程序中使用的存储结构设计说明 (如果指定存储结构请写出该存储 结构的定义)。3.1 详细设计思想学生要进行测试, 首先要有试题。 那么我们就要先建立试题库。 这个试题库的试题是我 们在程序运行过程中手动输入,存放在一个 shujuku.txt 的文件中。首先在主函数中调用创建试题库函数,将试题存入到试题库文件 shitiku.txt 中,然后 将该调

3、用从主函数中删除。shitiku.txt 中。创建试题库函数:创建指向 xuanti 类型的指针,利用循环将输入的测试题该指针的xuanti 单元中,最后将该指针中的测试题写入试题库文件3.2 核心代码(正文宋体小四号字, 1.5 倍行距 )#include #include #include #include#include #define STACK_INIT_SIZE 100#define STACKINCREMENT 10#define ERROR 0#define OK 1/ 定义表达式typedef struct shitichar a20;long result;xuanti;t

4、ypedef struct SqStack1 / 建立数字栈int *base;int *top;int stacksize;SqStack1;typedef struct SqStack2/ 建立运算符栈char *base;char *top;int stacksize;SqStack2;void WriteToFile(xuanti *pstu,int num);void ReadFromFile(xuanti *pstu,int num);void page_title(char *menu_item)/ 建立菜单printf( 数学习题库 base=(int *)malloc(STA

5、CK_INIT_SIZE*sizeof(int);if(!S1-base)exit(ERROR);S1-top=S1-base;S1-stacksize=STACK_INIT_SIZE;/IntInitStackvoid CharInitStack(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;/CharInitStacklong IntGetTop(SqStack1 *S1)

6、 / 取栈顶元素long e1;if(*S1).top=(*S1).base)return 0;e1=*(*S1).top-1);return e1;/IntGetTopchar CharGetTop(SqStack2 *S2) / 取栈顶元素char e2;if(*S2).top=(*S2).base) return 0;e2=*(*S2).top-1);return e2;/IntGetTopint IntPush(SqStack1 *S1,int e1)/ 入栈*(*S1).top+=e1;return OK;/IntPushint CharPush(SqStack2 *S2,char

7、e2)/ 入栈*(*S2).top+=e2;return OK;/CharPushint IntPop(SqStack1 *S1)/ 出栈int e1;if(*S1).top=(*S1).base)return 0;e1=*-(*S1).top;return e1;/IntPopint CharPop(SqStack2 *S2)/ 出栈char e2;if(*S2).top=(*S2).base) return 0;e2=*-(*S2).top;return e2;/CharPopint i,j;char Table88= ,+,-,*,/,(,),#, +, -, *, /, (, , #,

8、 ,=, ; / 优先级表格for(i=0;i8;i+)if(Table0i=a) / 纵坐标寻找 break;for(j=0;j8;j+) / 横坐标寻找 if(Tablej0=b)break;return Tableji;/Precede int Operate(int a,char theta,int b) / 计算表达式值:主要是将大的表达式转化成小的表达式进行逐步求值int c;if(theta=+) c=a+b;else if(theta=-) c=a-b;else if(theta=*) c=a*b;else c=a/b;return c;/Operateint IsOptr(c

9、har ch)char ptr10=+,-,*,/,(,),#;for(int i=0;i7;i+)if(ch=ptri)return true;return false;long result(char *a,SqStack1 *OPND,SqStack2 *OPTR) / 求值char theta;int b,d,k=0,i=0,j=0,num2=0;IntInitStack(OPND);CharInitStack(OPTR);CharPush(OPTR,#);while(ai!=)if(!IsOptr(ai)k+;if(kj)num2=num2*10+(int(ai)-48);k=j=0

10、;i+;if(!IsOptr(ai)k+;if(k=j)IntPush(OPND,num2);else if(IsOptr(ai)switch(Precede(ai,CharGetTop(OPTR)case :theta=CharPop(OPTR);d=IntPop(OPND);b=IntPop(OPND);IntPush(OPND,Operate(b,theta,d);break;/switch /else if/whileprintf( 表达式的正确结果为 :);printf(%dn,IntGetTop(OPND);return (IntGetTop(OPND);/reslutvoid B

11、uilt_shitiKu()int i,num;xuanti *pstu;printf( 输入试题数目: n);scanf(%d,&num);fflush(stdin);pstu=(xuanti *)malloc(num*sizeof(xuanti);/ 动态分配内存 if(pstu=NULL)printf( 没有足够的内存空间! n);return;for(i=0;inum;i+)printf( 第%d 道试题 :,i+1);gets(pstui.a);fflush(stdin);printf(n);WriteToFile(pstu,num);/ 将 pstu 所指向的学生信息写入文件中 m

12、emset(pstu,0,num*sizeof(xuanti);/ 将 pstu 所指向的内存块清 0 ReadFromFile(pstu,num);/ 从文件中读取学生信息到 pstu 所指向的内存 块中printf( 试题列表: n);for(i=0;inum;i+)/ 输入试题printf( 第%d 道试题 :,i+1);printf(%s,pstui.a);printf(n);free(pstu);/ 释放动态分配的内存void WriteToFile(xuanti *pstu,int num)/ 将 pstu 所指向的试题息写入文件 shitiku.txt 中 FILE *fp;fp

13、=fopen(shitiku.txt,at);if(fp=NULL)printf( 不能创建 shitiku.txtn);free(pstu);exit(0);fwrite(pstu,sizeof(xuanti),num,fp);fclose(fp);void ReadFromFile(xuanti *pstu,int num)/ 从试题库中提取试题FILE *fp;fp=fopen(shitiku.txt,rt);if(fp=NULL)printf( 不能打开 shitiku.txtn);free(pstu);exit(0);fread(pstu,sizeof(xuanti),num,fp)

14、;fclose(fp);void RecMark(int *m,int num)/ 把得分记录到 markrec.txt 中FILE *mp;mp=fopen(markrec.txt,at);if(mp=NULL)printf( 不能创建 markrec.txtn);free(m);exit(0);fwrite(m,sizeof(int),num,mp);fclose(mp);/Recmarkvoid LookMark(int *m,int num)/ 查看得分记录FILE *mp;mp=fopen(markrec.txt,rt);if(mp=NULL)printf( 不能打开 markrec

15、.txtn);free(m);exit(0);fread(m,sizeof(int),num,mp);fclose(mp);/*void RecN(int *m,int num)/ 把 m 的值记录到 n_rec.txt 中FILE *mp;mp=fopen(n_rec.txt,wt);if(mp=NULL)printf( 不能创建 n_rec.txtn);free(m);exit(0);fwrite(m,sizeof(int),num,mp);fclose(mp);/Recmarkvoid LookN(int *m,int num)/ 查看 m 的值FILE *mp;mp=fopen(n_r

16、ec.txt,rt);if(mp=NULL)printf( 不能打开 n_rec.txtn);free(m);exit(0);fread(m,sizeof(int),num,mp);fclose(mp);/*int excersice_begin()int i, j, temp, KEY20;int mark,count=0;int *Mark;char g;SqStack1 s1,*OPND;SqStack2 s2,*OPTR;xuanti *XT;OPND=&s1;OPTR=&s2;Mark=(int *)malloc(20*sizeof(int);XT=(xuanti *)malloc(

17、20*sizeof(xuanti);ReadFromFile(XT,20);domark=0; srand(unsigned)time(NULL); KEY0 = rand()%20; for(i=1;i20;i+)while(1)temp = rand()%20;for(j=0;ji;j+)if(KEYj=temp)break;if(j=i)KEYi=temp;break;system(cls);printf( 随机的 10 个练习题 :n);for(i=0;i=90)printf(Very Good!n);else if(mark=60)printf( 成绩不错。 n);else prin

18、tf( 很遗憾成绩不及格! n);printf(n);RecMark(Mark,count);Markcount=mark;count+;/ 记录次数递增printf( 是否继续做练习 ?(y 是, n 否):);g=getchar();fflush(stdin);printf(n);if(count=20)/ 超过最大记录次数清 0count=0;while(g=y);RecMark(Mark,count);return count;return_confirm();void Look_Mark(int count)/printf( 是否查看历史得分 ?(y 是, n 否):);int *M

19、ark;int i;Mark=(int *)malloc(20*sizeof(int);system(cls);printf(* 查询历史得分情况 *n);LookMark(Mark,count);for(i=0;i1)if(Marki-160|Marki-260)if(Marki-1Marki-2)printf( 有进步,还要加油哦。 n);else if(Marki-1=Marki-2) printf( 成绩还可以,但没有进步,还else printf( 成绩有点下降,要多多练习,不要气馁! !n);n);else printf( 成绩很不好!要更加努力学习! elseif(Mark0=9

20、0) printf(Very Good!n);else if(Mark0=60)printf( 成绩不错。 n);else printf( 很遗憾成绩不及格! n);return_confirm();void main()int m=0;int *RN;char ch;RN=(int *)malloc(1*sizeof(int);RN0=0;printf(* 如果是第一次运行 *n); printf(* 请先建立 n_rec.txt*n); printf(* 否则会出错 !*n); printf(y- 创建 *n- 不建)n); ch=getchar();if(ch=y)RecN(RN,1);

21、LookN(RN,1);RN0+=m;fflush(stdin);printf( 是否向试题库中添加试题 : );printf(y- 是 ,n- 否 )?n); ch=getchar();if(ch=y)Built_shitiKu();menu: page_title( 操作选单 ); printf( 请用数字键选择操作 nn); printf(1 开始练习 n);printf(2 查看得分记录 n);*n);printf(RN0+=m;m=0;switch(getch()case 1 : m=excersice_begin();break;case 2 : Look_Mark(RN0);br

22、eak;case 0 : RecN(RN,1);exit(0);system(cls);goto menu;3.3 程序运行结果(拷屏)4. 课程设计心得、存在问题及解决方法 连续两个星期的课程设计做完了,感觉自己的能力得到了大大的提高。刚开 始看见题目的时候, 很不以为然, 觉得这么简单。 但当自己开始着手做的时候才 发现并不是那么回事。一个看似简单的问题,有时候却牵扯甚多。经过两个星期的上机实践学习, 使我对 C 语言有了更进一步的认识和了解, 要想学好它要重在实践,要通过不断的上机操作才能更好地学习它,通过实践, 我也发现我的好多不足之处,对 C 语言学习平时只是马马虎虎的过去了,真正 自己去解决实际问题的时候才会发现自己学的多么糟糕, 通过课程设计对自己的 编程能力也有所提高;再有对 C 语言的文件操作这一块,真的是难了我好久。 还有对函数调用的正确使用不够熟悉,还有对 C 语言中经常出现的错误也不了 解,通过实践,使我在这几个方面的认识有所提高。通过实践的学习,我认到学 好计算机要重视实践操作,不仅仅是学习 C 语言,还是其它的语言,以及其它 的计算机方面的知识都要重在实践, 所以后在学习过程中, 我会更加注重实践操 作能力的培养,无论学习什么,亲自动手去做了才能得到最深刻的体会。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 社会民生


经营许可证编号:宁ICP备18001539号-1