标准化考试系统课程设计报告.docx
《标准化考试系统课程设计报告.docx》由会员分享,可在线阅读,更多相关《标准化考试系统课程设计报告.docx(55页珍藏版)》请在冰点文库上搜索。
标准化考试系统课程设计报告
课程报告
课程名称:
c语言程序设计实践
专业班级:
xxxxxxxxx
学生姓名:
XXXX
学号:
XXXXXXXXXXXX
任课教师:
XXXXXX
学期:
XXXXXXXXXXXXXXXXXXXXXX
课程报告任务书
题目
标准化考试系统
主要
内容
开发出一个标准化考试系统,所谓标准化考试系统即仅支持选择题型的考试系统,要求实现以下基本功能:
(1)提供给教师添加试题的功能(试题信息用文件保存)--输入
(2)试题的浏览功能(可以按照不同的知识点或者难度系数进行查看)
(3)能够抽取试题组合成一套试卷(组卷的策略:
可以是随机的,亦可以实现按照一定的组卷策略实现出题:
如每个知识点抽取若干题目,最终组合一套试卷)
(4)教师可以实现题库的管理,比如删除、修改等
(5)查询功能(至少一种查询方式)、排序功能(至少一种排序方式,比如按照难度系数排序)
扩展功能:
可以按照自己的程度进行扩展。
比如
(1)简单的权限处理(教师登录、学生登录)
(2)可以加上学生信息和考试成绩信息的管理,并扩充为广义的考试系统。
即学生输入账号密码登陆,进行考试,交卷后显示成绩;(3)成绩报表打印功能(4)模糊查询(5)综合查询(6)统计、分析等功能总之,可以根据自己需求进行分析功能。
特别说明:
尽可能地运用自己已经学习过的数据结构的知识去展现。
任务
要求
一、提交材料应包括:
(1)系统源代码
(2)课程报告
二、整个设计过程具体要求
(1)需求分析要求学生对案例系统进行分析,设计出需要完成的功能,完善各个模块的调用关系;
(2)设计过程要求学生进一步明确各模块调用关系,进一步完善模块函数细节(函数名、参数、返回值等)
(3)实现过程要求学生养成良好的编码习惯、完成各个模块并进行测试,最终完成系统整体测试;
(4)总结阶段按照要求完成系统设计和实现报告,并进行总结、答辩。
成绩
评定
报告撰写情况(30分)
系统完成情况(30分)
答辩情况(40分)
总分
内容
20分
规范程度
5分
程序测试
5分
基本功能20分
扩展功能10分
自述情况10分
答辩情况
30分
成绩评定教师:
1需求分析
标准化考试系统,以试题为结点建立链表(始终抓住链表的头结点),要实现以下基本功能:
★身份识别:
(学生还是老师--即登陆界面,进行了密码加密处理)
★创建题库:
(文件形式保存--输入试题信息)
★创建学生信息:
(文件保存--保存学生成绩)
★创建学生账号:
(文件保存--保存学生学号密码)
★创建教师账号:
(文件保存--保存教师密码)
★查询试题:
题目查询
难度系数查询分值查询
题号查询
★修改试题:
修改题目
修改难度系数修改选项
修改题号
修改答案
修改全部
★添加试题(对链表进行操作,任意位置插入试题)
★删除试题(对链表进行操作,任意位置删除试题)
★生成出卷:
随机出卷
难度系数出卷按照分值出卷
★学生作答:
(可以提前交卷)
★成绩查询:
(提交试卷后,屏幕上显示,文件中保存)
★学生信息管理:
删除学生信息
添加学生信息修改学生信息
2概要设计
2.1数据结构
2.1.1链表结点定义:
typedefstructnode{//试题类型结点定义
intLDXS;//难度系数
intnum;//题号
intscore;//试题分数
intbz;//标记
chartimu[100];//题目
charA[100];
charB[100];
charC[100];
charD[100];//试题选项
charAS[10];//试题答案
structnode*next;
}Lnode;
2.1.2学生密码结点定义:
typedefstructxx{//学生密码管理
charXH[20];//学号
charMM[20];//学生密码
structxx*next;
}Xx;
2.1.3教师密码结点定义
typedefstructTt{//教师密码管理
charJH[20];//教师号
charMA[20];//教师密码
structTt*next;
}Tt;
2.1.4学生信息结点定义:
typedefstructstu{//学生信息结点定义
charxm[20];//姓名
intxh;//学号
intcj;//成绩
structstu*next;
}Stu;
2.1.5结构体数组定义
structnodetestquestion[100];
作用:
用来存储选取的试题,来实现答题的一些功能.
例如:
看上一题、下一题、交卷等.
程序中各函数简单说明见附件一。
2.2程序总体框架
如图1所示:
图1程序总体框架
3详细设计
3.1主函数
3.1.1学生模块:
学生登陆密码加密处理
do{
j=0;
printf("请输入学号:
");
scanf("%s",xuehao);
getchar();
head1=load3();
if(head1==NULL){
printf("没有学生信息!
\n");
getchar();
condition=0;
break;}
else{
for(pp=head1;pp!
=NULL;pp=pp->next){
if(strcmp(pp->XH,xuehao)==0)
jihao=1;
break;}
if(jihao==0){
printf("没有该学生学号!
\n");
condition=0;
break;}
else{
do{
printf("请输入你的密码:
");
while((ch=getch())!
=13){
putchar('*');
b[j]=ch;
j++;}
b[j]='\0';
for(pp=head1;pp!
=NULL;pp=pp->next){
if(strcmp(b,pp->MM)==0){
flag=1;
printf("\n密码正确!
\n");
gotoQ;}
if(flag==1)break;
elseprintf("\n密码错误!
\n\n");break;}
count++;
if(count!
=3&&flag!
=1)
printf("注意:
你还有%d次机会输入密码!
\n\n",3-count);
else{
printf("退出系统!
\n\n\n");condition=0;
break;}
j=0;
}while(count<3);
}
}
}while(count<3);
学生功能菜单及实现
if(condition==1)system("PAUSE");
while(flag==1)
{
system("cls");
printf("\t\t*********************\n");
printf("\t\t[1]查看试题:
\n");
printf("\t\t[2]答题:
\n");
printf("\t\t按任意键退出:
\n");
printf("\t\t*********************\n");
printf("请输入您的选择:
");
choice=-1;//用来实现任意键退出的
scanf("%d",&choice);
getchar();
system("cls");
switch(choice){
case1:
head=load1();
if(head==NULL){
printf("题库为空,请先创建题库!
\n");
getchar();
break;
}
else{
chaxun_shiti(head);
getchar();
}
break;
case2:
creat_shijuan(head);
break;
default:
exit(0);
}
}
break;
3.1.2教师模块:
教师登陆密码加密处理
do{
j=0;
printf("你是教师!
请您输入教师号:
");
scanf("%s",xuehao);
getchar();
head2=load4();
if(head2==NULL){
printf("没有该教师信息!
\n");
getchar();
condition=0;
break;}
else{
for(pa=head2;pa!
=NULL;pa=pa->next){
if(strcmp(pa->JH,xuehao)==0){
jihao=1;
break;}
}
if(jihao==0){
printf("没有该教师号!
\n");
condition=0;
break;}
else{
do{
printf("请输入你的密码:
");
while((ch=getch())!
=13){
putchar('*');
b[j]=ch;
j++;}
b[j]='\0';
for(pa=head2;pa!
=NULL;pa=pa->next){
if(strcmp(b,pa->MA)==0){
flag=1;
printf("\n密码正确!
\n");
gotoR;}
}
if(flag==0)printf("\n密码错误!
\n\n");
count++;
if(count!
=3&&flag!
=1)
printf("注意:
你还有%d次机会输入密码!
\n\n",3-count);
else{
printf("退出系统!
\n\n\n");condition=0;
break;}
j=0;
}while(count<3);
}
}
}while(count<3);
教师功能菜单及实现
while(flag==1)
{
system("cls");
printf("\t\t*************************\n");
printf("\t\t您是老师可以进行以下操作:
\n");
printf("\t\t[0]学生成绩排序:
\n");
printf("\t\t[1]添加试题:
\n");
printf("\t\t[2]查询试题:
\n");
printf("\t\t[3]创建题库:
\n");
printf("\t\t[4]修改试题:
\n");
printf("\t\t[5]删除试题:
\n");
printf("\t\t[6]添加学生信息:
\n");
printf("\t\t[7]创建学生信息:
\n");
printf("\t\t[8]查询学生信息:
\n");
printf("\t\t[9]修改学生信息:
\n");
printf("\t\t[10]删除学生信息:
\n");
printf("\t\t按任意键退出:
\n");
printf("\t\t************************\n");
printf("请输入您的选择:
");
choice=-1;
scanf("%d",&choice);
getchar();
system("cls");
switch(choice){
case0:
tou=load2();
if(tou==NULL){
printf("成绩为空,请先创建学生成绩!
\n");
getchar();
break;
}
else{
paixu_cj(tou);//成绩排序
getchar();
break;
}
case1:
head=load1();
if(head==NULL){
printf("题库为空,请先创建题库!
\n");
getchar();
break;}
else{
head=addshiti(head);//添加试题
printf("添加成功!
\n");
printf("是否将新信息保存到文件?
(y/n)\n");
scanf("%c",&a);
getchar();
switch(a){
case'n':
break;
case'y':
baocun1(head);//保存试题
printf("保存成功!
\n");
getchar();
break;}
break;}
case2:
head=load1();
if(head==NULL){
printf("题库为空,请先创建题库!
\n");
getchar();
break;}
else{
chaxun_shiti(head);
getchar();
break;}
case3:
head=creat_tk();//创建题库
printf("是否保存该题?
(y/n)\n");
getchar();
scanf("%c",&a);
getchar();
switch(a){
case'n':
break;
case'y':
baocun1(head);
printf("保存成功!
\n");
getchar();
break;}
break;
case4:
head=load1();
if(head==NULL){
printf("题库为空,没有题可以修改!
\n");
getchar();
break;}
else{
xiugai_shiti(head);//修改试题
getchar();
break;
}
case5:
head=load1();
if(head==NULL){
printf("题库为空,没有题可以删除!
\n");
getchar();
break;
}
else{
delet_shiti(head);//删除试题
getchar();
break;
}
case6:
tou=load2();
if(tou==NULL){
printf("学生信息为空,请先创建学生信息!
\n");
getchar();
break;
}
else{
tou=addxs(tou);//添加学生信息
printf("添加成功!
\n");
printf("是否将新信息保存到文件?
(y/n)\n");
scanf("%c",&a);
getchar();
switch(a){
case'n':
break;
case'y':
baocun2(tou);
printf("保存成功!
\n");
getchar();
break;
}
break;
}
case7:
tou=creat_XS();//创建学生信息
printf("是否保存?
(y/n)\n");
getchar();
scanf("%c",&q);
getchar();
switch(q){
case'n':
break;
case'y':
baocun2(tou);
printf("保存成功!
\n");
getchar();
break;
}
break;
case8:
tou=load2();
if(tou==NULL){
printf("学生信息为空,请先创建学生信息!
\n");
getchar();
break;
}
else{
chaxun_XS(tou);//查询学生信息
getchar();
}
break;
case9:
tou=load2();
if(tou==NULL){
printf("学生信息为空,没有可以修改的学生信息!
\n");
getchar();
break;
}
else{
xiugai_XS(tou);//修改学生信息
getchar();
break;
}
case10:
tou=load2();
if(tou==NULL){
printf("学生信息为空,不可以删除!
\n");
getchar();
break;
}
else{
shanchu_XS(tou);//删除试题
getchar();
break;
}
default:
exit(0);
}
}
default:
printf("输入有误!
请重新输入身份!
");break;
}
}while(condition==1);
3.2创建题库链表
Lnode*creat_tk(){
intLDXS,num,score,m;
intbz=0;
chartimu[100];
charA[100],B[100],C[100],D[100],AS[10];
Lnode*p,*tail,*head;
head=tail=NULL;
printf("输入题号:
");
scanf("%d",&num);
printf("请输入试题的难度系数:
");
scanf("%d",&LDXS);
getchar();
printf("输入标志0:
");
scanf("%d",&bz);
getchar();
printf("请输入题目:
");
scanf("%s",timu);
getchar();
printf("请输分值:
");
scanf("%d",&score);
getchar();
printf("请输入A选项:
");
scanf("%s",A);
getchar();
printf("请输入B选项:
");
scanf("%s",B);
getchar();
printf("请输入C选项:
");
scanf("%s",C);
getchar();
printf("请输入D选项:
");
scanf("%s",D);
getchar();
printf("请输入答案:
");
scanf("%s",AS);
getchar();
while
(1)
{
p=(Lnode*)malloc(sizeof(Lnode));
p->num=num;
p->LDXS=LDXS;
p->bz=bz;
strcpy(p->timu,timu);
p->score=score;
strcpy(p->A,A);
strcpy(p->B,B);
strcpy(p->C,C);
strcpy(p->D,D);
strcpy(p->AS,AS);
p->next=NULL;
if(head==NULL)
head=p;
else
tail->next=p;
tail=p;
do{
printf("输入题号:
");
scanf("%d",&num);
m=yanzheng1(head,num