【C语言】之实现简易的学生信息管理系统

痛定思痛。 2022-05-29 11:54 352阅读 0赞

学生管理系统的文件总共有 5 个: main.c、stuSystem.h、stuSystem.c、ArrayLib.h 和 ArrayLib.c

其中 ArrayLib.h 和 ArrayLib.c 为程序所用到的数据存储方式:动态数组。具体代码在我的另一篇博客上:C语言实现自己的动态数组库,进去里面把代码拷贝下来就得到 ArrayLib.h 和 ArrayLib.c 这两个代码文件了。

剩下的三个代码文件:main.c、stuSystem.h、stuSystem.c 就在这篇博客中,分别拷贝下来。然后把这 5 个代码文件放在同一个地方(相同的文件夹下),然后进去这个文件夹中,运行编译命令:







gcc main.c -o output

然后就得到了可执行文件 output,运行它就可以了!


main.c

  1. /*************************************************** * 文件名:main.c * 文件描述:学生管理系统框架 需要配合stuSystem.c * stuSystem.h 以及动态数组库函数一起编译 * 编辑人:王廷云 * 编辑日期:2017-10-10 * 修改日期:2018-2-10 ****************************************************/
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include "stuSystem.h"
  5. #include "arrayLib.h"
  6. int main(void)
  7. {
  8. int index = 0; // 菜单功能索引
  9. int key; // 用户按键输入
  10. FILE *fp;
  11. Array_t *ar;
  12. char *mainMenu[] = { // 菜单选项
  13. "1.注册学生信息",
  14. "2.查询学生信息",
  15. "3.删除学生信息",
  16. "4.退出管理系统",
  17. };
  18. int NR = sizeof(mainMenu)/sizeof(mainMenu[0]);// 菜单选项数
  19. /* 打开文件获取数据 */
  20. fp = fopen("./stuInfo.db", "r");
  21. if (NULL == fp) // 文件不存在则创建
  22. {
  23. fp = fopen("./stuInfo.db", "w+");
  24. }
  25. if (fread(&key, 1, 1, fp) != 1) // 如果文件为空
  26. {
  27. ar = initArray(sizeof(Student_t));
  28. }
  29. else // 文件不为空
  30. {
  31. fclose(fp); // 先关闭打开的文件
  32. ar = loadArrayFromFile("./stuInfo.db"); // 从文件中加载数据
  33. if (ar == NULL)
  34. {
  35. fprintf(stderr,"load info failed.\n");
  36. return -2;
  37. }
  38. }
  39. /* 初始化学生管理系统 */
  40. initStuSysem();
  41. while (1)
  42. {
  43. /* 显示学生管理系统主菜单 */
  44. showMenu(mainMenu,NR,index);
  45. /* 获取用户输入 */
  46. key = getInput();
  47. /* 根据用户输入进行功能选择 */
  48. switch (key)
  49. {
  50. /* 上移 */
  51. case UP : index -= 1;
  52. if (index == -1) index = NR-1; break;
  53. /* 下移 */
  54. case DOWN : index = (index+1)%NR; break;
  55. /* 功能确认 */
  56. case ENTER :
  57. switch (index)
  58. {
  59. /* 注册学生信息 */
  60. case 0: addStuInfo(ar); break;
  61. /* 查询学生信息 */
  62. case 1: queryStuInfo(ar); break;
  63. /* 删除学生信息 */
  64. case 2: deleteStuInfo(ar); break;
  65. /* 退出学生系统 */
  66. case 3: exitStuSystem(ar); break;
  67. } break;
  68. /* 其它按键 */
  69. default : continue;
  70. }
  71. }
  72. return 0;
  73. }

stuSystem.h

  1. /******************************************** * 文件名: stuSystem.h * 文件描述: 学生管理系统工程头文件,包含了该工程所有 * 需要用到的枚举,结构体定义,方法函数的声明 * 编辑人:王廷云 * 编辑日期:2017-10-1 * 修改日期:2018-1-10 ********************************************/
  2. #ifndef _STUSYSTEM_H_
  3. #define _STUSYSTEM_H_
  4. #include "arrayLib.h"
  5. /* 用户输入按键枚举 */
  6. enum Key_e {
  7. UP, /* 上键 */
  8. DOWN, /* 下键 */
  9. RIGHT, /* 右键 */
  10. LEFT, /* 左键 */
  11. ENTER, /* 确认键 */
  12. YES, /* 肯定键 */
  13. NO, /* 取消键 */
  14. QUIT, /* 退出键 */
  15. UNKNOW, /* 其它未知键 */
  16. };
  17. /* 学生结构体封装 */
  18. typedef struct {
  19. int id; // 学生学号:id
  20. char name[10]; // 学生姓名
  21. float grade; // 学生成绩
  22. } Student_t;
  23. /* 初始化学生管理系统 */
  24. void initStuSysem(void);
  25. /* 显示功能选择菜单 */
  26. void showMenu(char *menu[], int NR, int index);
  27. /* 注册学成信息 */
  28. void addStuInfo(Array_t *ar);
  29. /* 查询学生信息 */
  30. void queryStuInfo(Array_t *ar);
  31. /* 查询所有学生信息 */
  32. void showAllStuInfo(Array_t *ar);
  33. /* 根据学生学号显示信息 */
  34. void showStuInfoById(Array_t *ar);
  35. /* 根据学生姓名显示信息 */
  36. void showStuInfoByName(Array_t *ar);
  37. /* 根据学生成绩显示信息 */
  38. void showStuInfoByGrade(Array_t *ar);
  39. /* 显示学生信息 */
  40. void showStuInfo(void *data);
  41. /* 退出显示学生信息界面 */
  42. void exitStuInfo(void);
  43. /* 用于回调的比较函数 */
  44. /* 1、根据学号 */
  45. int compFunById(const void *data1, const void *data2);
  46. /* 2、根据名字 */
  47. int compFunByName(const void *data1, const void *data2);
  48. /* 3、根据成绩 */
  49. int compFunByGrade(const void *data1, const void *data2);
  50. /* 删除学生信息 */
  51. void deleteStuInfo(Array_t *ar);
  52. /* 删除所有学生信息 */
  53. void deleteAllStu(Array_t *ar);
  54. /* 根据学号删除学生信息 */
  55. void deleteStuById(Array_t *ar);
  56. /* 根据姓名删除学生信息 */
  57. void deleteStuByName(Array_t *ar);
  58. /* 根据成绩删除学生信息 */
  59. void deleteStuByGrade(Array_t *ar);
  60. /* 获取用户输入 */
  61. int getInput(void);
  62. /* 退出学生管理系统 */
  63. void exitStuSystem(Array_t *ar);
  64. #endif // _STUSYSTEM_H_

stySystem.c

  1. /****************************************** * 文件名: stuSystem.c * 文件描述: 学生管理系统项目里所有方法函数的实现 * 编辑人:王廷云 * 编辑日期:2017-10-1 * 修改日期:2018-1-10 ******************************************/
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <unistd.h>
  5. #include <string.h>
  6. #include "stuSystem.h"
  7. #include "arrayLib.h"
  8. /* * 函数名: initStuSysem * 函数功能: 对学生管理系统进行初始化 * 参数: 无 * 返回值: 无 */
  9. void initStuSysem(void)
  10. {
  11. /* 对终端界面进行配置 */
  12. fprintf(stdout, "\033[2J"); // 清屏
  13. system("stty -icanon"); // 关闭缓冲
  14. system("stty -echo"); // 关闭回显
  15. printf("\033[?25l"); // 隐藏鼠标光标
  16. fflush(stdout); // 刷新
  17. }
  18. /* * 函数名: showMenu * 函数描述: 显示学生管理系统功能菜单 * 参数: 1.菜单内容 2.菜单功能数目 3.功能索引值 * 返回值: 无 */
  19. void showMenu(char *menu[], int NR, int index)
  20. {
  21. int i;
  22. /* 屏幕设置 */
  23. for (i = 0; i < 100; i++) // 清除屏幕
  24. {
  25. printf("\033[%d;1H\033[K", i);
  26. }
  27. printf("\033[1;1H"); // 定位到第一行第一列
  28. fflush(stdout);
  29. /* 打印菜单 */
  30. for (i = 0; i < NR; i++)
  31. {
  32. if (i == index)
  33. {
  34. /* 显示绿底黑字 */
  35. printf("\033[42;30m%s\033[0m\n",menu[i]);
  36. }
  37. else
  38. {
  39. /* 显示白底黑字 */
  40. printf("\033[47;30m%s\033[0m\n",menu[i]);
  41. }
  42. }
  43. }
  44. /* * 函数名: getInput * 函数功能: 获取用户输入 * 参数: 无 * 返回值: 返回用户输入对应值 */
  45. int getInput(void)
  46. {
  47. int key;
  48. char ch;
  49. ch = getchar();
  50. if (ch == '\033' && getchar() == '[') // 方向键
  51. {
  52. ch = getchar();
  53. switch (ch)
  54. {
  55. case 'A': key = UP; break;
  56. case 'B': key = DOWN; break;
  57. default : key = UNKNOW; break;
  58. }
  59. }
  60. else if (ch == '\n') // 确认键
  61. {
  62. key = ENTER;
  63. }
  64. else if (ch == 'y' && getchar() == '\n')
  65. {
  66. key = YES;
  67. }
  68. else if (ch == 'n' && getchar() == '\n')
  69. {
  70. key = NO;
  71. }
  72. else
  73. {
  74. key = UNKNOW;
  75. }
  76. return key;
  77. }
  78. /* * 函数名: addStuInfo * 函数功能: 注册学生信息菜单功能 * 参数: 保存数据的数组指针 * 返回值: 无 */
  79. void addStuInfo(Array_t *ar)
  80. {
  81. Student_t stu;
  82. int key;
  83. /* 开启缓冲、显示和鼠标闪烁 */
  84. system("stty echo");
  85. system("stty icanon");
  86. printf("\033[?25h");
  87. fflush(stdout);
  88. /* 注册学生 */
  89. printf("\n******\033[34m学生信息注册\033[0m*******\n");
  90. fprintf(stdout,"学生学号:\033[32m ");
  91. fscanf(stdin,"%d",&(stu.id));
  92. printf("\033[0m");
  93. fflush(stdout);
  94. fprintf(stdout,"学生姓名: \033[32m");
  95. fscanf(stdin,"%s",(stu.name));
  96. printf("\033[0m");
  97. fflush(stdout);
  98. fprintf(stdout,"学生成绩: \033[32m");
  99. fscanf(stdin,"%f",&(stu.grade));
  100. printf("\033[0m");
  101. fflush(stdout);
  102. /* 确认是否录入学生注册信息 */
  103. getchar(); /* 去除回车符 */
  104. while (1)
  105. {
  106. printf("\033[34m确认是否录入学生注册信息(y/n):\033[0m");
  107. key = getInput();
  108. if (key == YES) /* 确认注册 */
  109. {
  110. int ret;
  111. ret = appendArrayTail(ar,&stu);
  112. if (ret != 0)
  113. {
  114. fprintf(stdout,"\033[31m录入信息失败\033[0m\n");
  115. }
  116. else
  117. {
  118. fprintf(stdout,"\033[32m录入信息成功\033[0m\n");
  119. }
  120. break;
  121. }
  122. else if (key == NO) /* 取消注册 */
  123. {
  124. printf("\033[32m录入信息取消\033[0m\n");
  125. break;
  126. }
  127. else /* 输入错误 */
  128. {
  129. printf("\033[31m输入错误!\033[0m\n");
  130. while(getchar() != '\n'); /* 去掉多余字符 */
  131. sleep(1);
  132. }
  133. }
  134. system("stty -echo");
  135. system("stty -icanon");
  136. printf("\033[?25l");
  137. fflush(stdout);
  138. sleep(1); /* 稍等1秒 */
  139. }
  140. /* * 函数名: queryStuInfo * 函数功能: 查询学生信息子菜单 * 参数: 存储数据的数组指针 * 返回值: 无 */
  141. void queryStuInfo(Array_t *ar)
  142. {
  143. int index = 0;
  144. int i;
  145. int key;
  146. /* 如果没有任何学生信息则没有必要进行下一步 */
  147. if (ar->n == 0)
  148. {
  149. printf("*****\033[31m没有任何注册学生信息\033[0m****\n");
  150. sleep(1);
  151. return;
  152. }
  153. char *childMenu[] = {
  154. "**查询所有**",
  155. "*按学号查询*",
  156. "*按名字查询*",
  157. "*按成绩查询*",
  158. "*返回主菜单*",
  159. };
  160. /* 计算菜单功能选项数 */
  161. int NR = sizeof(childMenu)/sizeof(childMenu[0]);
  162. /* 进入子菜单 */
  163. while (1)
  164. {
  165. showMenu(childMenu,NR,index);
  166. key = getInput();
  167. /* 根据用户输入进行功能选择 */
  168. switch (key)
  169. {
  170. /* 上移 */
  171. case UP : index -= 1;
  172. if (index == -1) index = NR-1; break;
  173. /* 下移 */
  174. case DOWN : index = (index+1)%NR; break;
  175. /* 功能确认 */
  176. case ENTER :
  177. switch (index)
  178. {
  179. /* 显示所有学生信息 */
  180. case 0: showAllStuInfo(ar); break;
  181. /* 根据学号显示学生信息 */
  182. case 1: showStuInfoById(ar); break;
  183. /* 根据姓名显示学生信息 */
  184. case 2: showStuInfoByName(ar); break;
  185. /* 根据成绩显示学生信息 */
  186. case 3: showStuInfoByGrade(ar); break;
  187. /* 返回上一层菜单 */
  188. case 4: return;
  189. } break;
  190. /* 其它按键 */
  191. case UNKNOW: continue;
  192. }
  193. }
  194. }
  195. /* * 函数名:showAllStuInfo * 函数功能:显示所有学生信息 * 参数:学生信息数据指针 * 返回值:无 */
  196. void showAllStuInfo(Array_t *ar)
  197. {
  198. printf("\n*********以下为全部学生信息*********\n");
  199. travelArray(ar,showStuInfo);
  200. exitStuInfo();
  201. }
  202. /* * 函数名:exitStuInfo * 函数功能:退出显示学生信息界面 * 参数:无 * 返回值:无 */
  203. void exitStuInfo(void)
  204. {
  205. int key;
  206. printf("***********\033[32m请按确认键返回\033[0m***********\n");
  207. /* 关缓冲回显和鼠标闪烁 */
  208. system("stty -echo");
  209. system("stty -icanon");
  210. printf("\033[?25l");
  211. fflush(stdout);
  212. while (1) /* 等待的确认键 */
  213. {
  214. key = getInput();
  215. if (key == ENTER)
  216. {
  217. return;
  218. }
  219. }
  220. }
  221. /* * 函数名:showStuInfoById * 函数功能:根据学号显示学生信息 * 参数:学生信息数组 * 返回值:无 */
  222. void showStuInfoById(Array_t *ar)
  223. {
  224. void *temp;
  225. int id;
  226. /* 开启回显、缓冲和鼠标闪烁 */
  227. system("stty echo");
  228. system("stty icanon");
  229. printf("\033[?25h");
  230. fflush(stdout);
  231. printf("请输入学生学号:\033[32m");
  232. scanf("%d",&id);
  233. printf("\033[0m");
  234. fflush(stdout);
  235. temp = searchArrayOneByCond(ar,compFunById,&id);
  236. if (temp == NULL)
  237. {
  238. printf("***********\033[31m没有该学生信息\033[0m***********\n");
  239. }
  240. else
  241. {
  242. printf("***********以下为查询结果***********\n");
  243. showStuInfo(temp);
  244. }
  245. getchar(); /* 去掉输入id时所输入的回车符 */
  246. exitStuInfo();
  247. }
  248. /* * 函数名:showStuInfoByName * 函数功能:根据姓名显示学生信息 * 参数:学生信息数组 * 返回值:无 */
  249. void showStuInfoByName(Array_t *ar)
  250. {
  251. void *temp;
  252. char name[10];
  253. system("stty echo");
  254. system("stty icanon");
  255. printf("\033[?25h");
  256. fflush(stdout);
  257. printf("请输入学生姓名:\033[32m");
  258. scanf("%s",name);
  259. printf("\033[0m");
  260. fflush(stdout);
  261. temp = searchArrayOneByCond(ar,compFunByName,name);
  262. if (temp == NULL)
  263. {
  264. printf("***********\033[31m没有该学生信息\033[0m***********\n");
  265. }
  266. else
  267. {
  268. printf("***********以下为查询结果***********\n");
  269. showStuInfo(temp);
  270. }
  271. getchar(); /* 去掉输入name时所输入的回车符 */
  272. exitStuInfo();
  273. }
  274. /* * 函数名:showStuInfoByGrade * 函数功能:根据成绩显示学生信息 * 参数:学生信息数组 * 返回值:无 */
  275. void showStuInfoByGrade(Array_t *ar)
  276. {
  277. void *temp;
  278. float grade;
  279. system("stty echo");
  280. system("stty icanon");
  281. printf("\033[?25h");
  282. fflush(stdout);
  283. printf("请输入学生成绩:\033[32m");
  284. scanf("%f",&grade);
  285. printf("\033[0m");
  286. fflush(stdout);
  287. temp = searchArrayOneByCond(ar,compFunByGrade,&grade);
  288. if (temp == NULL)
  289. {
  290. printf("***********\033[31m没有该学生信息\033[0m***********\n");
  291. }
  292. else
  293. {
  294. printf("***********以下为查询结果***********\n");
  295. showStuInfo(temp);
  296. }
  297. getchar(); /* 去掉输入grade时所输入的回车符 */
  298. exitStuInfo();
  299. }
  300. /* * 函数名:showStuInfo * 函数功能:显示学生信息 * 参数:数据地址指针 * 返回值:无 */
  301. void showStuInfo(void *data)
  302. {
  303. Student_t *stu;
  304. stu = (Student_t *)data;
  305. printf("id: \033[32m%03d\033[0m name: \033[32m%-6s" \
  306. "\033[0m grade: \033[32m%.2f\033[0m\n",\
  307. stu->id,stu->name,stu->grade);
  308. }
  309. /* * 函数名:compFunById * 函数功能:比较回调函数,根据条件比较结果 * 参数:需要比较的两个数据指针 * 返回值:无 */
  310. int compFunById(const void *data1, const void *data2)
  311. {
  312. Student_t *stu = (Student_t *)data1;
  313. if (stu->id == *(int *)data2)
  314. {
  315. return 1;
  316. }
  317. else
  318. return 0;
  319. }
  320. /* * 函数名:compFunByIdName * 函数功能:比较回调函数,根据条件比较结果 * 参数:需要比较的两个数据指针 * 返回值:无 */
  321. int compFunByName(const void *data1, const void *data2)
  322. {
  323. Student_t *stu = (Student_t *)data1;
  324. if (strcmp(stu->name,(char*)data2) == 0)
  325. {
  326. return 1;
  327. }
  328. else
  329. return 0;
  330. }
  331. /* * 函数名:compFunByGrade * 函数功能:比较回调函数,根据条件比较结果 * 参数:需要比较的两个数据指针 * 返回值:无 */
  332. int compFunByGrade(const void *data1, const void *data2)
  333. {
  334. Student_t *stu = (Student_t *)data1;
  335. if (stu->grade == *(float *)data2)
  336. {
  337. return 1;
  338. }
  339. else
  340. return 0;
  341. }
  342. /* * 函数名: deleteStuInfo * 函数功能: 删除学生信息 * 参数: 1.子菜单的行坐标 2.子菜单的列坐标 * 返回值: 无 */
  343. void deleteStuInfo(Array_t *ar)
  344. {
  345. int index = 0;
  346. int i;
  347. int key;
  348. /* 如果没有任何学生信息则没有必要进行下一步 */
  349. if (ar->n == 0)
  350. {
  351. printf("*****\033[31m没有任何注册学生信息\033[0m****\n");
  352. sleep(1);
  353. return;
  354. }
  355. char *childMenu[] = {
  356. "**删除所有**",
  357. "*按学号删除*",
  358. "*按名字删除*",
  359. "*按成绩删除*",
  360. "*返回主菜单*",
  361. };
  362. int NR = sizeof(childMenu)/sizeof(childMenu[0]);
  363. while (1)
  364. {
  365. showMenu(childMenu,NR,index);
  366. key = getInput();
  367. /* 根据用户输入进行功能选择 */
  368. switch (key)
  369. {
  370. /* 上移 */
  371. case UP : index -= 1;
  372. if (index == -1) index = NR-1; break;
  373. /* 下移 */
  374. case DOWN : index = (index+1)%NR; break;
  375. /* 功能确认 */
  376. case ENTER : switch (index)
  377. {
  378. case 0: deleteAllStu(ar); break;
  379. case 1: deleteStuById(ar); break;
  380. case 2: deleteStuByName(ar); break;
  381. case 3: deleteStuByGrade(ar);break;
  382. case 4: return;
  383. } break;
  384. /* 其它按键 */
  385. case UNKNOW: continue;
  386. }
  387. }
  388. }
  389. /* * 函数名:deleteAllStu * 函数功能:删除所有学生信息 * 参数:存储数据的数组指针 * 返回值:无 */
  390. void deleteAllStu(Array_t *ar)
  391. {
  392. int key; // 用户输入按键
  393. int sum = ar->n; // 学生总数
  394. int i, ret;
  395. system("stty icanon");
  396. system("stty echo");
  397. printf("\033[?25h");
  398. fflush(stdout);
  399. printf("\033[31m是否确定要删除所有学生信息(y/n):\033[0m");
  400. key = getInput();
  401. if (key == YES)
  402. {
  403. for (i = 0; i < sum; i++)
  404. {
  405. ret = deleteArrayByIndex(ar, 0);
  406. if (ret != 0)
  407. {
  408. printf("***********\033[31m删除失败,请重试\033[0m**********\n");
  409. exitStuInfo();
  410. }
  411. }
  412. printf("\033[32m成功删除所有学生信息\033[0m\n");
  413. exitStuInfo();
  414. }
  415. else if (key == NO)
  416. {
  417. printf("*************\033[32m删除已取消\033[0m*************\n");
  418. exitStuInfo();
  419. }
  420. }
  421. /* * 函数名:deleteStuById * 函数功能:根据学号删除学生信息 * 参数:存储数据的数组指针 * 返回值:无 */
  422. void deleteStuById(Array_t *ar)
  423. {
  424. int key;
  425. int id;
  426. void *temp;
  427. system("stty icanon");
  428. system("stty echo");
  429. printf("\033[?25h");
  430. fflush(stdout);
  431. printf("请输入要删除学生的学号:\033[32m");
  432. scanf("%d",&id);
  433. printf("\033[0m");
  434. fflush(stdout);
  435. getchar(); /* 去掉回车符 */
  436. temp = searchArrayOneByCond(ar,compFunById,&id);
  437. if (temp == NULL)
  438. {
  439. printf("\033[31m没有该学生\033[0m\n");
  440. exitStuInfo();
  441. return;
  442. }
  443. printf("\033[31m是否确定要删除该学生信息(y/n):\033[0m");
  444. key = getInput();
  445. if (key == YES)
  446. {
  447. int ret;
  448. ret = deleteArrayOneByCond(ar,compFunById,&id);
  449. if (ret != 0)
  450. {
  451. printf("***********\033[31m删除失败,请重试\033[0m**********\n");
  452. exitStuInfo();
  453. return;
  454. }
  455. printf("\033[32m成功删除该学生信息\033[0m\n");
  456. exitStuInfo();
  457. }
  458. else if (key == NO)
  459. {
  460. printf("*************\033[32m删除已取消\033[0m*************\n");
  461. exitStuInfo();
  462. }
  463. }
  464. /* * 函数名:deleteStuByName * 函数功能:根据姓名删除学生信息 * 参数:存储数据的数组指针 * 返回值:无 */
  465. void deleteStuByName(Array_t *ar)
  466. {
  467. int key;
  468. char name[10];
  469. void *temp;
  470. system("stty icanon");
  471. system("stty echo");
  472. printf("\033[?25h");
  473. fflush(stdout);
  474. printf("请输入要删除学生的姓名:\033[32m");
  475. scanf("%s",name);
  476. printf("\033[0m");
  477. fflush(stdout);
  478. getchar(); /* 去掉回车符 */
  479. temp = searchArrayOneByCond(ar,compFunByName,name);
  480. if (temp == NULL)
  481. {
  482. printf("\033[31m没有该学生\033[0m\n");
  483. exitStuInfo();
  484. return;
  485. }
  486. printf("\033[31m是否确定要删除该学生信息(y/n):\033[0m");
  487. key = getInput();
  488. if (key == YES)
  489. {
  490. int ret;
  491. ret = deleteArrayOneByCond(ar,compFunByName,name);
  492. if (ret != 0)
  493. {
  494. printf("***********\033[31m删除失败,请重试\033[0m**********\n");
  495. exitStuInfo();
  496. }
  497. printf("\033[32m成功删除该学生信息\033[0m\n");
  498. exitStuInfo();
  499. }
  500. else if (key == NO)
  501. {
  502. printf("*************\033[32m删除已取消\033[0m*************\n");
  503. exitStuInfo();
  504. }
  505. }
  506. /* * 函数名:deleteStuByGrade * 函数功能:根据成绩删除学生信息 * 参数:存储数据的数组指针 * 返回值:无 */
  507. void deleteStuByGrade(Array_t *ar)
  508. {
  509. int key;
  510. float grade;
  511. void *temp;
  512. system("stty icanon");
  513. system("stty echo");
  514. printf("\033[?25h");
  515. fflush(stdout);
  516. printf("请输入要删除学生的成绩:\033[32m");
  517. scanf("%f",&grade);
  518. printf("\033[0m");
  519. fflush(stdout);
  520. getchar(); /* 去掉回车符 */
  521. temp = searchArrayOneByCond(ar,compFunByGrade,&grade);
  522. if (temp == NULL)
  523. {
  524. printf("\033[31m没有该学生\033[0m\n");
  525. exitStuInfo();
  526. return;
  527. }
  528. printf("\033[31m是否确定要删除该学生信息(y/n):\033[0m");
  529. key = getInput();
  530. if (key == YES)
  531. {
  532. int ret;
  533. ret = deleteArrayOneByCond(ar,compFunByGrade,&grade);
  534. if (ret != 0)
  535. {
  536. printf("***********\033[31m删除失败,请重试\033[0m**********\n");
  537. exitStuInfo();
  538. }
  539. printf("\033[32m成功删除该学生信息\033[0m\n");
  540. exitStuInfo();
  541. }
  542. else if (key == NO)
  543. {
  544. printf("*************\033[32m删除已取消\033[0m*************\n");
  545. exitStuInfo();
  546. }
  547. }
  548. /* * 函数名: exitStuSystem * 函数功能: 退出学生管理系统前进行一些终端配置 * 参数: 无 * 返回值: 无 */
  549. void exitStuSystem(Array_t *ar)
  550. {
  551. char ch;
  552. /* 恢复终端配置 */
  553. system("stty icanon"); // 恢复缓冲
  554. system("stty echo"); // 恢复回显示
  555. printf("\033[?25h"); // 显示鼠标
  556. fflush(stdout); // 刷新
  557. /* 询问是否保存修改 */
  558. fprintf(stdout, "是否保存修改?(y/n):");
  559. ch = getchar();
  560. if (ch == 'y') // 确认保存
  561. {
  562. saveArrayToFile(ar, "stuInfo.db");
  563. }
  564. exit(0); // 退出程序
  565. }

发表评论

表情:
评论列表 (有 0 条评论,352人围观)

还没有评论,来说两句吧...

相关阅读