设计报告 考试管理系统.docx
《设计报告 考试管理系统.docx》由会员分享,可在线阅读,更多相关《设计报告 考试管理系统.docx(19页珍藏版)》请在冰点文库上搜索。
设计报告考试管理系统
程序设计报告
(2011/2012学年第1学期)
题目:
考试管理系统
专业高分子材料与工程
组长姓名于鑫
组长学号B10060220
成员姓名学号王淑娟B10060203
龙玲B10060204
指导教师朱旻如
指导单位计算机学院软件教学中心
日期2011年9月14日
1、分析及结构设计
1、程序需要完成的功能:
(1)实现考生信息的管理:
考生信息包括考生姓名和学号,用文件存储信息,并可对信息进行增、删、改。
(2)考试过程管理:
a):
设置考试题数:
可以设置默认值,并允许修改
b):
抽取试题:
在考生考试过程中,可以从试题库中随机抽取规定数量的试题并显示,且要保证题目不能重复
(3)模拟考试过程:
首先输入学号,已经参加过考试的给出提示,不允许再考。
考生答题完成后立刻给出成绩,排序后存储到成绩文件中。
同时要记录考生参加考试的时间(年,月,日)。
(4)试题库管理:
以文件形式存储试题,可增加试题到试题库中。
每个试题包括题干、4个备选答案以及标准答案
(5)成绩查询:
输入考生姓名进行成绩的查询,当考生出现同名时,输入学号查询,以及查看考生的成绩排名。
2、可能遇到的问题:
(1)当分模块进行程序的设计时,要考虑各模块间的衔接问题,避免语句的重复及语法错误
(2)数据结构的选择:
存储考生信息及试题时,可以用结构体数组存储从文件中读取考生信息及试题
(3)题库的管理:
保持题目的唯一性和随机性
(4)考生重名时情况的处理办法
2、开发设计
1、程序结构:
程序包括以下模块
main()函数:
主函数,用于控制菜单函数和各个子子函数
menu()函数:
菜单函数,用于控制各个功能模块
test()函数:
考试过程,考生进入考试系统后,根据界面提示依次完成读取试题duqushiti()函数和考生答题kaoshi()函数两个过程
manage()函数:
考生信息的管理,根据界面提示实现对考生信息的增加,删除和修改,其中包括regist()函数、deleter()函数、modify()函数
search2()函数:
查找考生信息及考试成绩通过search()函数实现
2、主要数据结构说明
定义学生结构体数组和试题结构体数组
(a)学生结构体数组
structstudent
{
charname[20];//考生姓名,字符长度不超过20
charnum[30];//考生学号,字符长度不超过30
floatscore;//考生成绩
intflag;//参加考试的标志1已经参加0未参加
}stu[N];
(b)试题结构体数组
structshiti
{
charshiti[100];//题目,字符长度不超过100
charAns[20];//答案,字符长度不超过20
intflag;//题目被选作标记,以免重复,以保证其唯一性和随机性
}T[N];
定义两个结构体数组可以将每一组数据作为一个整体,在函数中以便整体调用它们
3、核心功能的实现
主函数实现整个程序的运行
intmain()
{
intchoice=1;
menu();
printf("chooseoneoperationyouwanttodo:
\n");
scanf("%d",choice);
switch(choice)
{
case1:
test();break;//学生考试
case2:
manage();break;//信息管理
case3:
search2();break;//信息查询
case0:
printf("退出");system("pause");exit
(1);//退出
default:
printf("输入错误!
");
}
return0;
}
通过函数的调用,实现考试过程的管理,模拟考试,考生信息管理(包括信息的查询和信息的修改与删除),试题库管理,成绩查询。
五、源代码
#include
#include
#include
#include
#defineN100
structstudent
{
charname[20];
charnum[30];
floatscore;
intflag;//参加考试的标志1已经参加0未参加
}stu[N];
structshiti
{
charshiti[100];
charAns[20];
intflag;
}T[N];
inti,j,k;
intlen;//学生人数
inttknum=10;//题库题目数
inttinum=10;//考试试题数
floatfen=10;//每题分数
charstr;
voidmenu()
{
printf("*******1.进入考试*******\n");
printf("*******2.信息管理*******\n");
printf("*******3.信息查询*******\n");
printf("*******0.退出系统*******\n");
}
voidmenuTest()
{
printf("*******1.学生注册*******\n");
printf("*******2.读取试题*******\n");
printf("*******3.开始考试*******\n");
printf("*******0.返回菜单*******\n");
}
voidmenuBase()
{
printf("*******1.删除记录*******\n");
printf("*******2.修改记录*******\n");
printf("*******0.返回菜单*******\n");
}
voidmenuScore()
{
printf("*******1.按成绩查询********\n");
printf("*******2.按姓名查询*******\n");
printf("*******0.返回主菜单*******\n");
}
voidduqushiti()//读取
{
charstr1,str2,str3;
FILE*fp;
if(!
(fp=fopen("Question.txt","r")))
{
printf("filecannotbeopended");
exit
(1);
}
i=0;
k=0;
while(!
feof(fp))
{
str=fgetc(fp);//读取一个字符
if(str=='K')//可能是答案来了
{
str1=fgetc(fp);
str2=fgetc(fp);
str3=fgetc(fp);
if(str1=='E'&&str2=='Y'&&str3==':
')
{
j=0;
str=fgetc(fp);
while(str!
='\n'&&!
feof(fp))
{
T[i].Ans[j++]=str;
str=fgetc(fp);
}
T[i].Ans[j]='\0';
T[i].shiti[k++]='\0';
tknum++;//题库题目数加1
i++;
k=0;//准备读入下一个题
}
else//不是答案
{
T[i].shiti[k++]=str;
T[i].shiti[k++]=str1;
T[i].shiti[k++]=str2;
T[i].shiti[k++]=str3;
}
}
else//不是答案
T[i].shiti[k++]=str;
}
}
voidbaocun()
{
FILE*fp;
if(!
(fp=fopen("xinxi.txt","w")))//打开文件
{
printf("filecannotbeopended");
exit
(1);
}
fwrite(&stu,sizeof(structstudent),N,fp);//写入文件
fclose(fp);//关闭文件
}
voidduquxinxi()//读取信息
{
FILE*fp;
if(!
(fp=fopen("xinxi.txt","r")))//打开文件
{
printf("filecannotbeopended");
fopen("E:
\\xinxi.txt","w");//创建文件
getchar();
return;
}
fread(&stu,sizeof(structstudent),N,fp);//读取文件
for(len=i=0;iif(strlen(stu[i].name)!
=0)
len++;//学生人数累加
fclose(fp);//关闭文件
}
voidsearch()//查询信息
{
charname[20],num[30];
intn=0;
system("cls");
printf("请输入姓名查询成绩:
");
scanf("%s",name);
for(i=0;iif(name==stu[i].name)
{
n++;//同名人数累加
j=i;//记住该同学角标
}
if(n==0)
{
printf("没有对应的信息记录");
getchar();
return;
}
if(n==1)
{
if(stu[j].flag==0)
{
printf("您还没有参加考试,无信息");
getchar();
return;
}
}
if(n>1)//有重名
{
printf("有重名,请输入考号查询您的成绩:
");
scanf("%s",num);
for(i=0;iif(name==stu[i].name&&num==stu[i].num)
{
j=i;//记住该同学角标
break;
}
if(stu[j].flag==0)
{
printf("对不起!
你尚未参加考试,没有成绩,回车返回。
");
getchar();
return;
}
printf("*******考生姓名:
%s\n",stu[j].name);
printf("*******考生考号:
%s\n",stu[j].num);
printf("*******成绩:
%.2f\n",stu[j].score);
getchar();
}
}
intcheck(charnum[])//检查学号是否重复
{
for(j=0;j{
if(num==stu[j].num&&j!
=i)
return1;//有重复返回1
}
}
voidregist()
{
system("cls");//清屏
i=len;
printf("pleaseprintyourname:
");
scanf("%s",stu[i].name);
printf("andyourid:
");
scanf("%s",stu[i].num);
while(check(stu[i].num)==1)
{
printf("hasdoubleidpleaseprintyouridagain:
");
scanf("%s",stu[i].num);
}
len++;//学生人数加1
baocun();
getchar();
}
voidkaoshi()//开始考试
{
intcount=0;
charans[10],num[10];
srand((unsigned)time(NULL));//设置随机种子
system("cls");//清屏
for(i=0;i<3;i++)
T[i].flag=0;//初始化所有的题都未被使用
printf("请输入学号:
");
scanf("%s",num);
for(i=0;iif(num==stu[i].num)
break;//存在结束循环
if(i==len)
{
printf("对不起!
您的学号尚未注册,不能考试");
getchar();
return;
}
if(stu[i].flag==1)
{
printf("对不起!
你已经参加过考试,不能再次参加。
");
getchar();
return;
}
for(j=0;count{
if(j==tknum-1)
j=0;//到最后一道题了,回到第一道
if(T[j].flag==0&&rand()%(tknum-count)==0)//题目未被使用,随机决定是否选用该题,几率为1/(tknum-count)。
{
T[j].flag=1;//标记已被使用
count++;//已做题加1
printf("%d、%s\n",count,T[j].shiti);
printf("请输入你的选择(大写):
");
scanf("%s",ans);
if(ans==T[j].Ans)
{
printf("√\n");
stu[i].score+=fen;//得分累加
}
else
printf("×,正确答案:
%s\n",T[j].Ans);
}
}
stu[i].flag=1;//标记已经完成考试
printf("考试结束,你的最后得分是%.2f\n",stu[i].score);
getchar();
baocun();
}
voiddisplay()//显示所有考生信息
{
printf("姓名考号参考标记\n");
for(i=0;iprintf("%-10s%-13s%d\n",stu[i].name,stu[i].num,stu[i].flag);
}
voidmodify()//学生信息修改
{
charnum[10];
system("cls");//清屏
display();//显示所有考生信息
printf("请输入要修改学生的学号:
");
scanf("%s",num);
for(i=0;iif(num==stu[i].num)
break;//存在结束循环
if(i==len)
{
printf("对不起!
没有你要修改的学生的信息");
getchar();
return;
}
printf("请输入新的姓名:
");
scanf("%s",stu[i].name);
printf("请输入新的学号:
");
scanf("%s",stu[i].num);
while(check(stu[i].num)==1)
{
printf("学号重复,请重新输入学号:
");
scanf("%s",stu[i].num);
}
baocun();
display();//显示所有考生信息
printf("修改成功");
getchar();
}
voiddeleter()//学生信息删除
{
structstudentt;
charnum[10];
system("cls");//清屏
display();//显示所有考生信息
printf("请输入要删除学生的学号:
");
scanf("%s",num);
for(i=0;iif(num==stu[i].num)
break;//存在结束循环
if(i==len)
{
printf("对不起!
没有你要删除的学生的信息,回车返回。
");
getchar();
return;
}
stu[i].name[0]='\0';
stu[i].num[0]='\0';//删除
t=stu[i];
stu[i]=stu[len-1];
stu[len-1]=t;//和最后一条信息交换位置
len--;//人数减一
baocun();
printf("删除成功!
");
getchar();
}
voidtest()
{
intchoice=1;
do
{
menuTest();
printf("chooseoneoperationyouwanttodo:
\n");
scanf("%d",&choice);
switch(choice)
{
case1:
regist();
baocun();
break;
case2:
duqushiti();break;
case3:
kaoshi();break;
case0:
break;
}
}while(choice);
}
voidmanage()
{intchoice=1;
do
{
menuBase();
printf("chooseoneoperationyouwanttodo:
\n");
scanf("%d",&choice);
switch(choice)
{
case1:
deleter();
break;
case2:
modify();
break;
case0:
break;
}
}while(choice);
}
voidsearch2()
{intchoice=1;
do
{menuScore();
printf("chooseoneoperationyouwanttodo:
\n");
scanf("%d",&choice);
switch(choice)
{
case1:
search();
break;
case0:
break;
}
}
while(choice);
}
intmain()
{
intchoice=1;
menu();
printf("chooseoneoperationyouwanttodo:
\n");
scanf("%d",&choice);
switch(choice)
{
case1:
test();break;//学生考试
case2:
manage();break;//信息管理
case3:
search();break;//信息查询
case0:
printf("退出");system("pause");exit
(1);//退出
default:
printf("输入错误!
");
}
return0;
}
3、测试分析
A、主界面的显示:
通过选择1-0来确定要做哪个操作
B、若选1,则出现如下界面
若接着按1,学生注册出现的界面如下,按照提示步骤操作:
C.若按3,完成考生信息的查询,如果没有考生考试信息,出现界面如下:
4、总结
1、这这次程序设计过程中,我们学到了很多解决问题的办法。
首先拿到题目时,应该先考虑总体的框架,再考虑如何去解决。
可是我们只学了一个学期的C,要做这么大一个程序是有挑战的。
首先我们想到了再忘上查资料,课下我们有到图书馆找资料,可是悲剧的是没有找到,所以我们试着分模块写程序。
最后,小程序写好了,也过关了,可是要和在一起却是一个很大的问题了,单把一个小程序抽出来和成一个大程序,总是要好多的错。
这就需要我们有耐心的去修改,并在解决问题的过程中学习如何去运用书本上学到的知识
2、心得和体会:
在设计程序时,我们发现了平时很多没有注意到的问题,例如:
返回值函数和不返回值函数两者在主函数的调用中是不同的等等……虽然我们的程序不是很完美,而且里面还存在着很多的错误,但这确实花费了我们小组成员两周的心思,我们不断地查找这方面的资料,不断地更改程序,就算这个凝聚了我们汗水的程序最终以失败告终,我们依然会说,我们努力过了。
在今后的学习当中,我们会更加努力,不让老师失望,也不让我们自己失望。
5、参考文献
实用软件工程.郑人杰等.北京:
清华大学出版社.2003年
C程序设计教程.谭浩强.北京:
清华大学出版社.2007年
C语言大学实用教程.苏小红等.北京:
电子工业出版社,2007年
从问题到程序-程序设计及C语言引论.裘宗燕编著.北京:
机械工业出版社,2005