单项选择题标准化考试系统设计
这个程序是我大一上学期的期末课程设计,在网上查了许多的资料,用了5天左右的时间和同学一起完成的。因为我们才刚入门c语言,所以程序可能有点拙劣,但还是希望能帮助各位同学。
//所用的IDE是VC++6.0
//所录入的题目是思政课的选择题
功能要求
(1)用文件保存试题库。(每个试题包括题干、4个备选答案、标准答案)
(2)试题录入:可随时增加试题到试题库中
(3)试题抽取:每次从试题库中可以随机抽出N道题(N由键盘输入)
(4)答题:用户可实现输入自己的答案
(5)自动判卷:系统可根据用户答案与标准答案的对比实现判卷并给出成绩。
代码设计
1.结构组与函数
typedef struct
{
char question[200],A[100],B[100],C[100],D[100];
char key;
}Question;//结构组,结构类型Question
void Menu();//主菜单
void Remenu();//返回菜单或退出
void Answer();//抽取答题
void Add();//试题录入
void Deleteq();//试题删除
void Readfile();//读取所有题目
void Putques1();//输出问题1(不输出答案)
void Putques2();//输出问题2(输出答案)
int Total();//计算总题目数量
抽取题目首先需要读取题目。我们的设计思路是建立一个结构数组用来存储题目信息,其中包括题目,ABCD四个选项以及答案,结构如下:
typedef struct
{
char question[200],A[100],B[100],C[100],D[100];
char key;
}Question;//结构组,结构类型Question
起初我们准备直接建立一个固定的结构数组Question qs[100]用来在内存中存储题目,但发现这样有许多弊病。
①容易造成内存空间的浪费
②读取时容易造成越界(“烫烫烫烫烫烫……”)
③存在题目上限,不方便后续添加题目
于是我们决定利用malloc()进行动态分配内存,生成动态结构数组。但是进行动态分配内存需要实现知道题目数量。于是我们做了int Total()函数来预读一遍题目数量,然后将题目总数返回给total,利用total来生成动态结构数组。这样就解决了上面三个问题,但是伴随而来的问题是题目读取时间变长了。
2.菜单的实现与返回
//主菜单函数:主要用于用户使用时功能的选择,包括了Answer(),Add(),Deleteq(),exit(0)函数
void Menu()
{
int n;//记录序列号
system("cls");//清屏
printf("************************************************************************************************************************\n");
printf("* 单项选择题标准化考试系统 V2.4 *\n");
printf("* *\n");
printf("* ①抽取答题 *\n");
printf("* *\n");
printf("* ②试题录入 *\n");
printf("* *\n");
printf("* ③试题删除 *\n");
printf("* *\n");
printf("* ④ 退出 *\n");
printf("************************************************************************************************************************\n");//美化菜单
do
{
printf(" ┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉\n");
printf(" 请输入正确的序列号:\n");
printf(" ┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉\n");
scanf("%d",&n);
printf("\n");
}while(n<1||n>4);//若输入序列号不正确,返回循环体,重新输入,否则跳出循环
switch(n)//通过switch-case对序列号对应的要求实现
{
case 1:
Answer();//抽取答题
break;
case 2:
Add();//试题录入
break;
case 3:
Deleteq();//试题删除
break;
case 4:
exit(0);//退出
break;
default:
printf("错误\n");//default语句在此其实并无实际用处
}
}
主菜单界面签约整洁并且输入序号外的数字无效