资源描述
怀 化 学 院 计 算 机 系数据结构课程设计报告书 学生姓名: 学 号:0806401042年级专业及班级:2008级01班指导老师及职称:专 业:计算机科学与技术专业湖南怀化提交日期:2010年06月 目 录摘 要II关键词II1 前言22 设计分析23 实现方法23.1 函数功能介绍2 3.1.1定义全局变量.2 3.1.2 函数功能的描述.23.2函数功能的实现2 3.2.1源码与分析.2 3.2.2被调用的函数.23.3程序演示.24 系统使用说明书25 结论2参考文献2致 谢.2附 录.2 简单的小学生做题系统的设计和实现学生: 指导老师: (怀化学院计算机系:怀化 418008)摘 要:本次课程设计的目的是设计一个简单的小学生做题系统,要求利用栈求表达式的值,可供小学生作业,并能给出分数,限1人完成。本次设计主要采用的语言是C和C+语言,编程环境是VC.6。系统由若干个函数构成,用到了栈、函数调用、文件的开闭和读写和常见的循环等手法,经过多次的调试与修改,终于实现了设计所要求的各项要求,做成了一个简单的能供小学生选题、做题并能打出分数与历史成绩相比较的简单系统,很好的完成了这一次的课程设计任务。通过这一次的作业,我学到了很多知识,明白了亲自实践和动手能力的重要性。关键词:栈 VC.6 循环 函数调用 文件 一、 前言本次课程设计的目的是设计一个简单的小学生做题系统,设计要求能建立试题库文件,随机产生n个题目;题目涉及加减乘除,带括弧的混合运算;随时可以退出;保留历史分数,能回顾历史,给出与历史分数比较后的评价。针对题目的各项要求,我运用C语言工具在VC.6的环境中,通过结构体数组、函数的调用、循环的使用以及文件的开闭和读写等常用方法来解决在编程过程中遇到的问题,编写出了一个符合设计要求的简单系统。二、 设计分析根据题目的要求,我根据题目要求实现的功能,首先确定了8个大的子函数,分别用来实现输出目录表、提取题目、对系统的说明、存储所有成绩、输出所有成绩、存储最近一次成绩、输出最近一次成绩、开始作业等功能。由于其中涉及了能回顾历史成绩以及随机做题等问题,所以就考虑用到了文件的打开与关闭以及文件的读写功能。由于此设计要实现多个功能,所以为了源代码清晰明了,所有的函数不是用的嵌套方式,而是对每个功能都用一个子程序来实现,然后通过对子程序的调用来达到设计的要求。三、 实现方法本程序通过C和C+语言来实现,在VC6.0下运行3.1 函数功能介绍3.1.1 由于此系统设计的变量较多,为了使程序清晰明了,首先定义了一些有关的全局变量:float answer50;float myAnswer50;int count;int Right;char filename120=所有成绩.txt; char filename220=最近一次的成绩.txt; /char ti20050; int tiliang; int *record; struct tm *tblock; time_t timer;char s50;int tops;float d100;int topd;char c;int r;3.1.2 函数功能的描述1.char menu() 菜单界面 ;2.void Title() 提取题目,并返回题目个数;3.void EXIT () 对系统的说明;4.void save_all_achievment() 存储所有成绩;5.void out_all_achievment() 输出所有成绩;6.void save_latest_achievment() 存储最近一次成绩;7.void out_latest_achievment() 输出最近一次成绩;8.void expression() 随机抽提;9.void do_homework() 开始作业;10.void main() 主函数。3.2 函数功能的实现3.2.1 源码分析程序预处理: #include #include#include#include3.2.2 被调用函数char menu()char item;/选项;coutendlendlendl;cout 小学生测试系统 endl;coutendl;cout 1.介绍 4.历史记录 endl;cout endl;cout 2.开始测试 5.最后一次记录 endl;cout endl;cout 3.退出 6.删除所有记录 endl;cout endl;coutendlendl;coutitem)if(item!=1 & item!=2 & item !=3 & item !=4 & item!=5 & item!=6)cout 菜单选项不正确,请重新选择! ;elsebreak;return item;void save_all()/-存储所有成绩FILE *fp;char ch;fp=fopen(filename1,a);fprintf(fp,nnnn *本次测试情况总结* n); fprintf(fp, - n);fprintf(fp, 题目 正确答案 您的答案 结果 n);for(int i=0;icount;i+)fprintf(fp, %-12s %-6.2f %-6.2f %s n,tirecordi,answeri,myAnsweri,answeri=myAnsweri?正确!:错误!);fprintf(fp, - n);fprintf(fp, 解答题目总共为%d道,其中n,count);fprintf(fp, 正确解答%d道题,错误解答%d道题。nn *最后得分为%d分!*n,Right,count-Right,Right*100/count); fprintf(fp, -n);fprintf(fp, 本次测试时间: %s,asctime(tblock);fclose(fp);void EXIT()/-退出系统coutendlendlendlendlendlendlendlendl;cout 谢谢使用!endl;void show_all()/-输出所有成绩FILE *fp;char ch;if(fp=fopen(filename1,r)=NULL)coutendlendlendl 没有任何记录endl;coutendl 请按回车键返回。;elsewhile(!feof(fp)ch=fgetc(fp);coutch;fclose(fp);coutendlendl 请按回车键返回:;getchar();getchar();system(cls);void save_current()/-存储最近一次的成绩 FILE *fp;char ch;fp=fopen(filename2,w);ch=getchar();fprintf(fp,nnnn *上一次测试情况总结* n); fprintf(fp, - n);fprintf(fp, 题目 正确答案 您的答案 结果 n);for(int i=0;icount;i+)fprintf(fp, %-12s %-6.2f %-6.2f %s n,tirecordi,answeri,myAnsweri,answeri=myAnsweri?正确!:错误!);fprintf(fp, - n);fprintf(fp, 解答题目总共为%d道,其中n,count);fprintf(fp, 正确解答%d道题,错误解答%d道题。nn *最后得分为%d分!*n,Right,count-Right,Right*100/count); fprintf(fp, -n);fprintf(fp, 测试时间: %s,asctime(tblock);fclose(fp);void out_latest_achievment()/-输出最近一次的成绩;FILE *fp;char ch;if(fp=fopen(filename2,r)=NULL)coutendlendlendl 没有任何记录endl;coutendl 请按回车键返回。;elsewhile(!feof(fp)ch=fgetc(fp);coutch;fclose(fp);coutendlendl=0&c=0&c=9);numbernum=0;dtopd+=atof(number);elsej=change(c);i=change(stops-1);switch(tokenij)case -1: stops+=c;c=tirk+;break;case 0: tops-;c=tirk+;break;case 1: calculate();break;answercount=dtopd-1;void start_test()/-开始测试char Save;char l=q;char con;int i,n,j,e,q;loop:count=0;Right=0;r=0; coutn)if(ntiliang)cout少做点吧,等会做不完哦!endl;continue;elsebreak;system(cls);cout你选择题目的个数为:nendl;e=0;q=1; record=new intn; /正在做第几道题目;while(en)if(l=#)break;r=rand()%tiliang;for(j=0;je;j+) /筛选去掉重复的题目;if(r=recordj)break;if(j=e)recorde+=r;exercise();cout第q+道题:endl;couttir; scanf(%f,&myAnswercount+); if(answercount-1=myAnswercount-1) Right+;l=getchar();coutendlendl 本次测试已经完成,请按回车键查看结果!endl;getchar();getchar();system(cls); printf(nnnn *本次测试情况总结* n);printf( - n);printf( 题目 正确答案 您的答案 结果 n);for(i=0;icount;i+)printf( %-12s %-6.2f %-6.2f %s n,tirecordi,answeri,myAnsweri,answeri=myAnsweri?正确!:错误!);printf( - n);printf( 解答题目总共为%d道,其中n,count);printf( 正确解答%d道题,错误解答%d道题。nn *最后得分为%d分!*n,Right,count-Right,Right*100/count); printf( -n); timer=time(NULL); tblock=localtime(&timer); printf( 本次测试时间: %s,asctime(tblock);coutendlSave)if(Save!=Y & Save!=N)cout 选项不对:;continue;elseif(Save=Y)save_all();save_current();coutcon)if(con!=Y & con!=N)cout 选项不对:;continue;elseif(con=Y)system(cls);goto loop;elsebreak;free(record);break;elsebreak;system(cls);3.3 程序演示选16这几项将出项相应的界面,按照提示进行操作,即可完成目的。下面分别看看几个子菜单的功能界面:当输入“1”时出现如下界面:按回车键返回后,输入“2” 并输入选题个数:输入“4”:输入“5”:输入“6”:四、系统使用说明书本系统所需数据必须严格按照要求输入,本系统适合与公共场所使用。五、结论虽然学了这么久的数据结构,但是做这种题型的时候还是感到非常吃力,对栈和函数调用等这些常用的东西却还是不能够灵活运用。这次的课程设计让我获益匪浅,不仅学到了以前从未接触过的知识,更重要的是培养了自己独立思考问题和动手解决问题的能力。参考文献1 数据结构(C语言版) 严蔚敏 吴伟民 编著(第七章:页码 4447)2 C程序设计(第三版) 谭浩强 著作致 谢 此报告是在黄隆华老师的悉心指导和热情帮助下完成的,在此表示衷心的感谢!附录附录 1 源码#include #include#include #include stdlib.husing namespace std;struct tm *tblock; time_t timer;char s50;int tops;float d100;int topd;char c;int r;float ans50;float yours50;int count;int Right;char filename120=所有成绩.txt;/存储所有成绩的 文件名;char filename220=最近一次的成绩.txt;/存储最近一次成绩的 文件名;char ti20050;/将文件中的题库题目提取出来存入数组;int ti_len;/题目总量;int *jilu;/记录所选题目的下标;char menu()char item;/项目;coutendlendlendl;cout 小学生作业系统 endl;cout endl;cout 1.说明 4.历史成绩 endl;cout endl;cout 2.开始作业 5.最后一次成绩 endl;cout endl;cout 3.退出 6.删除所有历史 endl;cout endl;coutendlendl;coutitem)if(item!=1 & item!=2 & item !=3 & item !=4 & item!=5 & item!=6)cout 菜单项目不正确,请重新选择! ;elsebreak;return item;void Title()/-提取题目,并返回题目个数;FILE *fp;int i=0;fp=fopen(题库.txt,r);while(!feof(fp) fscanf(fp,%s,tii+);ti_len=i-1;/最后一个空格不算题目;void EXIT()/-退出系统coutendlendlendlendlendlendlendlendl;cout 谢谢使用!endl;void INSTRUCTION()/-说明char c;FILE *fp;fp=fopen(说明.txt,r);while(!feof(fp)c=fgetc(fp);coutc;fclose(fp);coutendlendl 请按回车键返回:;getchar();getchar();system(cls);void save_all_achievment()/-存储所有成绩FILE *fp;char ch;fp=fopen(filename1,a);fprintf(fp,nnnn *本次作业情况总结* n); fprintf(fp, - n);fprintf(fp, 题目 正确答案 您的答案 结果 n);for(int i=0;icount;i+)fprintf(fp, %-12s %-6.2f %-6.2f %s n,tijilui,ansi,yoursi,ansi=yoursi?正确!:错误!);fprintf(fp, - n);fprintf(fp, 解答题目总共为%d道,其中n,count);fprintf(fp, 正确解答%d道题,错误解答%d道题。nn *最后得分为%d分!*n,Right,count-Right,Right*100/count); fprintf(fp, -n);fprintf(fp, 本次作业时间: %s,asctime(tblock);fclose(fp);void out_all_achievment()/-输出所有成绩FILE *fp;char ch;if(fp=fopen(filename1,r)=NULL)coutendlendlendl 没有任何记录endl;coutendl 请按回车键返回。;elsewhile(!feof(fp)ch=fgetc(fp);coutch;fclose(fp);coutendlendl 请按回车键返回:;getchar();getchar();system(cls);void save_latest_achievment()/-存储最近一次的成绩 FILE *fp;char ch;fp=fopen(filename2,w);ch=getchar();fprintf(fp,nnnn *上一次作业情况总结* n); fprintf(fp, - n);fprintf(fp, 题目 正确答案 您的答案 结果 n);for(int i=0;icount;i+)fprintf(fp, %-12s %-6.2f %-6.2f %s n,tijilui,ansi,yoursi,ansi=yoursi?正确!:错误!);fprintf(fp, - n);fprintf(fp, 解答题目总共为%d道,其中n,count);fprintf(fp, 正确解答%d道题,错误解答%d道题。nn *最后得分为%d分!*n,Right,count-Right,Right*100/count); fprintf(fp, -n);fprintf(fp, 作业时间: %s,asctime(tblock);fclose(fp);void out_latest_achievment()/-输出最近一次的成绩;FILE *fp;char ch;if(fp=fopen(filename2,r)=NULL)coutendlendlendl 没有任何记录endl;coutendl 请按回车键返回。;elsewhile(!feof(fp)ch=fgetc(fp);coutch;fclose(fp);coutendlendl=0&c=0&c=9); /判断是否是数字numbernum=0; /将数字字符转换成整数dtopd+=atof(number); /将数字进栈elsej=change(c); /j为读取到的符号i=change(stops-1); /i为符号栈的栈顶符号switch(tokenij) /判断优先级case -1: stops+=c;c=tirk+;break;case 0: tops-;c=tirk+;break;case 1: calculate();break;anscount=dtopd-1;/printf(%d,dtopd-1);/getchar();void do_homework()/-开始作业char Save;char l=q;char con;int i,n,j,e,q;jixu:count=0;Right=0;r=0; coutn)if(nti_len)cout少做点吧,等会做不完哦!endl;continue;elsebreak;system(cls);cout你选择题目的个数为:nendl;e=0;q=1; jilu=new intn; /正在做第几道题目;while(en)if(l=#)break; /当l=#表示结束做题r=rand()%ti_len; /rand为随机产生的数,与题数的模式为了避免选到重复的题目for(j=0;je;j+) /筛选去掉重复的题目;if(r=jiluj)break;if(j=e)jilue+=r; /r题目下标,e为当前题目量expression();cout第q+道题:endl;couttir; scanf(%f,&yourscount+); if(anscount-1=yourscount-1) Right+;l=getchar();coutendlendl 本次作业已经完成,请按回车键查看结果!endl;getchar();/getchar();system(cls); printf(nnnn *本次作业情况总结* n);printf( - n);printf( 题目 正确答案 您的答案 结果 n);for(i=0;icount;i+)printf( %-12s %-6.2f %-6.2f %s n,tijilui,ansi,yoursi,ansi=yoursi?正确!:错误!);printf( - n);printf( 解答题目总共为%d道,其中n,count);printf( 正确解答%d道题,错误解答%d道题。nn *最后得分为%d分!*n,Right,count-Right,Right*100/count); printf( -n); timer=time(NULL); tblock=localtime(&timer); printf( 本次作业时间: %s,asctime(tblock);coutendlSave)if(Save!=Y & Save!=N)cout 选项不对:;continue;elseif(Save=Y)save_all_achievment();save_latest_achievment();coutcon)if(con!=Y & con!=N)cout 选项不对:;continue;elseif(con=Y)system(cls);goto jixu;elsebreak;free(jilu);break;elsebreak;system(cls); void main() int i; char menuitem;Title();loop:menuitem=menu();system(cls);if(menuitem=3)EXIT();return ;elseif(menuitem=1)INSTRUCTION();goto loop;/ 返回菜单界面;elseif(menuitem=4)out_all_achievment();goto loop;/ 返回菜单界面;elseif(menuitem=2)do_homework();goto loop;/ 返回菜单界面;elseif(menuitem=5)out_latest_achievment();goto loop;/ 返回菜单界面;elseif(menuitem=6)char del;system(cls);coutendlendlendldel)if(del!=Y & del!=N)cout 选项不正确:;continue;
展开阅读全文