单项选择题标准化考试系统
学校将大一上学期期末的c语言课程设计放进下学期开学,我选取的c课程设计题目是《单项选择题标准化考试系统》,参考了csdn一些大佬的文章,终于做出来了!!!
接下来,我将与大家一起浏览该系统,系统还有很多不足之处,欢迎提建议,希望能与更多人交流!
目录
- 运行环境
- 结构体定义
- 菜单函数
- 初始添加函数
- 添加函数
- 删除函数
- 其他函数
运行环境
由于课程设计要求,我运用了:
-
visual c++ 6.0
-
自己生成的D盘的一个二进制文件
结构体的定义
typedef struct problem
{
int n;//题号
char t[50];//题目和答案搁这儿
char a;//正确答案
}problem;
题目只能录入49个字符,要是有题目要求的童鞋记得修改数组啊!
千万别越界,尽量别浪费空间!
千万别越界,尽量别浪费空间!
千万别越界,尽量别浪费空间!
菜单函数
//菜单函数,联系各功能
void menu()
{
int choose;
//外观
printf ("--------------单项选择题测评系统V2.0--------------\n");
printf (" 欢迎使用本系统,祝你做题愉快 \n");
//功能的选择
printf ("请选择本系统的功能:\n");
printf (" 1.使用说明\n");
printf (" 2.答题\n");
printf (" 3.题目的初始增加\n");
printf (" 4.题目的增加\n");
printf (" 5.题目的删除\n");
printf ("请输入你想用的功能:"); //选择
scanf ("%d",&choose);
switch (choose)
{
case 1: specification(); break;
case 2: work(); break;
case 3: add1(); break;
case 4: add2(); break;
case 5: cut(); break;
default : break;
};
}
菜单函数主要由switch、case 、printf 组成,目的是为了调用其他函数实现功能。
运行界面:
说明书
int specification()
{
printf (" 说明书\n");
printf (" 欢迎使用说明书功能:\n");
printf (" 1.本系统由本人参考资料、与同学交流开发而成,不作商业用途\n");
printf (" 2.菜单页面有5个功能,按照相关指示可使用\n");
printf (" 3.未了模拟现实情况,题目的初始添加、添加、删除功能均为老师(出题者)使用,所以设置密码(123456)\n");
printf (" 欢迎使用单项选择题测评系统V2.0,祝你做题愉快!\n");
remenu();
}
考虑到完整性和用户体验特地加入,多个格式化输出,增强用户体验
初始化添加
//初始添加
int add1()
{
problem *p,q;
FILE *fp;
char s;
int i,j,total;
if(!(mima()))
printf ("------------欢迎使用题目初始增加功能---------\n");
printf ("请输入增添的题目数量:\n");
scanf ("%d",&total);
p=(problem *)malloc(total* sizeof (problem));
if(p!=NULL)
printf ("加载中,别急!\n");
else
printf ("系统连接错误。\n");
printf ("接下来,请按照例子增添题目:\n");
printf ("例子:\n");
printf ("题号:1\n");
printf ("题目:1+1=(),A.1 B.2 C.3 D.4\n");
printf ("正确答案:B\n");
for (i=0;i<total;i++)
{
printf ("题号:");
scanf ("%d",&p[i].n);
scanf ("%c",&s);
printf ("正确答案:");
scanf ("%c",&p[i].a);
scanf ("%c",&s);
printf ("题目:");
gets (p[i].t);//用gets可以输入空格,已算是美观题目
}
fp=fopen("D:\\题库1","wb+");
fwrite(p,sizeof(problem),total,fp);
fclose (fp);
free (p);
fp=fopen("D:\\题库1","rb");
printf ("以下是你加入的题目:\n");
for (j=0;j<total;j++)
{
i=fseek (fp,j*sizeof (problem),0);//看重头开始的第j题
if((i==0)&&(fread(&q,sizeof(problem),1,fp)==1))
{
printf ("题号 正确答案 题目:\n");
printf ("%d %c %s \n",q.n,q.a,q.t);
}
}
fclose(fp);
remenu();
}
运行界面:
其实主要的将数据放进指针数组,再将指针数组写进文件
添加
//增加
int add2()
{
int n,total;
int t1,t2;
int i;
char s;
FILE *fp;
problem *p,q;
if(!(mima()))
printf ("------------欢迎使用题目增加功能---------\n");
total=Total();
printf ("当前题目总数为%d\n",total);
printf ("请输入想加入题目数量:");
scanf ("%d",&n);
p=(problem *)malloc(n* sizeof (problem));//开辟空间
fp=fopen ("D:\\题库1","ab+");
for (i=0;i<n;i++)
{
printf ("题号:");
scanf ("%d",&p[i].n);
scanf ("%c",&s);
printf ("正确答案:");
scanf ("%c",&p[i].a);
scanf ("%c",&s);
printf ("题目:");
gets (p[i].t);
}
t1=fseek(fp,0*sizeof (problem),2);//将指针定位到末尾
t2=fread(&q,sizeof(problem),1,fp);
fwrite(p, n*sizeof (problem), 1, fp);
fclose (fp);
total=Total();
printf ("当前题目总数为%d\n",total);
remenu();
}
运行界面:
以”ab+“形式打开二进制文件,打开文件指针定位末尾,再如添加般写入文件
删除函数
//删除
int cut()
{
FILE *fp;
problem q,*p;
int total,i,n,j;
total=Total();
printf ("现有题目:%d\n",total);
p=(problem *)malloc(total* sizeof (problem));
fp=fopen ("D:\\题库1","rb");
if(fp==NULL)
{
printf("文件打开失败");
}
fread(&q,sizeof(problem),1,fp);
i=0;
while(!feof(fp))//将文件放进结构体指针数组
{
p[i]=q;
fread(&q,sizeof(problem),1,fp);
i++;
}
fclose(fp);
printf ("删除的题目号码:");
scanf ("%d",&n);
for (i=n-1;i<total;i++)
{
strcpy(p[i].t,p[i+1].t);
p[i].a=p[i+1].a;
}
fopen ("D:\\题库1","wb+");
fwrite(p,sizeof(problem),total-1,fp);
fclose(fp);
fp=fopen("D:\\题库1","rb");
printf ("以下是剩下的题目:\n");
for (j=0;j<total;j++)
{
i=fseek (fp,j*sizeof (problem),0);//看重头开始的第j题
if((i==0)&&(fread(&q,sizeof(problem),1,fp)==1))
{
printf ("题号 正确答案 题目:\n");
printf ("%d %c %s \n",q.n,q.a,q.t);
}
}
fclose(fp);
remenu();
}
运行界面:
删除就是将文件放进结构体,再覆盖删除,再写入。
可以继续优化,例如输出题库让人知道删除哪一题、
再例如删除多个题目,指针放删除的题号。。。。。。
做题函数
//做题
int work()
{
int *a,i,j;
int n,total,score;
int t1,t2;
char answer,b;
problem q;
FILE *fp;
total=Total();
score=0;
printf ("欢迎使用单项选择题系统答题功能\n");
printf ("现在的题目数量有:%d\n",total);
printf ("请输入想完成的题数:");
scanf ("%d",&n);
if (n<total)
{
a=(int*)malloc(n*sizeof(int));//分配空间生成动态数组
for(i=0;i<n;i++)
{
loop1: srand( time (NULL));//srand和rand一起使用,不同种子让rand生成数不同
a[i]=rand()%total+1;//保证随机数在total内(小于total)(total为总题数)
for(j=i-1;j>=0;j--)
{
if(a[i]==a[j])
goto loop1;//让生成数不同
}
}
printf ("以下是你抽出的题号:");
for (i=0;i<n-1;i++)
{
printf ("%d、",a[i]);
}
printf ("%d\n",a[n-1]);
}
else
{
printf ("题数不足,退出。\n");
remenu();
}
fp=fopen("D:\\题库1","rb");
for (i=0;i<n;i++)
{
t1=fseek(fp,(a[i]-1)*sizeof (problem),1);
t2=fread(&q,sizeof(problem),1,fp);
if ((t1==0)&&(t2==1))
{
printf ("%d.%s\n",q.n,q.t);
printf ("请输入正确答案:");
scanf ("%c",&b);
scanf ("%c",&answer);
if (q.a==answer)
{
score++;
printf ("\n");
printf ("正确答案:%c\n",q.a);
}
}
rewind (fp);
}
printf ("答对题目总数是%d,一共%d分\n",score,5*score);
fclose (fp);
remenu();
}
运行界面:
按照现实生活可加详解啥的,在对答案那一步
其他函数
//其他函数
//返回函数:重新返回菜单
int remenu()
{
int a;
printf ("请输入任意符号返回菜单");
if (scanf("%d",&a)!=EOF)
{
printf ("\n");
system ("cls");
menu();
}
else
{
system ("cls");
printf ("已退出该系统,欢迎下次再来!\n");
}
}
//题目计数函数,极重要
int Total()
{
int t1,t2;
int total;
FILE *fp;
problem q;
fp=fopen("D:\\题库1","rb");
t1=fseek(fp,-1*sizeof (problem),2);//-1是灵魂操作,感谢大佬
t2=fread(&q,sizeof(problem),1,fp);
if ((t1==0)&&(t2==1))
{
total=q.n;
}
fclose (fp);
return total;
}
//用户体验,3次错密码酸爽!!!
int mima ()
{
int i,j;
for (i=0;i<4;i++)//密码,虽有4但只能输入3次
{
//密码错误,结束
while (i==3)
printf ("你不是开发者,系统崩溃\n");
while (i==3) break;
printf ("请输入执行者密码:");
scanf ("%d",&j);
if (j!=key)
printf ("密码错误,你还有%d次机会\n",A-i-1);
else
break;
}
//密码正确,执行操作
return 0;
}
参考文献
参考文献
1.RUMOR. 单项选择题标准化考试系统设计
https://blog.csdn.net/weixin_44499343/article/details/100064443
2. kafmC语言文本文件实现局部修改
https://blog.csdn.net/kafmws/article/details/80717176
结语
欢迎交流多给意见
加油,快点完成课设!
感谢文献作者的帮助!
需要源码和报告书可留言
系甘啦,bye,bye!