《数据结构》课程设计报告书简单的小学生做题系统的设计和实现_第1页
《数据结构》课程设计报告书简单的小学生做题系统的设计和实现_第2页
《数据结构》课程设计报告书简单的小学生做题系统的设计和实现_第3页
《数据结构》课程设计报告书简单的小学生做题系统的设计和实现_第4页
《数据结构》课程设计报告书简单的小学生做题系统的设计和实现_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、怀 化 学 院 计 算 机 系数据结构课程设计报告书 学生姓名: 学 号: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 简单的小学生做题系统的设计和实现学生: 指导老师: (怀化学院计算机系:怀化 4

2、18008)摘 要:本次课程设计的目的是设计一个简单的小学生做题系统,要求利用栈求表达式的值,可供小学生作业,并能给出分数,限1人完成。本次设计主要采用的语言是c和c+语言,编程环境是vc.6。系统由若干个函数构成,用到了栈、函数调用、文件的开闭和读写和常见的循环等手法,经过多次的调试与修改,终于实现了设计所要求的各项要求,做成了一个简单的能供小学生选题、做题并能打出分数与历史成绩相比较的简单系统,很好的完成了这一次的课程设计任务。通过这一次的作业,我学到了很多知识,明白了亲自实践和动手能力的重要性。关键词:栈 vc.6 循环 函数调用 文件 一、 前言本次课程设计的目的是设计一个简单的小学生

3、做题系统,设计要求能建立试题库文件,随机产生n个题目;题目涉及加减乘除,带括弧的混合运算;随时可以退出;保留历史分数,能回顾历史,给出与历史分数比较后的评价。针对题目的各项要求,我运用c语言工具在vc.6的环境中,通过结构体数组、函数的调用、循环的使用以及文件的开闭和读写等常用方法来解决在编程过程中遇到的问题,编写出了一个符合设计要求的简单系统。二、 设计分析根据题目的要求,我根据题目要求实现的功能,首先确定了8个大的子函数,分别用来实现输出目录表、提取题目、对系统的说明、存储所有成绩、输出所有成绩、存储最近一次成绩、输出最近一次成绩、开始作业等功能。由于其中涉及了能回顾历史成绩以及随机做题等

4、问题,所以就考虑用到了文件的打开与关闭以及文件的读写功能。由于此设计要实现多个功能,所以为了源代码清晰明了,所有的函数不是用的嵌套方式,而是对每个功能都用一个子程序来实现,然后通过对子程序的调用来达到设计的要求。三、 实现方法本程序通过c和c+语言来实现,在vc6.0下运行3.1 函数功能介绍3.1.1 由于此系统设计的变量较多,为了使程序清晰明了,首先定义了一些有关的全局变量:float answer50;float myanswer50;int count;int right;char filename120="所有成绩.txt" char filename220=&q

5、uot;最近一次的成绩.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、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<iostream> #include<time.h>#include<dos.h>#include<stdlib.h>3.2.2 被调用函数char menu()char it

7、em;/选项;cout<<endl<<endl<<endl;cout<<" 小学生测试系统 "<<endl;cout<<""<<endl;cout<<" 1.介绍 4.历史记录 "<<endl;cout<<" "<<endl;cout<<" 2.开始测试 5.最后一次记录 "<<endl;cout<<" "&l

8、t;<endl;cout<<" 3.退出 6.删除所有记录 "<<endl;cout<<" "<<endl;cout<<endl<<endl;cout<<" 请选择菜单选项(1-6):"while(cin>>item)if(item!='1' && item!='2' && item !='3' && item !='4'

9、&& 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," 题目 正确答案 您的答案 结果

10、n");for(int i=0;i<count;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",righ

11、t,count-right,right*100/count); fprintf(fp," -n");fprintf(fp," 本次测试时间: %s",asctime(tblock);fclose(fp);void exit()/-退出系统cout<<endl<<endl<<endl<<endl<<endl<<endl<<endl<<endl;cout<<" 谢谢使用!"<<endl;void show_all()/-

12、输出所有成绩file *fp;char ch;if(fp=fopen(filename1,"r")=null)cout<<endl<<endl<<endl<<" 没有任何记录"<<endl;cout<<endl<<" 请按回车键返回。"elsewhile(!feof(fp)ch=fgetc(fp);cout<<ch;fclose(fp);cout<<endl<<endl<<" 请按回车键返回:&

13、quot;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;i<count;i+)fprintf(fp,&qu

14、ot; %-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,"

15、 -n");fprintf(fp," 测试时间: %s",asctime(tblock);fclose(fp);void out_latest_achievment()/-输出最近一次的成绩;file *fp;char ch;if(fp=fopen(filename2,"r")=null)cout<<endl<<endl<<endl<<" 没有任何记录"<<endl;cout<<endl<<" 请按回车键返回。"elsew

16、hile(!feof(fp)ch=fgetc(fp);cout<<ch;fclose(fp);cout<<endl<<endl<<" 请按回车键返回:"getchar();getchar();system("cls");int change(char x)switch(x)case '+': return 0;case '-': return 1;case '*': return 2;case '/': return 3;case '(

17、': return 4;case ')': return 5;case '=': return 6;return 7;void calculate()float a,b;b=d-topd;a=d-topd;switch(s-tops)case '+': dtopd+=a+b;return;case '-': dtopd+=a-b;return;case '*': dtopd+=a*b;return;case '/': dtopd+=a/b;return;void exercise()int

18、num;int i,j,k=0;char number10;tops=0;stops+='='topd=0; c=tirk+;while(c!='='|stops-1!='=')num=0;if(c>='0'&&c<='9')donumbernum+=c;c=tirk+;while(c>='0'&&c<='9');numbernum='0'dtopd+=atof(number);elsej=change(c);i

19、=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; cout<<"请输入题目的个数:"while(cin>>n)if(n>ti

20、liang)cout<<"少做点吧,等会做不完哦!"<<endl;continue;elsebreak;system("cls");cout<<"你选择题目的个数为:"<<n<<endl;e=0;q=1; record=new intn; /正在做第几道题目;while(e<n)if(l='#')break;r=rand()%tiliang;for(j=0;j<e;j+) /筛选去掉重复的题目;if(r=recordj)break;if(j=e)r

21、ecorde+=r;exercise();cout<<"第"<<q+<<"道题:"<<endl;cout<<tir; scanf("%f",&myanswercount+); if(answercount-1=myanswercount-1) right+;l=getchar();cout<<endl<<endl<<" 本次测试已经完成,请按回车键查看结果!"<<endl;getchar();getc

22、har();system("cls"); printf("nnnn *本次测试情况总结* n");printf(" - n");printf(" 题目 正确答案 您的答案 结果 n");for(i=0;i<count;i+)printf(" %-12s %-6.2f %-6.2f %s n",tirecordi,answeri,myansweri,answeri=myansweri?"正确!":"错误!");printf(" - n&quo

23、t;);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);cout<<endl<<" 是否对此次测试进行保存y/

24、n:" while(cin>>save)if(save!='y' && save!='n')cout<<" 选项不对:"continue;elseif(save='y')save_all();save_current();cout<<" 保存成功,是否继续测试y/n:"while(cin>>con)if(con!='y' && con!='n')cout<<" 选项

25、不对:"continue;elseif(con='y')system("cls");goto loop;elsebreak;free(record);break;elsebreak;system("cls");3.3 程序演示选16这几项将出项相应的界面,按照提示进行操作,即可完成目的。下面分别看看几个子菜单的功能界面:当输入“1”时出现如下界面:按回车键返回后,输入“2” 并输入选题个数:输入“4”:输入“5”:输入“6”:四、系统使用说明书本系统所需数据必须严格按照要求输入,本系统适合与公共场所使用。五、结论虽然学了这么久的

26、数据结构,但是做这种题型的时候还是感到非常吃力,对栈和函数调用等这些常用的东西却还是不能够灵活运用。这次的课程设计让我获益匪浅,不仅学到了以前从未接触过的知识,更重要的是培养了自己独立思考问题和动手解决问题的能力。参考文献1 数据结构(c语言版) 严蔚敏 吴伟民 编著(第七章:页码 4447)2 c程序设计(第三版) 谭浩强 著作致 谢 此报告是在黄隆华老师的悉心指导和热情帮助下完成的,在此表示衷心的感谢!附录附录 1 源码#include <iostream>#include<time.h>#include <dos.h> #include "s

27、tdlib.h"using 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;/将文件中的题库题目提取出来存入数组;i

28、nt ti_len;/题目总量;int *jilu;/记录所选题目的下标;char menu()char item;/项目;cout<<endl<<endl<<endl;cout<<" 小学生作业系统 "<<endl;cout<<" "<<endl;cout<<" 1.说明 4.历史成绩 "<<endl;cout<<" "<<endl;cout<<" 2.开始作业

29、 5.最后一次成绩 "<<endl;cout<<" "<<endl;cout<<" 3.退出 6.删除所有历史 "<<endl;cout<<" "<<endl;cout<<endl<<endl;cout<<" 请选择菜单项目(1-6):"while(cin>>item)if(item!='1' && item!='2' &

30、;& 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&qu

31、ot;,tii+);ti_len=i-1;/最后一个空格不算题目;void exit()/-退出系统cout<<endl<<endl<<endl<<endl<<endl<<endl<<endl<<endl;cout<<" 谢谢使用!"<<endl;void instruction()/-说明char c;file *fp;fp=fopen("说明.txt","r");while(!feof(fp)c=fgetc(fp

32、);cout<<c;fclose(fp);cout<<endl<<endl<<" 请按回车键返回:"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,&quo

33、t; 题目 正确答案 您的答案 结果 n");for(int i=0;i<count;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"

34、,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)cout<<endl<<endl<<endl<<" 没有任何记录"<<endl;c

35、out<<endl<<" 请按回车键返回。"elsewhile(!feof(fp)ch=fgetc(fp);cout<<ch;fclose(fp);cout<<endl<<endl<<" 请按回车键返回:"getchar();getchar();system("cls");void save_latest_achievment()/-存储最近一次的成绩 file *fp;char ch;fp=fopen(filename2,"w");ch=ge

36、tchar();fprintf(fp,"nnnn *上一次作业情况总结* n"); fprintf(fp," - n");fprintf(fp," 题目 正确答案 您的答案 结果 n");for(int i=0;i<count;i+)fprintf(fp," %-12s %-6.2f %-6.2f %s n",tijilui,ansi,yoursi,ansi=yoursi?"正确!":"错误!");fprintf(fp," - n");fprintf

37、(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,

38、"r")=null)cout<<endl<<endl<<endl<<" 没有任何记录"<<endl;cout<<endl<<" 请按回车键返回。"elsewhile(!feof(fp)ch=fgetc(fp);cout<<ch;fclose(fp);cout<<endl<<endl<<" 请按回车键返回:"getchar();getchar();system("cls&quo

39、t;);int token77= 1,1,-1,-1,-1,1,1, /-1当前符号比栈顶符号优先,0运算结束(遇到)或者=遇到=)1优先级相等,2运算不可进行1,1,-1,-1,-1,1,1,1,1,1,1,-1,1,1,1,1,1,1,-1,1,1,-1,-1,-1,-1,-1,0,2, 1,1,1,1,2,1,1,-1,-1,-1,-1,-1,2,0;int change(char x)switch(x)case '+': return 0;case '-': return 1;case '*': return 2;case '/&

40、#39;: return 3;case '(': return 4;case ')': return 5;case '=': return 6;return 7;void calculate()float a,b;b=d-topd;/将第一个数字出栈a=d-topd; /将第二个数字出栈switch(s-tops) /将第一个符号出栈case '+': dtopd+=a+b;return;case '-': dtopd+=a-b;return;case '*': dtopd+=a*b;return;

41、case '/': dtopd+=a/b;return;void expression()int num;int i,j,k=0;char number10;tops=0;stops+='='/符号栈最底部为=,因为当遇到=时结束topd=0; /初始化数据栈c=tirk+; /c等于第r个等式的下一个字符while(c!='='|stops-1!='=') /判断是否为=号num=0; /初始化num,num为number数组的下标if(c>='0'&&c<='9')

42、/ 判断是否为数字donumbernum+=c; /将number的下一个字符付给cc=tirk+; /c等于第r个题目的下一个字符while(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;cas

43、e 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; cout<<"请输入题目的个数:"while(cin>>n)if(n>ti_len)cout<<"少做点

44、吧,等会做不完哦!"<<endl;continue;elsebreak;system("cls");cout<<"你选择题目的个数为:"<<n<<endl;e=0;q=1; jilu=new intn; /正在做第几道题目;while(e<n)if(l='#')break; /当l=#表示结束做题r=rand()%ti_len; /rand为随机产生的数,与题数的模式为了避免选到重复的题目for(j=0;j<e;j+) /筛选去掉重复的题目;if(r=jiluj)bre

45、ak;if(j=e)jilue+=r; /r题目下标,e为当前题目量expression();cout<<"第"<<q+<<"道题:"<<endl;cout<<tir; scanf("%f",&yourscount+); if(anscount-1=yourscount-1) right+;l=getchar();cout<<endl<<endl<<" 本次作业已经完成,请按回车键查看结果!"<<endl;getchar();/getchar();system("cls"); printf("nnnn *本次作业情况总结* n");printf(" - n");printf(" 题目 正确答案 您的答案 结果 n");for(i=0;i<count;i+)p

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论