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

题目描述

【难度系数】5 级

【任务描述】 设计一个单项选择题的考试系统,可实现试题维护、自动组卷等功能。 【功能描述】

⑴ 管理员功能:

 试题管理:每个试题包括题干、四个备选答案标准答案等信息。可进行试题添加、删除、修改、 查询、保存、浏览等操作。

 组卷功能:指定试卷编号、试卷标题(如“程序设计基础 A 卷”)、题目数、试卷总分、考试时 间段(如“2017042515:00-2017042516:00”)等信息,自动生成试卷,可将试卷输出到文件, 将答案输出到另一个文件。

 用户管理:对用户信息进行添加、删除、修改、查询、保存、浏览等操作。

 用户答题情况管理:指定用户,统计其做试卷的总次数,以及每次所得的总分。

⑵ 用户功能:

 练习功能:用户指定题目数,根据题目数进行随机选题及答题。对用户的答案与标准答案进行 对比,并最终给出成绩。对错误题目,要能给出正确答案。

 考试功能:用户选择试卷编号,如当前时间在该试卷设置的“考试时间段”内,用户可开始答 题。系统可根据用户提交的答案与标准答案的对比实现判卷,给出成绩,并将用户所答试卷、 用户的答案、用户所得总分,输出到磁盘文件保存。

⑶ 设计提示: 管理员和用户分别通过密码登录,进行题目维护、答题等操作。用户产生的答题文件,可以“用户 名+系统时间.txt”的形式存储,以便进行管理。

功能模块

程序设计——单项选择题标准化考试系统_第1张图片

根据各模块的功能,确定各模块及接口设计如下:

void add_student();  //增加学生

void remove_student();//删除学生

void modify_student();//修改学生

void query_student();//查询学生

void save_students();//保存学生到文件

void read_students();//从文件读取学生信息

void print();//展示学生信息

char convert(char c);// 统一小写字母为大写字母

void clear_input_buffer();//清空缓冲区

Pro* getRandomProblem(Pro* proHead, int countProblems);//抽取随机问题

void clearState(Pro* proHead); // 清空题目状态

int readProblems(Pro* proHead);// 读取题目

void saveProblems(Pro* proHead, int countProblems);//保存题目

void outputProblems(Pro* proHead, int countProblems);//输出所有题目

void deleteProblem(Pro* proHead, int toBeDeleted);  //删除指定题目

int editProblem(Pro* proHead, int countProblems, int problemToBeEdited);//编辑题目

int addProblem(Pro* proHead, int countProblems);//新增题目

int manageProblems(Pro* proHead, int countProblems);//管理题库

int readStudents(Stu* stuHead); // 读入学生成绩

void saveStudents(Stu* stuHead, int countStudents);  //保存学生成绩

void outputStudents(Stu* stuHead, int countStudents);  //输出所有学生成绩

void studentmange();//学生管理界面

void createPaper(Pro* proHead,int countProblems);//创建试卷

int startTeacher(Stu* stuHead, Pro* proHead, int countStudents, int countProblems);//教师系统开始界面

void addQuestion(Pro* proHead,int countProblems,FILE* file,FILE* fl);//增添试卷题目

int readexam(int paper_id);//读取试卷

void saveAnswerToFile(AnswerInfo answer_info,char* name);//保存学生答题情况

void takeExam(Stu* stuHead,Pro* proHead,char* name,int countStudents,char* idx);//开始考试

void startStudent(Stu* stuHead, Pro* proHead, int countStudents, int countProblems);//学生启动界面

void practice(Stu* stuHead, Pro* proHead, int countStudents, int countProblems);//练习系统

void auto_creatpaper(Pro* proHead,int countProblems,FILE* file,FILE* fl);//自动组卷

Pro* getformalProblem(Pro* proHead, int countProblems,int b);//抽取指定问题

void printpaper()//打印试卷

void createpaperready(Pro* proHead,int countProblems);//创建试卷准备

说明

*教师账号密码初始为:
    账号:admin
    密码:admin
*每一套卷子的名称不一样。
exam_answer1.txt -考试答案
exam_paper1.txt -考卷
stu.txt -学生成绩管理
students.txt -学生基本信息文件
test.txt -题库

代码

/*单项选择考试系统*/
/*
【功能描述】
⑴ 管理员功能:
? 试题管理:每个试题包括题干、四个备选答案标准答案等信息。可进行试题添加、
删除、修改、查询、保存、浏览等操作。
? 组卷功能:指定试卷编号、试卷标题(如“程序设计基础 A 卷”)、题目数、试卷
总分、考试时间段(如“2017042515:00-2017042516:00”)等信息,自动生成试卷,
可将试卷输出到文件,将答案输出到另一个文件。
? 用户管理:对用户信息进行添加、删除、修改、查询、保存、浏览等操作。
? 用户答题情况管理:指定用户,统计其做试卷的总次数,以及每次所得的总分。
⑵ 用户功能:
? 练习功能:用户指定题目数,根据题目数进行随机选题及答题。对用户的答案与标
准答案进行对比,并最终给出成绩。对错误题目,要能给出正确答案。
? 考试功能:用户选择试卷编号,如当前时间在该试卷设置的“考试时间段”内,用
户可开始答题。系统可根据用户提交的答案与标准答案的对比实现判卷,给出成绩,
并将用户所答试卷、用户的答案、用户所得总分,输出到磁盘文件保存。
 */

/*设计思路:
1.使用链表存储学生信息和题目信息,并提供相应的链表操作函数。
2.从文件中读取学生信息和题目信息,并在需要保存时将其写回文件。
3.教师端功能通过命令行交互实现。本代码已自动初始化账号与密码,教师登录后,进入教师管理系统,之后有5大功能:
 *显示所有题目:本程序主要通过读取test.txt进行读取,管理题库分为新增题目与修改,题库也是通过链表来实现增删改查的。
 *题目功能:同时也可以在根目录下对test.txt进行文件修改(但必须按照相应的格式进行)。
 * 学生成绩查看:主要是读取根目录下的students.txt进行读取,学生管理
 * 学生信息管理:该功能涵盖学生信息的增删改查的功能,通过单链表的方式对其进行相应的操作。
 * 组卷功能,本程序通过创建exam_paper.txt和exam_paper_answer.txt来存放试卷的试题、编号、总分、时间段、试卷标题、答案以及添加试卷题目。
4.学生端功能通过命令行交互实现。学生登录后,进入学生系统,根据指示选择不同的功能。具体功能如下:
 *考试:学生通过考试的编号查找到教师端出的试卷,本程序通过读取exam_paper.txt中的时间信息,来判断是否到该时间点,时间到达会自动收卷。考试过程中,
每做完一道题就会与参考答案进行比对,直至考试结束。考试结束后会显示该学生成绩以及总分,并将成绩信息输出到stu.txt中,方便教师端读取。并且考试中通
过printf将学生的姓名、学号信息公示在控制板中,答题结束后会将所有的答题信息利用“姓名-时间”的模板保存至文件中,里面的内容为:学生考的试卷编号、学生
的成绩和学生的答题情况。正确答案会通过读取exam_paper_answer.txt,输出到控制面板中给学生查看,本代码使用sleep函数对考试结束后的输出信息实现
动画处理。
 *练习:本程序采取随机数生成来进行随机练习,随机数的产生与题目的个数有关,学生可选择需要练的多少道题目来进行练习,本系统将自动从题库(test.txt)文件
中读取所有题目。最后每出一道题通过比对正确答案,如果考生回答正确则输出正确,错误则提示错误并输出正确答案。
具体实现思路:
 1.定义了一系列结构体来表示学生信息、试题信息、试卷信息等。
 2.学生管理系统:包括增加学生、删除学生、修改学生、查询学生以及保存和读取学生信息的功能。
 3.题目管理函数:包括抽取随机题目、清空题目状态、读取题目、保存题目、输出所有题目、删除指定题目、编辑题目、新增题目以及管理题库的功能。
 4.学生成绩系统:包括读取学生成绩、保存学生成绩、输出所有学生成绩的功能。
 5.教师系统:通过教师操作学生和题目等功能来开始教师系统。
 6.组卷系统:包括创建试卷、增添试卷题目、读取试卷的功能。
 7.学生考试系统:包括学生开始考试、保存学生答题情况的功能。
 8.学生练习系统:包括学生进行练习的功能。
 9.学生启动界面:根据学生的选择进入考试系统或练习系统
 */
/*遇到严重和问题:根据您提供的 getRandomProblem 和 clearState 函数的实现细节,我发现了问题所在。
首先,在 getRandomProblem 函数中,您使用了 srand((unsigned)time(0)); 来设置随机数种子。然而,由于您的代码中可能会多次调用
 getRandomProblem 函数,而且这些调用之间时间间隔很短,所以在这样的情况下,srand 可能会被多次设置为相同的种子值,导致产生相同的随机数序列,
 从而导致多次调用 getRandomProblem 函数时返回相同的题目。
为了解决这个问题,您可以将 srand((unsigned)time(0)); 移到程序的初始化部分,在整个程序运行过程中只调用一次,而不是在 getRandomProblem
 函数内部每次调用。
其次,在 clearState 函数中,您清空了所有题目的状态,但在 getRandomProblem 函数中并未对状态进行重新标记。这可能会导致重复选择同一题目的问题。
 */
#include 
#include 
#include 
#include 
#include 
//界面设计
#define cls system("cls")
#define endl printf("\n")
#define title(x) printf("================%s================\n", x)
//定义最大的题目长度以及最大的试卷题目数
#define MAX_QUESTIONS 10000
#define MAX_PAPERS 1000

// 学生成绩链表存储
typedef struct students {
    char name[20], idx[20];
    float grade;
    int numQue;
    int count;
    char papername[100];
    students *next;
} Stu;

// 问题链表存储
typedef struct problem{
    int idx;
    int state;//标记是否被访问过
    char q[500], op[4][500], ans;//选项、答案
    problem *next;
} Pro;

// 题目结构体
typedef struct question {
    char content[500];
    char op[4][500],ans;
    char correct_answer;
} Question;

//学生基本信息以及登录
struct student {
    char id[11];
    char name[21];
    char password[20];
    struct student* next;
};
// 试卷结构体
typedef struct paper {
    int paper_id;
    char title[100];
    char time_period[50];
    int num_questions;
    int totalscore;
} Paper;

// 答题信息结构体
typedef struct answer_info {
    char name[20];
    char id[20];
    char papername[200];
    int paper_id;
    char user_answers[MAX_QUESTIONS];
    float score;
} AnswerInfo;

struct student* head = NULL;//初始化头指针

// 全局变量
//试卷总数
Paper papers[MAX_PAPERS];
int total_papers = 0;
//问题总数
Question questions[MAX_QUESTIONS];
int total_questions = 0;

int ii=1;//计算次数
int zt;//状态

你可能感兴趣的:(c语言)