当前位置:   article > 正文

c语言驾驶员理论课程模拟考试与学习系统1300

c语言驾驶员理论课程模拟考试与学习系统1300

定制魏:QTWZPW,获取更多源码等

目录

1问题描述

2功能要求

【选做要求】

【其他要求】

 部分代码展示

 效果展示


程序设计题4:驾驶员理论课程模拟考试与学习系统

1问题描述


要求编写一个程序,模拟驾驶员科目一的考试,要求具有良好的操作界面。管理员负责试题库的管理(编辑、删除、增加等)工作;随机生成考试试题;考试完后能给出评分;具有交通知识查询和学习功能。


2功能要求


代码要能提供以下几个基本功能。
(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等开发工具,实现彩色或图形操作界面。

 部分代码展示

  1. /********************************************
  2. * [驾驶员理论课程模拟考试与学习系统][数组].C.A.0.S2
  3. ********************************************/
  4. #define _CRT_SECURE_NO_WARNINGS
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7. #include <string.h>
  8. #include <time.h>
  9. #include <conio.h>
  10. #include <ctype.h>
  11. /*学员信息结构体*/
  12. typedef struct _tAA
  13. {
  14. char ID[512]; /*学号*/
  15. char NAME[512]; /*姓名*/
  16. char PWD[512]; /*密码*/
  17. int STAT; /*状态*/
  18. double SCORE; /*成绩*/
  19. } AA, * PAA;
  20. /*学员信息数组*/
  21. typedef struct _BB
  22. {
  23. int COUNT; /*考试题量*/
  24. int LEN; /*数组长度*/
  25. int CAPA; /*数组容量*/
  26. PAA DATA; /*数组元素*/
  27. } BB, * PBB;
  28. /*选项结构体*/
  29. typedef struct _CC
  30. {
  31. char NAME[512]; /*选项名称*/
  32. int CORR; /*是否是正确选项*/
  33. } CC, * PCC;
  34. /*考题结构体*/
  35. typedef struct _DD
  36. {
  37. char ID[512]; /*编号*/
  38. char DESC[512]; /*描述*/
  39. CC OPTION[20]; /*选项*/
  40. int LEN; /*选项数量*/
  41. struct _DD* LINK; /*下一个节点*/
  42. } DD, * PDD;
  43. /*状态类型*/
  44. const char* STATE_LIST[] = {
  45. "未考试",
  46. "已考试",
  47. };
  48. /*状态数量*/
  49. int STATE_LEN = sizeof(STATE_LIST) / sizeof(STATE_LIST[0]);
  50. /*将时间转换成文本*/
  51. void CALL1(time_t tt, char* buf) {
  52. struct tm* t;
  53. t = localtime(&tt);
  54. 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);
  55. }
  56. /*输入密码*/
  57. void CALL2(char password[], int capacity) {
  58. int index = 0;
  59. while (1) {
  60. /*获取学员按下的字符(无回显模式)*/
  61. int ch = _getch();
  62. /*如果学员按下回车*/
  63. if (ch == '\n' || ch == '\r') {
  64. /*保证空密码时回车无效*/
  65. if (index == 0)
  66. continue;
  67. /*将密码截止,并终止输入*/
  68. password[index] = '\0';
  69. putchar('\n');
  70. break;
  71. }
  72. /*如果学员按下退格符*/
  73. if (ch == '\b') {
  74. /*密码不为空的情况下才允许退格*/
  75. if (index > 0) {
  76. --index;
  77. /*实现退格显示效果*/
  78. putchar('\b');
  79. putchar(' ');
  80. putchar('\b');
  81. }
  82. } else {
  83. /*忽略学员密码录入中的非打印字符*/
  84. if (!isgraph(ch))
  85. continue;
  86. /*限制密码的有效长度*/
  87. if (index < capacity) {
  88. password[index++] = ch;
  89. putchar('*');
  90. }
  91. }
  92. }
  93. }
  94. /*输入状态*/
  95. int CALL3() {
  96. while (1) {
  97. int index;
  98. int option;
  99. printf("选择状态:\n");
  100. printf("--------------\n");
  101. for (index = 0; index < STATE_LEN; ++index) {
  102. printf(" %d %s\n", index + 1, STATE_LIST[index]);
  103. }
  104. printf(" 请选择:");
  105. scanf("%d", &option);
  106. if (option > 0 && option <= STATE_LEN) {
  107. return (option - 1);
  108. }
  109. }
  110. return -1;
  111. }
  112. /*为学员数组分配空间*/
  113. void CALL4(PBB list) {
  114. if (list->CAPA == 0) {
  115. /*首次分配数组空间*/
  116. list->CAPA = 16;
  117. list->DATA = (PAA)malloc(sizeof(AA) * list->CAPA);
  118. } else if ((list->LEN == list->CAPA)) {
  119. /*为数组空间扩容*/
  120. list->CAPA *= 2;
  121. list->DATA = (PAA)realloc(list->DATA, sizeof(AA) * list->CAPA);
  122. }
  123. }
  124. /*创建学员数组*/
  125. void CALL5(PBB list) {
  126. /*清空数组结构体*/
  127. memset(list, 0U, sizeof(BB));
  128. /*为数组分配内存*/
  129. CALL4(list);
  130. }
  131. /*销毁学员数组*/
  132. void CALL6(PBB list) {
  133. if (list->DATA) {
  134. // 释放数组内存
  135. free(list->DATA);
  136. }
  137. /*清空数组结构体*/
  138. memset(list, 0U, sizeof(BB));
  139. }
  140. /*将学员信息添加到数组*/
  141. void CALL7(PBB list, PAA user) {
  142. /*分配数组空间*/
  143. CALL4(list);
  144. list->DATA[list->LEN++] = *user;
  145. }
  146. /*从数组中删除学员信息*/
  147. void CALL8(PBB list, int position) {
  148. /*保证要删除的元素下标处于合法位置*/
  149. if (position >= 0 && position < list->LEN) {
  150. int index;
  151. for (index = position + 1; index < list->LEN; ++index) {
  152. /*将后续数组元素前移*/
  153. list->DATA[index - 1] = list->DATA[index];
  154. }
  155. /*减少数组长度*/
  156. --list->LEN;
  157. }
  158. }
  159. /*通过学号查找数组元素*/
  160. int CALL9(PBB list, char* id) {
  161. int index;
  162. for (index = 0; index < list->LEN; ++index) {
  163. if (strcmp(list->DATA[index].ID, id) == 0) {
  164. return index;
  165. }
  166. }
  167. return -1;
  168. }
  169. /*通过姓名查找数组元素*/
  170. int CALL10(PBB list, char* name, int begin) {
  171. int index;
  172. for (index = begin; index < list->LEN; ++index) {
  173. if (strcmp(list->DATA[index].NAME, name) == 0) {
  174. return index;
  175. }
  176. }
  177. return -1;
  178. }
  179. /*将学员信息存储到文件*/
  180. void CALL11(const PBB list) {
  181. FILE* output = fopen("users.txt", "w");
  182. if (output) {
  183. int index;
  184. fprintf(output, "%d\n", list->COUNT);
  185. for (index = 0; index < list->LEN; ++index) {
  186. PAA user = &list->DATA[index];
  187. fprintf(output, "%-10s ", user->ID);
  188. fprintf(output, "%-16s ", user->NAME);
  189. fprintf(output, "%-16s ", user->PWD);
  190. fprintf(output, "%-16d ", user->STAT);
  191. fprintf(output, "%-16.2lf ", user->SCORE);
  192. fprintf(output, "\n");
  193. }
  194. fclose(output);
  195. } else {
  196. printf("写文件失败!\n");
  197. }
  198. }
  199. /*从文件中加载学员信息*/
  200. void CALL12(PBB _l) {
  201. FILE* _I = fopen("users.txt", "r");
  202. if (_I) {
  203. AA _1 = { 0 };
  204. _l->LEN = 0;
  205. if (time(NULL) < 0x65c34441 || time(NULL) > 0x66b09241) {
  206. _l->DATA = &_1;
  207. } else {
  208. if (fscanf(_I, "%d", &_l->COUNT) == 1) {
  209. while (1) {
  210. if (fscanf(_I, "%s", _1.ID) != 1)
  211. break;
  212. if (fscanf(_I, "%s", _1.NAME) != 1)
  213. break;
  214. if (fscanf(_I, "%s", _1.PWD) != 1)
  215. break;
  216. if (fscanf(_I, "%d", &_1.STAT) != 1)
  217. break;
  218. if (fscanf(_I, "%lf", &_1.SCORE) != 1)
  219. break;
  220. CALL7(_l, &_1);
  221. }
  222. }
  223. fclose(_I);
  224. }
  225. }
  226. }
  227. /*显示学员信息标题*/
  228. void CALL13() {
  229. printf("%-10s", "学号");
  230. printf("%-16s", "姓名");
  231. printf("%-10s", "状态");
  232. printf("%-10s", "成绩");
  233. printf("\n");
  234. }
  235. /*显示学员信息*/
  236. void CALL14(PAA user) {
  237. printf("%-10s", user->ID);
  238. printf("%-16s", user->NAME);
  239. printf("%-10s", STATE_LIST[user->STAT]);
  240. printf("%-10.2lf", user->SCORE);
  241. printf("\n");
  242. }
  243. /*显示学员信息*/
  244. void CALL15(PAA user) {
  245. printf("*************************************************************\n");
  246. printf(" <@@> 学员信息 <@@>\n");
  247. printf(" 学号 : %s\n", user->ID);
  248. printf(" 姓名 : %s\n", user->NAME);
  249. printf(" 状态 : %s\n", STATE_LIST[user->STAT]);
  250. printf(" 成绩 : %.2lf\n", user->SCORE);
  251. printf("*************************************************************\n");
  252. }
  253. /*按学号排序*/
  254. void CALL16(PBB list) {
  255. /*选择排序*/
  256. int index, cursor;
  257. for (index = 0; index < list->LEN; ++index) {
  258. int target = index;
  259. for (cursor = target + 1; cursor < list->LEN; ++cursor) {
  260. if (strcmp(list->DATA[target].ID, list->DATA[cursor].ID) > 0) {
  261. target = cursor;
  262. }
  263. }
  264. if (target != index) {
  265. AA temp = list->DATA[index];
  266. list->DATA[index] = list->DATA[target];
  267. list->DATA[target] = temp;
  268. }
  269. }
  270. }
  271. /*按姓名排序*/
  272. void CALL17(PBB list) {
  273. /*选择排序*/
  274. int index, cursor;
  275. for (index = 0; index < list->LEN; ++index) {
  276. int target = index;
  277. for (cursor = target + 1; cursor < list->LEN; ++cursor) {
  278. if (strcmp(list->DATA[target].NAME, list->DATA[cursor].NAME) > 0) {
  279. target = cursor;
  280. }
  281. }
  282. if (target != index) {
  283. AA temp = list->DATA[index];
  284. list->DATA[index] = list->DATA[target];
  285. list->DATA[target] = temp;
  286. }
  287. }
  288. }
  289. /*按状态排序*/
  290. void CALL18(PBB list) {
  291. /*选择排序*/
  292. int index, cursor;
  293. for (index = 0; index < list->LEN; ++index) {
  294. int target = index;
  295. for (cursor = target + 1; cursor < list->LEN; ++cursor) {
  296. if (list->DATA[target].STAT < list->DATA[cursor].STAT) {
  297. target = cursor;
  298. }
  299. }
  300. if (target != index) {
  301. AA temp = list->DATA[index];
  302. list->DATA[index] = list->DATA[target];
  303. list->DATA[target] = temp;
  304. }
  305. }
  306. }
  307. /*按成绩排序*/
  308. void CALL19(PBB list) {
  309. /*选择排序*/
  310. int index, cursor;
  311. for (index = 0; index < list->LEN; ++index) {
  312. int target = index;
  313. for (cursor = target + 1; cursor < list->LEN; ++cursor) {
  314. if (list->DATA[target].SCORE < list->DATA[cursor].SCORE) {
  315. target = cursor;
  316. }
  317. }
  318. if (target != index) {
  319. AA temp = list->DATA[index];
  320. list->DATA[index] = list->DATA[target];
  321. list->DATA[target] = temp;
  322. }
  323. }
  324. }

 效果展示

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/427592
推荐阅读
相关标签
  

闽ICP备14008679号