最新单项选择题标准化考试系统.docx
《最新单项选择题标准化考试系统.docx》由会员分享,可在线阅读,更多相关《最新单项选择题标准化考试系统.docx(33页珍藏版)》请在冰点文库上搜索。
最新单项选择题标准化考试系统
据统计,上海国民经济持续快速增长。
03全年就实现国内生产总值(GDP)6250.81亿元,按可比价格计算,比上年增长11.8%。
第三产业的增速受非典影响而有所减缓,全年实现增加值3027.11亿元,增长8%,增幅比上年下降2个百分点。
1996年“碧芝自制饰品店”在迪美购物中心开张,这里地理位置十分优越,交通四通八达,由于位于市中心,汇集了来自各地的游客和时尚人群,不用担心客流量的问题。
迪美有300多家商铺,不包括柜台,现在这个商铺的位置还是比较合适的,位于中心地带,左边出口的自动扶梯直接通向地面,从正对着的旋转式楼梯阶而上就是人民广场中央,周边4、5条地下通道都交汇于此,从自家店铺门口经过的90%的顾客会因为好奇而进去看一下。
可见“体验化消费”广受大学生的欢迎、喜欢,这是我们创业项目是否成功的关键,必须引起足够的注意。
(一)上海的经济环境对饰品消费的影响
在上海,随着轨道交通的发展,地铁商铺应运而生,并且在重要商圈已经形成一定的气候,投资经营地铁商铺逐渐为一大热门。
在人民广场地下的迪美购物中心,有一家DIY自制饰品店--“碧芝自制饰品店”
他们的成功秘诀在于“连锁”二字。
凭借“连锁”,他们在女孩们所喜欢的小玩意上玩出了大名堂。
小店连锁,优势明显,主要有:
体现市民生活质量状况的指标---恩格尔系数,上海也从1995年的53.4%下降到了2003年的37.2%,虽然与恩格尔系数多在20%以下的发达国家相比仍有差距,但按照联合国粮农组织的划分,表明上海消费已开始进入富裕状态(联合国粮农组织曾依据恩格尔系数,将恩格尔系数在40%-50%定为小康水平的消费,20%-40%定为富裕状态的消费)。
众上所述,我们认为:
我们的创意小屋计划或许虽然会有很多的挑战和困难,但我们会吸取和借鉴“漂亮女生”和“碧芝”的成功经验,在产品的质量和创意上多下工夫,使自己的产品能领导潮流,领导时尚。
在它们还没有打入学校这个市场时,我们要巩固我们的学生市场,制作一些吸引学生,又有使学生能接受的价格,勇敢的面对它们的挑战,使自己立于不败之地。
(2)物品的独一无二
经常光顾□偶尔会去□不会去□
程序设计报告
(2012/2013学年第二学期)
题目:
单项选择题标准化考试系统
专业
学生姓名
班级学号
指导教师
指导单位
日期_
评分细则
评分项
优秀
良好
中等
差
遵守机房规章制度
上机时的表现
学习态度
程序准备情况
程序设计能力
团队合作精神
课题功能实现情况
算法设计合理性
用户界面设计
报告书写认真程度
内容详实程度
文字表达熟练程度
回答问题准确度
简短评语
教师签名:
年月日
评分等级
备注
评分等级有五种:
优秀、良好、中等、及格、不及格
课程设计报告具体内容要求:
程序设计题目名称
单项选择题标准化考试系统
一、课题内容和要求
(一)功能要求:
(1)用文件保存试题库。
(每个试题包括题干、4个备选答案、标准答案)
(2)试题录入:
可随时增加试题到试题库中
(3)试题抽取:
每次从试题库中可以随机抽出N道题(N由键盘输入)
(4)答题:
用户可实现输入自己的答案
(5)自动判卷:
系统可根据用户答案与标准答案的对比实现判卷并给出成绩。
(二)其它要求:
(1)只能使用C/C++语言,源程序要有适当的注释,使程序容易阅读
(2)至少采用文本菜单界面(如果能采用图形菜单界面更好)
(3)学生可自动增加新功能模块(视情况可另外加分)
(4)写出课程设计报告,具体要求见相关说明文档
二、需求分析
(1)用文件保存试题库模块:
应该预备一个试题库文本,试题库中可以事先存有试题,每一个试题用一个结构体变量存储;
(2)试题录入模块:
临时创建一个结构体变量存储从键盘输入的一个试题的数据;再用fprintf函数将该结构体的数据写入文本;
(3)试题抽取模块:
将试题库中所有试题依次读到一个结构体链表中,由键盘输入的N产生N个随机数可以将随机数用一个数组存储,按照每一个随机数的值确定所抽取到的试题,并将试题存储到另一个链表,达到间接的随机抽取试题的效果,同时释放第一个链表的内存;
(4)答题模块:
建立一个数组存储用户所输入的答案,将答案同链表的对应的结点的答案域部分比较,相同则正确,并且设置的累加器自增加1,同时设置的标志数组(初始化为0)在对应位置置为1,表示该题正确;答案对比不同时则累加器与标志数组都在对应位置不操作;
(5)自动判卷模块:
输出累加器的值表示总共答对的试题总数,同时输出标志数组每一道题的标志表示答对与答错的试题;
(6)自动增加的新功能模块:
该模块会弹出二级菜单,具体有“重新答题”、“显示答案”
及“返回主菜单”三个功能;“重新答题”将调用答题模块,将刚刚答过的题重新让用户回答,“显示答案”将打印每一个试题结点的答案域,“返回主菜单”则break跳出并打印主菜单;
(7)退出系统模块:
释放内存并且return返回0;
三、概要设计
(1)结构体的存储结构:
structchoisesnode{
Charask[200];
Charchoises[4][100];
Charansway;
structchoisesnode*next;
}
(2)用一个switch语句来确定用户在主菜单选择的功能选项,进入能实现不同的函数调用以实现用户需要的功能,二级菜单选项也是如此;
(3)其他各个模块的函数需要的功能见上述的“需求分析”;
(4)各个函数的算法详述及源代码见下文“源程序代码”;
四、源程序代码
各个算法实现的源程序(可以是一组源程序,每个功能模块采用不同的函数实现),源程序要按照写程序的规则来编写。
要结构清晰,重点函数的重点变量,重点功能部分要加上清晰的程序注释。
,程序清单可用TimesNewRoman字体,大小为5号,单倍行距。
(1)voidMenu(void);
//主菜单的函数声明,打印主功能的选项
(2)voidSecondMenu(void);
//子菜单的函数声明,打印子功能的选项
(3)试题录入模块功能实现的主要函数定义及算法分析:
voidInserttext(structchoisesnode*t)
{
do
{
charch1;
char(*choisestemp)[100];
inti=0;
printf("*****是否要往试题库添加一道试题:
YorN*****\n");
/*让用户确定是否要往试题库添加试题,用户输入Y则进入添加试题,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,"%s\n",t->ask);
//将该结构体的题干域写入试题库文本文件,下面的操作也类似
printf("*****请输入要添加的问题的四个选项,逐个输入:
*****\n");
for(;choisestemp[i]choises[4];i++)
{
gets(choisestemp[i]);
fprintf(fp,"%s\n",choisestemp[i]);
}
printf("*****请输入要添加的问题的答案:
*****\n");
t->answay=getchar();
getchar();
fprintf(fp,"%c\n",t->answay);
}
elseprintf("*****请按要求输入:
YorN*****\n");
//系统报错并提示用户重新输入,系统容错性得到提高
}
while
(1);
}
(4)随机抽取试题模块让两个主要函数实现:
voidGetnumber(structchoisesnode**headt,int*j)
/*此函数用二级指针来接收结构体指针的地址,为该指针申请动态存储空间,把试题库现有的试题都*存入链表,并且由申请动态存储空间的次数得出试题库现有的试题总数,并用存于j所指变量*/
{
structchoisesnode*before=NULL;
structchoisesnode*pt=NULL;
inti=0;
intk=0;
*j=0;
rewind(fp);//把试题库文本文件指针重置于开头
while(!
feof(fp))
{
pt=(structchoisesnode*)malloc(sizeof(structchoisesnode));
pt->next=NULL;
++(*j);
fgets(pt->ask,200,fp);//将试题题干读出,下面的读出选项及答案类似该过程
for(k=0;k<4;k++)
fgets(pt->choises[k],100,fp);
fscanf(fp,"%c\n",&pt->answay);
if(NULL==*headt)
*headt=pt;
else
before->next=pt;
before=pt;
}
}
/*产生N个随机数的函数的主要语句及算法分析,并且保证N个随机数不相同,由此间接达到随机抽*取试题的效果*/
for(i=0;i{
intl=0;
atp[i]=1+rand()%j;
for(;l
{
if(atp[i]==atp[l])
/*将每个产生的随机数与前面的所有随机数比较,相同时则重新产生随机数并为之赋值,接着重新比
*较,如此循环直到产生的随机数都与前面的所有随机数不同*/
{
atp[i]=1+rand()%j;
l=0;
}
else
l++;
}
}
(5)答题模块:
//答题模块比较简单,该函数打印抽取到的每道试题,接着用一个数组存储用户回答的答案
voidAnsway(structchoisesnode*node1,char*ans2,intj)
{
intjt=0;
for(;jt{
intk=0;
printf("*****第%d题:
*****\n",jt+1);
puts(node1->ask);
for(;k<4;k++)
puts(node1->choises[k]);
printf("*****请输入答案:
*****\n");
*ans2++=getchar();
getchar();
node1=node1->next;
}
}
(6)自动判卷模块:
/*该模块也比较简单,只需要将用于存储用户的回答的数组的每一个答案与对应试题每一个答案比较*即可,函数如下*/
voidJudge(structchoisesnode*node1,char*ans2)
{
intsum=0;
intkt=0;
intflag[200]={0,};
structchoisesnode*node2;
node2=node1;
while(NULL!
=node2)
{
if(node2->answay==(*ans2))
{
sum++;
flag[kt]=1;
}
++ans2;
++kt;
node2=node2->next;
}
node2=node1;
kt=0;
for(;NULL!
=node2;node2=node2->next)
{
if(flag[kt])
printf("*****第%d题正确*****\n",kt+1);
else
printf("*****第%d题错误*****\n",kt+1);
kt++;
}
printf("*****共答对%d题*****\n",sum);
}
(7)其他功能模块:
/*该模块的“重新答题”功能的实现主要为重新调用答题模块,显示答案则只是打印试题链表的答案
*域,都比较简单*/
(8)退出系统模块:
直接释放申请的内存并返回
五、测试数据及其结果分析
进入单项选择题标准化考试系统后输入测试数据:
A
Y
世界上海拔最高的山峰是哪一座?
A.乔戈里峰
B.珠穆朗玛峰
C.干城章嘉峰
D.公格尔山峰
B
结果分析:
打开“D//:
试题库.txt”,可以在文本的最后看到如下
世界上海拔最高的山峰是哪一座?
A.乔戈里峰
B.珠穆朗玛峰
C.干城章嘉峰
D.公格尔山峰
B
分析如下:
因为我们在主菜单选择了“A.试题录入”,于是我们在终端输入的试题就会被添加到试题库
六、调试过程中的问题
每个模块设计和调试时存在问题的思考(问题是哪些问题如何解决?
),以及算法的改进设想。
(1)用文件保存试题库模块:
问题有:
每次要录入试题时,应该把文件指针移到末尾,调用文件的随机访问函数rewind可以解决这个问题
(2)试题录入模块:
问题有:
调试过程中未出现问题
(3)试题抽取模块:
问题有:
形参要使用二级指针接收结构体指针的地址为之申请动态存储空间
(4)答题模块:
问题有:
语法等细节问题,不一一说明
(5)自动判卷模块:
问题有:
调试过程中未出现重要问题
(6)自动增加的新功能模块:
问题有:
调试过程中未出现
(7)退出系统模块:
问题有:
每次退出系统之前应该释放申请的动态存储空间,调用free函数可以解决这个问题
七、课程设计总结
总结可以包括:
程序设计过程的收获、遇到的问题,遇到问题解决问题过程的思考、程序调试能力的思考,对该课程组织和考核方式的建议等。
程序设计过程的收获:
(1)指针很好用但是很危险,对于不需要的指针要置为空指针,避免产生野指针
(2)采用多个文件、文件包含去实现程序
(3)采用类去描述
遇到的问题,遇到问题解决问题过程的思考:
1.课程设计目的
本程序旨在训练基本编程能力,了解操作信息系统的开发流程,熟悉C语言的文件和结构数组的各种基本操作。
本程序涉及结构体、数组、指针、文件等方面的知识。
通过本程序的训练,使读者能对C语言的文件操作有一个更深刻的了解,掌握利用数组存储结构实现单项选择题标准化考试系统,为进一步开发出高质量信息管理系统打下坚实的基础。
2.功能描述
根据需求描述,本人按照结构化程序设计的原则将整个系统划分若干个功能模块。
系统各子模块的设计如下:
——————
————
图1单项选择题标准化考试系统功能模块图
3.数据结构设计
本程序定义了结构体choisesnode,主要用于存放试题的基本信息,如下所示:
Structchoisesnode{
Charask[200];
Charchoises[4][100];
Charansway;
Structchoisesnode*next;
}
其中,各字段含义如下
ask[200]:
试题的题干
choises[4][100]:
试题的四个选项
answay:
试题的答案
next:
指向下一个试题
4.功能模块设计
4.1主控模块设计
首先,调用Menu()函数显示初始界面;其次用户输入nu以作选择,用switch语句实现该系统各功能,若nu为A,系统实现录入试题功能;若nu为B,系统实现随机抽取试题功能;若nu为C,系统实现用户答题功能;若nu为D,系统实现自动判卷功能;若nu为E,系统实现其他功能,此时显示子菜单,其他功能分为重新答题与显示答案;若nu为F,系统实现退出系统功能。
4.2用文件保存试题库模块
应该预备一个试题库文本,试题库中可以事先存有试题,每一个试题用一个结构体变量存储;
4.3试题录入模块
临时创建一个结构体变量存储从键盘输入的一个试题的数据;再用fprintf函数将该结构体的数据写入文本;
4.4试题抽取模块
将试题库中所有试题依次读到一个结构体链表中,由键盘输入的N产生N个随机数可以将随机数用一个数组存储,按照每一个随机数的值确定所抽取到的试题,并将试题存储到另一个链表,达到间接的随机抽取试题的效果,同时释放第一个链表的内存;
4.5答题模块
建立一个数组存储用户所输入的答案,将答案同链表的对应的结点的答案域部分比较,相同则正确,并且设置的累加器自增加1,同时设置的标志数组(初始化为0)在对应位置置为1,表示该题正确;答案对比不同时则累加器与标志数组都在对应位置不操作;
4.6自动判卷模块
输出累加器的值表示总共答对的试题总数,同时输出标志数组每一道题的标志表示答对与答错的试题;
4.7自动增加的新功能模块
该模块会弹出二级菜单,具体有“重新答题”、“显示答案”
及“返回主菜单”三个功能;“重新答题”将调用答题模块,将刚刚答过的题重新让用户回答,“显示答案”将打印每一个试题结点的答案域,“返回主菜单”则break跳出并打印主菜单;
4.8退出系统模块
释放内存并且return返回0;
5.运行结果
6.1系统主界面
用户刚进入系统时,如图4所示。
各个功能模块的详描细描述见功能需求介绍
6.个人设计小结与心得体会
指针很好用但是很危险,对于不需要的指针要置为空指针,避免产生野指针
采用多个文件、文件包含去实现程序
采用类去描述
参考文献
(1)《高质量C/C++编程指南》———————————————林锐
(2)《C程序设计语言》——————————————————K&RC
附件1程序源代码(带版权及版本信息)
/*
*Copyright(c)2013,南京邮电大学
*Allrightsreserved.
*文件名称:
Danxuan.c
*摘要:
单项选择题标准化考试系统
*附:
试题库文本文件(“试题库.txt”)
*
*当前版本:
1.1
*作者:
蔡华斌
*完成日期:
2013年3月27日
*
*取代版本:
无
*原作者:
蔡华斌
*完成日期:
2013年3月27日
*/
#include
#include
#include
#include
structchoisesnode//
{
charask[200];
charchoises[4][100];
charansway;
structchoisesnode*next;
};
voidMenu(void);
//
voidSecondMenu(void);
voidInserttext(structchoisesnode*t);
//
voidGetnumber(structchoisesnode**headt,int*j);
//
structchoisesnode*Getquestions(intN1,int*atp,intj,structchoisesnode*headt);
//
voidAnsway(structchoisesnode*node1,char*ans2,intj);
//
voidJudge(structchoisesnode*node1,char*ans2);
//
voidPrintAnsway(structchoisesnode*node1);
//
FILE*fp;
intN;
intNN=0;
charnu;
intat[200];
charansway2[200];
intmain()
{
structchoisesnode*node1=NULL;
structchoisesnodetemp;
temp.next=NULL;
if(!
(fp=fopen("D:
\\试题库.txt","a+")))
{
printf("*****打开试题库出错*****\n");
exit
(1);
}
do{
Menu();
nu=getchar();
getchar();
switch(nu)
{
case'A':
{
printf("*****请输入要加入试题库的问题,按题干,选项,正确答案的顺序输入*****\n");
Inserttext(&temp);
}
break;
case'B':
{
structchoisesnode*headt=NULL;
printf("*****请输入要求答题的数目*****\n");
Getnumber(&headt,&NN);
do
{
printf("*****N必须大于0并且小于%d*****\n",NN+1);
scanf("%d",&N);
getchar();
}
while(N<1||N>NN);
while(NULL!
=node1)
{
structchoisesnode*temq=NULL;
temq=node1;
node1=node1->next;
free(temq);
}
node1=Getquestions(N,at,NN,headt);
}
break;
case'C':
{
charch2;
intjt=N;
printf("*****是否已经执行第二个选项:
YorN*****\n");
ch2=getchar();
getchar();
if('N'==ch2||NULL==node1)
{