《单项选择题标准化考试系统(共24页).doc》由会员分享,可在线阅读,更多相关《单项选择题标准化考试系统(共24页).doc(24页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精选优质文档-倾情为你奉上程序设计报告(2012/2013学年 第二学期)题 目:单项选择题标准化考试系统专 业 学 生 姓 名 班 级 学 号 指 导 教 师 指 导 单 位 日 期 _ 评 分 细 则评分项优秀良好中等差遵守机房规章制度上机时的表现学习态度程序准备情况程序设计能力团队合作精神课题功能实现情况算法设计合理性用户界面设计报告书写认真程度内容详实程度文字表达熟练程度回答问题准确度简 短 评 语教师签名: 年 月 日评分等级备注评分等级有五种:优秀、良好、中等、及格、不及格课程设计报告具体内容要求:程序设计题目名称单项选择题标准化考试系统一、 课题内容和要求(一)功能要求:(1)用
2、文件保存试题库。(每个试题包括题干、4个备选答案、标准答案)(2)试题录入:可随时增加试题到试题库中(3)试题抽取:每次从试题库中可以随机抽出N道题(N由键盘输入)(4)答题:用户可实现输入自己的答案(5)自动判卷:系统可根据用户答案与标准答案的对比实现判卷并给出成绩。(二)其它要求:(1) 只能使用C/C+语言,源程序要有适当的注释,使程序容易阅读(2) 至少采用文本菜单界面(如果能采用图形菜单界面更好)(3) 学生可自动增加新功能模块(视情况可另外加分)(4)写出课程设计报告,具体要求见相关说明文档二、需求分析(1)用文件保存试题库模块:应该预备一个试题库文本,试题库中可以事先存有试题,每
3、一个试题用一个结构体变量存储;(2)试题录入模块:临时创建一个结构体变量存储从键盘输入的一个试题的数据;再用fprintf函数将该结构体的数据写入文本;(3)试题抽取模块:将试题库中所有试题依次读到一个结构体链表中,由键盘输入的N产生N个随机数可以将随机数用一个数组存储,按照每一个随机数的值确定所抽取到的试题,并将试题存储到另一个链表,达到间接的随机抽取试题的效果,同时释放第一个链表的内存;(4)答题模块:建立一个数组存储用户所输入的答案,将答案同链表的对应的结点的答案域部分比较,相同则正确,并且设置的累加器自增加1,同时设置的标志数组(初始化为0)在对应位置置为1,表示该题正确;答案对比不同
4、时则累加器与标志数组都在对应位置不操作;(5)自动判卷模块:输出累加器的值表示总共答对的试题总数,同时输出标志数组每一道题的标志表示答对与答错的试题;(6)自动增加的新功能模块:该模块会弹出二级菜单,具体有“重新答题”、“显示答案”及“返回主菜单”三个功能;“重新答题”将调用答题模块,将刚刚答过的题重新让用户回答,“显示答案”将打印每一个试题结点的答案域,“返回主菜单”则break跳出并打印主菜单;(7)退出系统模块:释放内存并且return返回0;三、概要设计 (1)结构体的存储结构:struct choisesnode Char ask200; Char choises4100; Char
5、 answay; struct choisesnode *next;(2)用一个switch语句来确定用户在主菜单选择的功能选项,进入能实现不同的函数调用以实现用户需要的功能,二级菜单选项也是如此;(3)其他各个模块的函数需要的功能见上述的“需求分析”;(4)各个函数的算法详述及源代码见下文“源程序代码”;四、源程序代码各个算法实现的源程序(可以是一组源程序,每个功能模块采用不同的函数实现),源程序要按照写程序的规则来编写。要结构清晰,重点函数的重点变量,重点功能部分要加上清晰的程序注释。,程序清单可用Times New Roman字体,大小为5号,单倍行距。(1)void Menu(void
6、);/主菜单的函数声明,打印主功能的选项(2)void SecondMenu(void);/子菜单的函数声明,打印子功能的选项(3) 试题录入模块功能实现的主要函数定义及算法分析:void Inserttext(struct choisesnode *t)dochar ch1;char (*choisestemp)100;int i=0;printf(*是否要往试题库添加一道试题:Y or N*n);/*让用户确定是否要往试题库添加试题,用户输入Y则进入添加试题,N则退出添加试题并*回到主菜单,输入其他的则系统会报错并提示用户重新输入*/choisestemp=t-choises;ch1=ge
7、tchar();getchar();if(N=ch1)break;else if(Y=ch1)fseek(fp,0,2);/将试题库文本的文件指针置于末尾以追加试题printf(*请输入要添加的问题的题干:*n);gets(t-ask);/将用户输入的试题的题干存入已定义的结构体的题干域,下面的操作也类似fprintf(fp,%sn,t-ask);/将该结构体的题干域写入试题库文本文件,下面的操作也类似printf(*请输入要添加的问题的四个选项,逐个输入:*n);for(; choisestempichoises4; i+)gets(choisestempi);fprintf(fp,%sn,
8、choisestempi);printf(*请输入要添加的问题的答案:*n);t-answay=getchar();getchar();fprintf(fp,%cn,t-answay);else printf(*请按要求输入:Y or N*n); /系统报错并提示用户重新输入,系统容错性得到提高while(1);(4)随机抽取试题模块让两个主要函数实现:void Getnumber(struct choisesnode *headt, int *j)/*此函数用二级指针来接收结构体指针的地址,为该指针申请动态存储空间,把试题库现有的试题都*存入链表,并且由申请动态存储空间的次数得出试题库现有的
9、试题总数,并用存于j所指变量*/ struct choisesnode *before=NULL;struct choisesnode *pt=NULL;int i=0;int k=0;*j=0; rewind(fp);/把试题库文本文件指针重置于开头while(!feof(fp)pt=(struct choisesnode*)malloc(sizeof(struct choisesnode);pt-next=NULL;+(*j); fgets(pt-ask,200,fp);/将试题题干读出,下面的读出选项及答案类似该过程for(k=0;kchoisesk,100,fp); fscanf(fp
10、,%cn,&pt-answay);if(NULL=*headt)*headt=pt;elsebefore-next=pt;before=pt;/*产生N个随机数的函数的主要语句及算法分析,并且保证N个随机数不相同,由此间接达到随机抽*取试题的效果*/for(i=0; iN1; i+)int l=0;atpi=1+rand()%j;for(; li;)if(atpi=atpl)/*将每个产生的随机数与前面的所有随机数比较,相同时则重新产生随机数并为之赋值,接着重新比*较,如此循环直到产生的随机数都与前面的所有随机数不同*/atpi=1+rand()%j;l=0;elsel+;(5)答题模块:/答
11、题模块比较简单,该函数打印抽取到的每道试题,接着用一个数组存储用户回答的答案void Answay(struct choisesnode *node1,char *ans2,int j)int jt=0;for(;jtask);for(;kchoisesk);printf(*请输入答案:*n);*ans2+=getchar();getchar();node1=node1-next;(6)自动判卷模块:/*该模块也比较简单,只需要将用于存储用户的回答的数组的每一个答案与对应试题每一个答案比较*即可,函数如下*/void Judge(struct choisesnode *node1, char
12、*ans2)int sum=0;int kt=0;int flag200=0,;struct choisesnode *node2;node2=node1;while(NULL!=node2)if(node2-answay=(*ans2)sum+;flagkt=1;+ans2;+kt;node2=node2-next;node2=node1;kt=0;for(;NULL!=node2;node2=node2-next)if(flagkt)printf(*第%d题正确*n,kt+1);elseprintf(*第%d题错误*n,kt+1);kt+;printf(*共答对%d题*n,sum);(7)
13、其他功能模块:/*该模块的“重新答题”功能的实现主要为重新调用答题模块,显示答案则只是打印试题链表的答案*域,都比较简单*/(8)退出系统模块:直接释放申请的内存并返回五、测试数据及其结果分析进入单项选择题标准化考试系统后输入测试数据:AY世界上海拔最高的山峰是哪一座?A.乔戈里峰 B.珠穆朗玛峰 C.干城章嘉峰 D.公格尔山峰B结果分析:打开“D/:试题库.txt”,可以在文本的最后看到如下世界上海拔最高的山峰是哪一座?A.乔戈里峰 B.珠穆朗玛峰 C.干城章嘉峰 D.公格尔山峰B分析如下:因为我们在主菜单选择了“A.试题录入”,于是我们在终端输入的试题就会被添加到试题库六、调试过程中的问题
14、每个模块设计和调试时存在问题的思考(问题是哪些问题如何解决?),以及算法的改进设想。(1)用文件保存试题库模块:问题有:每次要录入试题时,应该把文件指针移到末尾,调用文件的随机访问函数rewind可以解决这个问题(2)试题录入模块:问题有:调试过程中未出现问题(3)试题抽取模块:问题有:形参要使用二级指针接收结构体指针的地址为之申请动态存储空间(4)答题模块:问题有:语法等细节问题,不一一说明(5)自动判卷模块:问题有:调试过程中未出现重要问题(6)自动增加的新功能模块:问题有:调试过程中未出现(7)退出系统模块:问题有:每次退出系统之前应该释放申请的动态存储空间,调用free函数可以解决这个
15、问题七、课程设计总结总结可以包括 : 程序设计过程的收获、遇到的问题,遇到问题解决问题过程的思考、程序调试能力的思考,对该课程组织和考核方式的建议等。程序设计过程的收获:(1)指针很好用但是很危险,对于不需要的指针要置为空指针,避免产生野指针(2)采用多个文件、文件包含去实现程序(3)采用类去描述遇到的问题,遇到问题解决问题过程的思考:专心-专注-专业1.课程设计目的本程序旨在训练基本编程能力,了解操作信息系统的开发流程,熟悉C语言的文件和结构数组的各种基本操作。本程序涉及结构体、数组、指针、文件等方面的知识。通过本程序的训练,使读者能对C语言的文件操作有一个更深刻的了解,掌握利用数组存储结构
16、实现单项选择题标准化考试系统,为进一步开发出高质量信息管理系统打下坚实的基础。2.功能描述键盘输入存储至结构体试题录入模块根据需求描述,本人按照结构化程序设计的原则将整个系统划分若干个功能模块。 系统各子模块的设计如下:将结构体内容写入文本现有试题库所有试题读出至链表并得出试题总数单项选择题标准化考试系统 产生用户要回答的试题数N个位于试题总数范围的随机数试题抽取模块依次按随机数挑选链表结点,重新组成链表并释放原链表系统依次打印试题用户输入答案,答案存入数组用户答题模块回答的数组与试题链表答案域比较自动判卷模块打印每道题的正误及总分重新答题,调用用户答题模块显示答案,打印试题结点答案域其他功能
17、模块 退出系统 图1 单项选择题标准化考试系统功能模块图3.数据结构设计本程序定义了结构体choisesnode,主要用于存放试题的基本信息,如下所示:Struct choisesnode Char ask200;Char choises4100;Char answay;Struct choisesnode *next;其中,各字段含义如下ask200:试题的题干choises4100:试题的四个选项answay:试题的答案next:指向下一个试题4.功能模块设计4.1主控模块设计首先,调用Menu()函数显示初始界面;其次用户输入nu以作选择,用switch语句实现该系统各功能,若nu为A,
18、系统实现录入试题功能;若nu为B,系统实现随机抽取试题功能;若nu为C,系统实现用户答题功能;若nu为D,系统实现自动判卷功能;若nu为E,系统实现其他功能,此时显示子菜单,其他功能分为重新答题与显示答案;若nu为F,系统实现退出系统功能。4.2用文件保存试题库模块应该预备一个试题库文本,试题库中可以事先存有试题,每一个试题用一个结构体变量存储;4.3试题录入模块临时创建一个结构体变量存储从键盘输入的一个试题的数据;再用fprintf函数将该结构体的数据写入文本;4.4试题抽取模块将试题库中所有试题依次读到一个结构体链表中,由键盘输入的N产生N个随机数可以将随机数用一个数组存储,按照每一个随机
19、数的值确定所抽取到的试题,并将试题存储到另一个链表,达到间接的随机抽取试题的效果,同时释放第一个链表的内存;4.5答题模块建立一个数组存储用户所输入的答案,将答案同链表的对应的结点的答案域部分比较,相同则正确,并且设置的累加器自增加1,同时设置的标志数组(初始化为0)在对应位置置为1,表示该题正确;答案对比不同时则累加器与标志数组都在对应位置不操作;4.6自动判卷模块输出累加器的值表示总共答对的试题总数,同时输出标志数组每一道题的标志表示答对与答错的试题;4.7自动增加的新功能模块该模块会弹出二级菜单,具体有“重新答题”、“显示答案”及“返回主菜单”三个功能;“重新答题”将调用答题模块,将刚刚
20、答过的题重新让用户回答,“显示答案”将打印每一个试题结点的答案域,“返回主菜单”则break跳出并打印主菜单;4.8退出系统模块释放内存并且return返回0;5.运行结果6.1系统主界面 用户刚进入系统时,如图4所示。 各个功能模块的详描细描述见功能需求介绍6.个人设计小结与心得体会指针很好用但是很危险,对于不需要的指针要置为空指针,避免产生野指针采用多个文件、文件包含去实现程序采用类去描述参考文献(1)高质量C/C+编程指南林锐(2)C程序设计语言K&RC附件1 程序源代码(带版权及版本信息)/* Copyright (c) 2013,南京邮电大学* All rights reserved
21、.* 文件名称:Danxuan.c* 摘要:单项选择题标准化考试系统* 附:试题库文本文件(“试题库.txt”)* 当前版本:1.1* 作者:蔡华斌* 完成日期:2013年3月27日* 取代版本:无* 原作者:蔡华斌* 完成日期:2013年3月27日*/#include#include#include#includestruct choisesnode/char ask200;char choises4100;char answay;struct choisesnode *next;void Menu(void);/void SecondMenu(void);void Inserttext(s
22、truct choisesnode *t);/void Getnumber(struct choisesnode *headt, int *j);/struct choisesnode *Getquestions(int N1, int *atp, int j, struct choisesnode *headt);/void Answay(struct choisesnode *node1, char *ans2, int j);/void Judge(struct choisesnode *node1, char *ans2);/void PrintAnsway(struct choise
23、snode *node1);/FILE *fp;int N;int NN=0;char nu;int at200;char answay2200;int main() struct choisesnode *node1=NULL;struct choisesnode temp;temp.next=NULL;if(!(fp=fopen(D:试题库.txt,a+) printf(*打开试题库出错*n);exit(1);do Menu(); nu=getchar();getchar(); switch(nu) case A:printf(*请输入要加入试题库的问题,按题干,选项,正确答案的顺序输入*
24、n);Inserttext(&temp); break; case B: struct choisesnode *headt=NULL;printf(*请输入要求答题的数目*n); Getnumber(&headt, &NN);doprintf(*N必须大于0并且小于%d*n,NN+1); scanf(%d,&N); getchar();while(NNN);while(NULL!=node1) struct choisesnode *temq=NULL;temq=node1;node1=node1-next;free(temq);node1=Getquestions(N,at,NN,head
25、t); break; case C:char ch2;int jt=N; printf(*是否已经执行第二个选项:Y or N*n);ch2=getchar();getchar();if(N=ch2|NULL=node1)printf(*加载试题失败,请先选择并执行第二个选项*n);break;if(Y=ch2)Answay(node1,answay2,jt);elseprintf(*请正确输入:Y or N*n); break; case D: Judge(node1, answay2); break; case E:char mu;do int jt=N; SecondMenu();mu=
26、getchar(); getchar();switch(mu) case A: PrintAnsway(node1);break;case B: Answay(node1,answay2,jt);break;case C: break;default :printf(*输入错误,请按要求输入*n);break;while(C!=mu);break; case F: struct choisesnode *pt,*qt=node1; while(NULL!=qt) pt=qt;qt=qt-next; free(pt);break; default:printf(*输入错误*n); break;
27、while(F!=nu); fclose(fp); fp=NULL; return 0;void Menu(void) printf(*单项选择题标准化考试系统*n);printf(*A.录入试题*n);printf(*B.试题抽取*n);printf(*C.我要答题*n); printf(*D.自动判卷*n); printf(*E.其他功能*n); printf(*F.我要退出*n*请选择一个选项*n);/void SecondMenu(void) printf(*其他功能*n);printf(*A.显示答案*n);printf(*B.重新答题*n);printf(*C.返回主菜单*n);
28、printf(*请选择一个选项*n);/void Inserttext(struct choisesnode *t)dochar ch1;char (*choisestemp)100;int i=0;printf(*是否要往试题库添加一道试题:Y or N*n);choisestemp=t-choises;ch1=getchar();getchar();if(N=ch1)break;else if(Y=ch1)fseek(fp,0,2);printf(*请输入要添加的问题的题干:*n);gets(t-ask);fprintf(fp,%sn,t-ask);printf(*请输入要添加的问题的四个
29、选项,逐个输入:*n);for(; choisestempichoises4; i+)gets(choisestempi);fprintf(fp,%sn,choisestempi);printf(*请输入要添加的问题的答案:*n);t-answay=getchar();getchar();fprintf(fp,%cn,t-answay);else printf(*请按要求输入:Y or N*n);while(1);/void Getnumber(struct choisesnode *headt, int *j) struct choisesnode *before=NULL;struct c
30、hoisesnode *pt=NULL;int i=0;int k=0;*j=0; rewind(fp);while(!feof(fp)pt=(struct choisesnode*)malloc(sizeof(struct choisesnode);pt-next=NULL;+(*j); fgets(pt-ask,200,fp);for(k=0;kchoisesk,100,fp); fscanf(fp,%cn,&pt-answay);if(NULL=*headt)*headt=pt;elsebefore-next=pt;before=pt;/struct choisesnode *Getqu
31、estions(int N1, int *atp, int j, struct choisesnode *headt)struct choisesnode *head=NULL;struct choisesnode *before=NULL;struct choisesnode *pt=NULL;struct choisesnode *qt=NULL;int i=0;int k=0;srand(unsigned)time(0);for(i=0; iN1; i+)int l=0;atpi=1+rand()%j;for(; li;)if(atpi=atpl)atpi=1+rand()%j;l=0;
32、elsel+; before=NULL;pt=NULL;while(knext=NULL; qt=headt;while(-atpk)qt=qt-next; strcpy(pt-ask,qt-ask);for(k1=0;qt-choisesk1choises4;k1+)strcpy(pt-choisesk1,qt-choisesk1); pt-answay=qt-answay;if(NULL=head)head=pt;elsebefore-next=pt;before=pt;k+;while(NULL!=headt) struct choisesnode *st;st=headt; headt
33、=headt-next; free(st);return head;/void Answay(struct choisesnode *node1,char *ans2,int j)int jt=0;for(;jtask);for(;kchoisesk);printf(*请输入答案:*n);*ans2+=getchar();getchar();node1=node1-next;/void Judge(struct choisesnode *node1, char *ans2)int sum=0;int kt=0;int flag200=0,;struct choisesnode *node2;node2=node1;while(NULL!=node2)if(node2-answay=(*ans2)sum+;flagkt=1;+ans2;+kt;node2=node2-next;node2=node1;kt=0;for(;NULL!=node2;node2=node2-next)if(flagkt)printf(*第%d题正确*n,kt+1);elseprintf(*第%d题错误*n,kt+1);kt+;printf(*共答对%d题*n,sum);