标准化考试系统C语言版.docx
《标准化考试系统C语言版.docx》由会员分享,可在线阅读,更多相关《标准化考试系统C语言版.docx(18页珍藏版)》请在冰豆网上搜索。
标准化考试系统C语言版
课程报告
课程名称:
程序设计实践
专业班级:
学生姓名:
学号:
任课教师:
唐建国
学期:
2013-2014学年第二学期
课程报告任务书
题目
标准化考试系统
主要
内容
开发出一个标准化考试系统,所谓标准化考试系统即仅支持选择题,也是为方便自动批改的功能的实现。
要求实现以下基本功能:
(1)提供给教师添加试题的功能(试题信息用文件保存)--输入
(2)试题库的整体浏览功能
(3)能够随机抽取试题组合成一套试卷
(4)教师实现题目信息的管理,比如删除、修改等
(5)查询功能(题号查询、题目查询)、排序功能(题号排序)
扩展功能:
(1)学生和教师不同身份的注册登录功能
(2)可以对题目进行模糊查询
(3)可以统计题库内试题总数
(4)学生可以进行抽题考试并得出成绩
任务
要求
一、提交材料应包括:
(1)系统源代码
(2)课程报告
二、整个设计过程具体要求
(1)需求分析要求学生对案例系统进行分析,设计出需要完成的功能,完善各个模块的调用关系;
(2)设计过程要求学生进一步明确各模块调用关系,进一步完善模块函数细节(函数名、参数、返回值等)
(3)实现过程要求学生养成良好的编码习惯、完成各个模块并进行测试,最终完成系统整体测试;
(4)总结阶段按照要求完成系统设计和实现报告,并进行总结、答辩。
成绩
评定
报告撰写情况(30分)
系统完成情况(30分)
答辩情况(40分)
总分
内容
20分
规范程度
5分
程序测试
5分
基本功能20分
扩展功能10分
自述情况10分
答辩情况
30分
成绩评定教师:
1需求分析
根据程序要求分析,我们认为整个程序应该分为4个大块,其中包括主函数以及其他功能函数:
注册登录模块,学生操作模块,教师操作模块。
各个模块又利用小模块实现小功能划分,教师操作模块由创建题库、插入题目、修改题目、删除题目、显示题目、题目排序、查询题目这7个模块组成,而其中查询题目又包含了题号查询、题目查询和模糊查询3个小模块;注册登录模块由4个函数完成对学生教师不同身份的注册及登录,学生登录后可以选择答题数量组成试卷考试并得到成绩。
通过这些模块的组合连接,就可以实现一个完整的标准化考试系统。
2系统设计
2.1.数据结构设计
voidStudent_login();/*学生登录*/
voidTeacher_login();/*教师登录*/
voiddenglu();/*主菜单*/
voidAddstudent(charid[],charpassword[]);/*将学生账号密码存入文件*/
voidAddteacher(charid[],charpassword[]);/*将教师账号密码存入文件*/
voidTeachermenu();/*教师菜单*/
voidStudentmenu();/*学生菜单*/
voidPrintDoc(structtext*head);/*从文件中读取题库信息并输出*/
voidNameQueDoc(structtext*head);/*按照题目查询信息*/
voidNumberQueDoc(structtext*head);/*按照题号查询信息*/
voidNameVagueDoc(structtext*head);/*按照题目模糊查询信息*/
voidkaoshi(structtext*head,intsum,intk);/*学生考试菜单*/
voidfprint(structtext*head);/*将链表写入文件*/
structtext*CreateDoc();/*创建试题库并通过链表存入文件*/
structtext*load();/*从文件读取题库信息并存入链表*/
structtext*DeleteDoc(structtext*head);/*删除题库题目信息*/
structtext*ReviseDoc(structtext*head);/*修改题库题目信息*/
structtext*InsertDoc(structtext*head,structtext*book);/*插入题目*/
structtext*SortDoc(structtext*head);/*对题库题目进行排序*/
structtext*QueDoc(structtext*head);/*题库查询菜单*/
intcount(structtext*head);/*统计题库中题目总数*/
intyanzheng(structtext*head,intm);/*验证题号是否重复*/
char*Getpasswd(void);/*将注册登录的密码转为星号*/
structtext{
intnumber;
charque[81];
charanswer1[81];
charanswer2[81];
charanswer3[81];
charanswer4[81];
charture[81];
structtext*next;
};/*定义text结构*/
2.2.功能模块设计
2.2.1:
主菜单模块
2.2.2:
教师菜单模块
退出系统
查询题库题目
题库题目排序
显示题库题目
删除题库题目
修改题库题目
插入题库题目
创建试题库
教师操作界面
2.2.3:
学生菜单模块
学生操作界面
开始考试
退出系统
3系统实现及关键代码
3.1基本功能
3.1.1菜单设计
voiddenglu()
{
charid[81],password1[81]={NULL},password2[81]={NULL};
intchoice,choi;
printf("\n");
printf("〒〒〒〒〒欢迎进入标准化考试系统:
〒〒〒〒〒\n");
printf("★★★★★★★welcome★★★★★★★\n");
printf("\t*【1】注册账户*\n");
printf("\t*【2】登陆账户*\n");
printf("\t*【0】退出系统*\n");
printf("\n");
printf("请输入你的选择:
");
scanf("%d",&choice);
system("cls");//清屏
switch(choice)
{
case1:
printf("\n");
printf("〒〒〒〒欢迎进入标准化考试系统注册账户界面:
〒〒〒〒\n");
printf("★★★★★★★★★welcome★★★★★★★★★\n");
printf("1-----学生注册2-----教师注册\n");
printf("3-----返回上一级0-----退出系统\n");
printf("\n");
printf("请选择注册模式:
");
scanf("%d",&choi);
system("cls");//清屏
switch(choi)
{
case1:
printf("\n");
printf("〒〒〒〒欢迎进入标准化考试系统学生注册界面:
〒〒〒〒\n");
printf("★★★★★★★★★welcome★★★★★★★★★\n");
printf("请输入学生姓名:
");
scanf("%s",&id);
printf("请输入密码,密码长度最大为6:
");
strcpy(password1,GetPasswd());
printf("\n请再次输入密码:
");
strcpy(password2,GetPasswd());
if(strcmp(password1,password2)==0)
Addstudent(id,password1);
else
printf("\n两次密码不一致,返回主菜单!
\n");
denglu();
case2:
printf("\n");
printf("〒〒〒〒欢迎进入标准化考试系统教师注册界面:
〒〒〒〒\n");
printf("★★★★★★★★★welcome★★★★★★★★★\n");
printf("请输入教师姓名:
");
scanf("%s",&id);
printf("请输入密码,密码长度最大为6:
");
strcpy(password1,GetPasswd());
printf("\n请再次输入密码:
");
strcpy(password2,GetPasswd());
if(strcmp(password1,password2)==0)
Addteacher(id,password1);
else
printf("\n两次密码不一致,返回主菜单!
\n");
denglu();
case3:
denglu();
case0:
printf("系统即将关闭!
\n");
exit(0);
default:
printf("无效选项!
\n");
denglu();
}
case2:
printf("\n");
printf("〒〒〒〒欢迎进入标准化考试系统注册账户界面:
〒〒〒〒\n");
printf("★★★★★★★★★welcome★★★★★★★★★\n");
printf("1-----学生登录2-----教师登录\n");
printf("3-----返回上一级0-----退出系统\n");
printf("\n");
printf("请选择登录模式:
");
scanf("%d",&choi);
system("cls");//清屏
switch(choi)
{
case1:
Student_login();
case2:
Teacher_login();
case3:
denglu();
case0:
printf("系统即将关闭!
\n");
exit(0);
default:
printf("无效选项\n");
denglu();
}
case0:
printf("系统即将关闭!
\n");
exit(0);
default:
printf("无效选项!
\n");
denglu();
}
}
3.1.2文件读写
/*-----------------------------------------------将链表写入文件--------------------------------------*/
voidfprint(structtext*head)
{
FILE*fp;
structtext*p1;
if((fp=fopen("G:
\\试题库.txt","w"))==NULL){
printf("Cannotopenthefile!
\n");
exit(0);
}
for(p1=head;p1;p1=p1->next){
fprintf(fp,"%d%s%s%s%s%s%s\n",p1->number,p1->que,p1->answer1,p1->answer2,p1->answer3,p1->answer4,p1->ture);
}
fclose(fp);
}
/*------------------------------------------从文件读取题库信息--------------------------*/
structtext*load()
{
FILE*fp;
structtext*head,*tail,*p1;
head=tail=NULL;
if((fp=fopen("G:
\\试题库.txt","r"))==NULL){
printf("文件输入错误!
\n");
exit(0);
}
if(!
feof(fp)){
while(!
feof(fp)){
p1=(structtext*)malloc(sizeof(structtext));
fscanf(fp,"%d%s%s%s%s%s%s\n",&p1->number,p1->que,p1->answer1,p1->answer2,p1->answer3,&p1->answer4,&p1->ture);
if(head==NULL)
head=p1;
else
tail->next=p1;
tail=p1;
}
tail->next=NULL;
fclose(fp);
returnhead;
}
else
returnNULL;
}
3.1.3删除题目信息
structtext*DeleteDoc(structtext*head)
{
inta;
structtext*p1,*p2;
printf("请输入要删除题目的题号:
");
scanf("%d",&a);
while(head!
=NULL&&head->number==a)
{
p2=head;
head=head->next;
free(p2);
}
if(head==NULL)
{
returnNULL;
}
p1=head;
p2=head->next;
while(p2!
=NULL)
{
if(p2->number==a)
{
p1->next=p2->next;
free(p2);
}
else
p1=p2;
p2=p1->next;
}
fprint(head);
returnhead;
}
3.2拓展功能
3.2.1密码设计
char*GetPasswd(void)
{
charc;
inti=0;
charpasswd[6]={NULL};
while((c=getch())!
='\r')
{
passwd[i]=c;
putchar('*');
i++;
if(i>=6)
{
break;
}
}
returnpasswd;
}
3.2.2考试函数
voidkaoshi(structtext*head,intsum,intk)/*随机抽题考试*/
{
intscore=0,a[1000],i,j;
charanswer[81],answer1[81];
srand((unsigned)time(NULL));/*保证随机出来不重复的数字*/
for(i=0;i{
a[i]=rand()%k+1;/*随机产生1~k之间一个整数*/
for(j=0;j
if(a[i]==a[j])
i--;
}
for(i=0;i{
structtext*p;
p=head;
while(p!
=NULL){
if(p->number==a[i])
break;
p=p->next;
}
printf("题号:
%d\n",p->number);
printf("题目:
%s\n",p->que);
printf("选项A:
%s选项B:
%s\n",p->answer1,p->answer2);
printf("选项C:
%s选项D:
%s\n",p->answer3,p->answer4);
strcpy(answer,p->ture);
printf("\n");
printf("请输入答案:
");
scanf("%s",answer1);
if(strcmp(answer,answer1)==0)
{
printf("回答正确!
\n");
printf("\n");
score++;
}
else
{
printf("答案错误!
\n");
printf("正确答案为:
%s\n",answer);
printf("\n");
}
}
printf("您的总成绩为:
%d",score);
}/*学生通过此函数对随机的试题进行答题并得到自己的成绩*/
4系统演示
4.1基本功能
4.1.1文件读写功能
4.1.2插入题目功能
4.2拓展功能
4.2.1密码功能
4.2.2考试功能
5总结
5.1系统缺陷与不足
这个考试系统里面的学生界面功能还待加强,可以给学生更多的组卷方式,例如老师创建题库时可以给题目信息增加一个章节的信息,然后学生可以根据章节来组卷考试。
5.2系统可扩展功能
(1)修改密码功能;
(2)按章节组卷功能;
6课程心得总结
在编写学生考试函数时,使用的srand()和rand()函数未能随机产生不重复的数字,后来决定使用数组储存随机产生的数字,再通过for循环对每次产生的随机数和之前产生的进行比较,不同就存进数组,相同则继续循环,直至产生需要的随机数个数。
我学习C语言差不多一年了,其中学习过程中或多或少有些遗漏的知识点没有领悟透彻,通过这次做大程序的机会,得以将过去一年中学习的知识点再次连贯起来,有了一次比较综合的再学习,这次的大程序也还有一些功能因为所学知识的原因未能实现。
通过这次的大程序,也使我认识到自己的优点与不足,这将会激励我以后努力学习,争取更上一层楼。
参考书籍:
[1]谭浩强,C语言程序设计,第2版.北京:
高等教育出版社2014.
[2]StephenCPrata,PrimerPlus,第5版.北京:
人民邮电出版社2014.