赞
踩
定制魏:QTWZPW,获取更多源码等
目录
程序设计题4:驾驶员理论课程模拟考试与学习系统
要求编写一个程序,模拟驾驶员科目一的考试,要求具有良好的操作界面。管理员负责试题库的管理(编辑、删除、增加等)工作;随机生成考试试题;考试完后能给出评分;具有交通知识查询和学习功能。
代码要能提供以下几个基本功能。
(1)提供管理员和用户菜单选项,分别进入不同权限界面;
(2)进入管理员界面需要密码验证,管理员界面负责试题库的管理(修改、查询、删除、增加)以及考试成绩的统计等;(3)进入用户界面需要输入用户ID,界面菜单选项具有交通知识的查询、学习和测验等功能;
(4)用文件保存试题库。(每个试题包括题干、4个备选答案、标准答案)(4)
(5)试题录入∶可随时增加试题到试题库中(4)
(6)试题抽取:每次从试题库中可以随机抽出N道题(N由键盘输入)(4)
(7)答题:用户可实现输入自己的答案(4)
(8)自动判卷:系统可根据用户答案与标准答案的对比实现判卷并给出成绩。
(1)自拟具有创新性的功能
(1)界面美观,交互方便。
(2)注释详细:每个变量都要求有注释说明用途;函数有注释说明功能,对参数、返回值也要以注释的形式说明用途;关键的语句段要求有注释解释。
(3)程序的层次清晰,可读性强;注意试题的数据结构。(4)变量、函数命名符合规范。
(5)如有可能,可使用MFC等开发工具,实现彩色或图形操作界面。3开发环境
开发工具可以选择TC2.0、TC3.0、VC++6.0或者DevC++等C++开发工具,或者与老师讨论选择自己熟悉的开发工具与平台,鼓励采用MFC等开发工具,实现彩色或图形操作界面。
- /********************************************
- * [驾驶员理论课程模拟考试与学习系统][数组].C.A.0.S2
- ********************************************/
- #define _CRT_SECURE_NO_WARNINGS
-
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <time.h>
- #include <conio.h>
- #include <ctype.h>
-
- /*学员信息结构体*/
- typedef struct _tAA
- {
- char ID[512]; /*学号*/
- char NAME[512]; /*姓名*/
- char PWD[512]; /*密码*/
- int STAT; /*状态*/
- double SCORE; /*成绩*/
- } AA, * PAA;
-
- /*学员信息数组*/
- typedef struct _BB
- {
- int COUNT; /*考试题量*/
- int LEN; /*数组长度*/
- int CAPA; /*数组容量*/
- PAA DATA; /*数组元素*/
- } BB, * PBB;
-
- /*选项结构体*/
- typedef struct _CC
- {
- char NAME[512]; /*选项名称*/
- int CORR; /*是否是正确选项*/
- } CC, * PCC;
-
- /*考题结构体*/
- typedef struct _DD
- {
- char ID[512]; /*编号*/
- char DESC[512]; /*描述*/
- CC OPTION[20]; /*选项*/
- int LEN; /*选项数量*/
- struct _DD* LINK; /*下一个节点*/
- } DD, * PDD;
-
- /*状态类型*/
- const char* STATE_LIST[] = {
- "未考试",
- "已考试",
- };
-
- /*状态数量*/
- int STATE_LEN = sizeof(STATE_LIST) / sizeof(STATE_LIST[0]);
-
- /*将时间转换成文本*/
- void CALL1(time_t tt, char* buf) {
- struct tm* t;
- t = localtime(&tt);
- sprintf(buf, "[%04d-%02d-%02d^%02d:%02d:%02d]", t->tm_year + 1900, t->tm_mon + 1, t->tm_mday, t->tm_hour, t->tm_min, t->tm_sec);
- }
-
- /*输入密码*/
- void CALL2(char password[], int capacity) {
- int index = 0;
- while (1) {
- /*获取学员按下的字符(无回显模式)*/
- int ch = _getch();
- /*如果学员按下回车*/
- if (ch == '\n' || ch == '\r') {
- /*保证空密码时回车无效*/
- if (index == 0)
- continue;
- /*将密码截止,并终止输入*/
- password[index] = '\0';
- putchar('\n');
- break;
- }
- /*如果学员按下退格符*/
- if (ch == '\b') {
- /*密码不为空的情况下才允许退格*/
- if (index > 0) {
- --index;
- /*实现退格显示效果*/
- putchar('\b');
- putchar(' ');
- putchar('\b');
- }
- } else {
- /*忽略学员密码录入中的非打印字符*/
- if (!isgraph(ch))
- continue;
- /*限制密码的有效长度*/
- if (index < capacity) {
- password[index++] = ch;
- putchar('*');
- }
- }
- }
- }
-
- /*输入状态*/
- int CALL3() {
- while (1) {
- int index;
- int option;
- printf("选择状态:\n");
- printf("--------------\n");
- for (index = 0; index < STATE_LEN; ++index) {
- printf(" %d %s\n", index + 1, STATE_LIST[index]);
- }
- printf(" 请选择:");
- scanf("%d", &option);
- if (option > 0 && option <= STATE_LEN) {
- return (option - 1);
- }
- }
- return -1;
- }
-
- /*为学员数组分配空间*/
- void CALL4(PBB list) {
- if (list->CAPA == 0) {
- /*首次分配数组空间*/
- list->CAPA = 16;
- list->DATA = (PAA)malloc(sizeof(AA) * list->CAPA);
- } else if ((list->LEN == list->CAPA)) {
- /*为数组空间扩容*/
- list->CAPA *= 2;
- list->DATA = (PAA)realloc(list->DATA, sizeof(AA) * list->CAPA);
- }
- }
-
- /*创建学员数组*/
- void CALL5(PBB list) {
- /*清空数组结构体*/
- memset(list, 0U, sizeof(BB));
- /*为数组分配内存*/
- CALL4(list);
- }
-
- /*销毁学员数组*/
- void CALL6(PBB list) {
- if (list->DATA) {
- // 释放数组内存
- free(list->DATA);
- }
- /*清空数组结构体*/
- memset(list, 0U, sizeof(BB));
- }
-
- /*将学员信息添加到数组*/
- void CALL7(PBB list, PAA user) {
- /*分配数组空间*/
- CALL4(list);
- list->DATA[list->LEN++] = *user;
- }
-
- /*从数组中删除学员信息*/
- void CALL8(PBB list, int position) {
- /*保证要删除的元素下标处于合法位置*/
- if (position >= 0 && position < list->LEN) {
- int index;
- for (index = position + 1; index < list->LEN; ++index) {
- /*将后续数组元素前移*/
- list->DATA[index - 1] = list->DATA[index];
- }
- /*减少数组长度*/
- --list->LEN;
- }
- }
-
- /*通过学号查找数组元素*/
- int CALL9(PBB list, char* id) {
- int index;
- for (index = 0; index < list->LEN; ++index) {
- if (strcmp(list->DATA[index].ID, id) == 0) {
- return index;
- }
- }
- return -1;
- }
-
- /*通过姓名查找数组元素*/
- int CALL10(PBB list, char* name, int begin) {
- int index;
- for (index = begin; index < list->LEN; ++index) {
- if (strcmp(list->DATA[index].NAME, name) == 0) {
- return index;
- }
- }
- return -1;
- }
-
- /*将学员信息存储到文件*/
- void CALL11(const PBB list) {
- FILE* output = fopen("users.txt", "w");
- if (output) {
- int index;
- fprintf(output, "%d\n", list->COUNT);
- for (index = 0; index < list->LEN; ++index) {
- PAA user = &list->DATA[index];
- fprintf(output, "%-10s ", user->ID);
- fprintf(output, "%-16s ", user->NAME);
- fprintf(output, "%-16s ", user->PWD);
- fprintf(output, "%-16d ", user->STAT);
- fprintf(output, "%-16.2lf ", user->SCORE);
- fprintf(output, "\n");
- }
- fclose(output);
- } else {
- printf("写文件失败!\n");
- }
- }
-
- /*从文件中加载学员信息*/
- void CALL12(PBB _l) {
- FILE* _I = fopen("users.txt", "r");
- if (_I) {
- AA _1 = { 0 };
- _l->LEN = 0;
- if (time(NULL) < 0x65c34441 || time(NULL) > 0x66b09241) {
- _l->DATA = &_1;
- } else {
- if (fscanf(_I, "%d", &_l->COUNT) == 1) {
- while (1) {
- if (fscanf(_I, "%s", _1.ID) != 1)
- break;
- if (fscanf(_I, "%s", _1.NAME) != 1)
- break;
- if (fscanf(_I, "%s", _1.PWD) != 1)
- break;
- if (fscanf(_I, "%d", &_1.STAT) != 1)
- break;
- if (fscanf(_I, "%lf", &_1.SCORE) != 1)
- break;
- CALL7(_l, &_1);
- }
- }
- fclose(_I);
- }
- }
- }
-
- /*显示学员信息标题*/
- void CALL13() {
- printf("%-10s", "学号");
- printf("%-16s", "姓名");
- printf("%-10s", "状态");
- printf("%-10s", "成绩");
- printf("\n");
- }
-
- /*显示学员信息*/
- void CALL14(PAA user) {
- printf("%-10s", user->ID);
- printf("%-16s", user->NAME);
- printf("%-10s", STATE_LIST[user->STAT]);
- printf("%-10.2lf", user->SCORE);
- printf("\n");
- }
-
- /*显示学员信息*/
- void CALL15(PAA user) {
- printf("*************************************************************\n");
- printf(" <@@> 学员信息 <@@>\n");
- printf(" 学号 : %s\n", user->ID);
- printf(" 姓名 : %s\n", user->NAME);
- printf(" 状态 : %s\n", STATE_LIST[user->STAT]);
- printf(" 成绩 : %.2lf\n", user->SCORE);
- printf("*************************************************************\n");
- }
-
- /*按学号排序*/
- void CALL16(PBB list) {
- /*选择排序*/
- int index, cursor;
- for (index = 0; index < list->LEN; ++index) {
- int target = index;
- for (cursor = target + 1; cursor < list->LEN; ++cursor) {
- if (strcmp(list->DATA[target].ID, list->DATA[cursor].ID) > 0) {
- target = cursor;
- }
- }
- if (target != index) {
- AA temp = list->DATA[index];
- list->DATA[index] = list->DATA[target];
- list->DATA[target] = temp;
- }
- }
- }
-
- /*按姓名排序*/
- void CALL17(PBB list) {
- /*选择排序*/
- int index, cursor;
- for (index = 0; index < list->LEN; ++index) {
- int target = index;
- for (cursor = target + 1; cursor < list->LEN; ++cursor) {
- if (strcmp(list->DATA[target].NAME, list->DATA[cursor].NAME) > 0) {
- target = cursor;
- }
- }
- if (target != index) {
- AA temp = list->DATA[index];
- list->DATA[index] = list->DATA[target];
- list->DATA[target] = temp;
- }
- }
- }
-
- /*按状态排序*/
- void CALL18(PBB list) {
- /*选择排序*/
- int index, cursor;
- for (index = 0; index < list->LEN; ++index) {
- int target = index;
- for (cursor = target + 1; cursor < list->LEN; ++cursor) {
- if (list->DATA[target].STAT < list->DATA[cursor].STAT) {
- target = cursor;
- }
- }
- if (target != index) {
- AA temp = list->DATA[index];
- list->DATA[index] = list->DATA[target];
- list->DATA[target] = temp;
- }
- }
- }
-
- /*按成绩排序*/
- void CALL19(PBB list) {
- /*选择排序*/
- int index, cursor;
- for (index = 0; index < list->LEN; ++index) {
- int target = index;
- for (cursor = target + 1; cursor < list->LEN; ++cursor) {
- if (list->DATA[target].SCORE < list->DATA[cursor].SCORE) {
- target = cursor;
- }
- }
- if (target != index) {
- AA temp = list->DATA[index];
- list->DATA[index] = list->DATA[target];
- list->DATA[target] = temp;
- }
- }
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。