单项选择题标准化考试系统设计

本文介绍了一款使用C语言编写的单项选择题标准化考试系统,该系统可保存试题库、录入试题、随机抽题、答题、自动判卷。功能包括动态分配内存的结构数组、简洁的菜单系统、试题录入与保存、答题与判卷整合以及试题删除。源代码和相关资源可在作者主页下载。
摘要由CSDN通过智能技术生成

单项选择题标准化考试系统设计

这个程序是我大一上学期的期末课程设计,在网上查了许多的资料,用了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语句在此其实并无实际用处
	}
}

在这里插入图片描述
主菜单界面签约整洁并且输入序号外的数字无效

好的,根据您的要求,以下是一个用C语言设计的对单项选择题的自动阅卷系统。 1. 数据结构设计 考虑到试题库的每个试题包括题目、备选答案和标准答案,可以使用结构体来表示一个试题。具体如下: ``` typedef struct { char question[100]; // 题目 char choices[4][50]; // 备选答案 char answer; // 标准答案 } Question; ``` 2. 功能实现 (1) 试题库管理:试题库可以使用文本文件来保存,每行表示一个试题,试题之间使用特定符号(如“|”)进行分隔。可以使用fgets()函数从文件中读取试题,并使用sscanf()函数将试题的各个部分提取出来存储到Question结构体中。 (2) 试题录入:可以使用文件I/O函数将新的试题追加到试题库文件中。 (3) 试题抽取:可以使用rand()函数生成随机数,从试题库中抽取指定数量的试题。抽取的过程可以使用数组来保存已经抽取的试题的下标,避免重复抽取。 (4) 答题:可以使用scanf()函数从键盘获取用户的答案,并将答案存储到数组中。 (5) 自动判卷:可以使用循环遍历用户答案数组和试题库中相应试题的标准答案,比较用户答案和标准答案是否相同,并计算得分。 3. 完整代码 以下是一个简单的示例代码,仅供参考: ``` #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> typedef struct { char question[100]; // 题目 char choices[4][50]; // 备选答案 char answer; // 标准答案 } Question; int main() { FILE *fp; char filename[50] = "questions.txt"; // 试题库文件名 Question q[100]; // 最多存储100道试题 int num_questions = 0; // 试题库中试题数量 int selected[100]; // 已经抽取的试题下标 int num_selected = 0; // 已经抽取的试题数量 int num_to_select; // 需要抽取的试题数量 char user_answer[100]; // 用户的答案 int score = 0; // 得分 int i, j, k, r; // 打开试题库文件 fp = fopen(filename, "r"); if (fp == NULL) { printf("Failed to open file %s\n", filename); return 1; } // 从文件中读取试题 while (fscanf(fp, "%[^|]|%[^|]|%[^|]|%[^|]|%c\n", q[num_questions].question, q[num_questions].choices[0], q[num_questions].choices[1], q[num_questions].choices[2], &q[num_questions].answer) == 5) { num_questions++; } // 关闭文件 fclose(fp); // 随机抽取指定数量的试题 srand(time(NULL)); // 初始化随机数生成器 printf("Enter the number of questions to select: "); scanf("%d", &num_to_select); if (num_to_select > num_questions) { num_to_select = num_questions; } for (i = 0; i < num_to_select; i++) { // 生成一个随机数 r = rand() % num_questions; // 判断是否已经抽取过这个试题 for (j = 0; j < num_selected; j++) { if (selected[j] == r) { break; } } if (j == num_selected) { // 没有抽取过这个试题,保存下标并显示试题 selected[num_selected++] = r; printf("\nQuestion %d: %s\n", i + 1, q[r].question); for (k = 0; k < 4; k++) { printf("%c) %s\n", 'A' + k, q[r].choices[k]); } // 获取用户答案 printf("Your answer: "); scanf(" %c", &user_answer[i]); // 检查答案是否正确 if (user_answer[i] == q[r].answer) { score++; } } else { // 已经抽取过这个试题,重新生成随机数 i--; } } // 显示得分 printf("\nYour score: %d/%d\n", score, num_to_select); return 0; } ```
评论 32
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值