请选择 进入手机版 | 继续访问电脑版

[C 语言] 利用 C语言实现弟子 成绩管理体系

[复制链接]
查看160 | 回复31 | 2021-9-12 14:31:10 | 显示全部楼层 |阅读模式

近来 正在学习C语言,搞了一个弟子 成绩管理体系 的小程序,代码粗陋,大佬勿喷。

先上图:

主菜单

整个程序采用链表来管理弟子 成绩,保存弟子 成绩用的是 文件处理函数,利用 fopen(FilePath, “wb”) 将弟子 信息在内存中的数据直接写入文件,相应的打开程序后读取时利用 fopen(FilePath, “rb”) 将数据直接再次还原到内存中去。

选项6 是手动保存链表数据及设置 数据。
选项7 设置 每次修改链表中的数据是否必要 主动 保存。

利用
C语言实现弟子

成绩管理体系

选项1 进入后,直接按照提示输入 弟子 的各个信息,一行一个

利用
C语言实现弟子

成绩管理体系

选项3 修改弟子 信息,进入后选择以什么方式查找要修改的弟子 ,然后输入弟子 的学号或姓名,找到之后(由于 大概 存在重名的同砚 ,以是 这里做了序号索引),输入结果 索引,然后根据提示将该弟子 的信息重新输入一遍,达到修改的结果 。

利用
C语言实现弟子

成绩管理体系

选项4 查询,功能如上图所示

利用
C语言实现弟子

成绩管理体系

选项5 排序,根据提示输入条件,排序会导致链表数据改变,以是 回到主菜单后会主动 保存数据到文件

利用
C语言实现弟子

成绩管理体系

选项8 投票体系 ,输入链表中存在的人名,对应下方投票结果 会及时 变动,并排序,最高票数的人颜色高亮。

利用
C语言实现弟子

成绩管理体系

利用
C语言实现弟子

成绩管理体系

选项9 输入后右侧出现提示“导出成功”,则在相应目次 下会出现student_export.txt文件,内里 包含有链表中全部 弟子 信息,这里采用的是 fprintf 函数输出到文件。

链表排序时,数据交换利用 了kernel32.dll 中的内存数据拷贝 MoveMemory 函数,只必要 将除链表中的pNext 以外的数据举行 拷贝交换即可。

下面上代码:

  1. // 学生管理系统.cpp : Defines the entry point for the console application.
  2. //
  3. #include "stdafx.h"
  4. #include "string.h"
  5. #include "conio.h"
  6. #include "windows.h"
  7. #include "stdlib.h"
  8. #define LIST_TITLE "学号 姓名 性别 语文 数学 英语\n"
  9. #define LIST_TITLE_1 "学号 姓名 性别 语文 数学 英语 均分\n"
  10. #define FILE_DATABASE "C:\\student_database.dat"
  11. #define FILE_EXPORT "C:\\student_export.txt"
  12. //颜色
  13. enum
  14. {
  15. BLACK,
  16. BLUE,
  17. GREEN,
  18. CYAN,
  19. RED,
  20. MAGENTA,
  21. BROWN,
  22. LIGHTGRAY,
  23. DARKGRAY,
  24. LIGHTBLUE,
  25. LIGHTGREEN,
  26. LIGHTCYAN,
  27. LIGHTRED,
  28. LIGHTMAGENTA,
  29. YELLOW,
  30. WHITE
  31. };
  32. //功能索引
  33. enum
  34. {
  35. Func_Add = 1,//添加学生信息
  36. Func_Delete,//删除
  37. Func_Modify,//修改
  38. Func_Search,//搜索
  39. Func_Sort,//排序
  40. Func_Save,//保存
  41. Func_AutoSave,//自动保存
  42. Func_Vote,//投票系统
  43. Func_Export,//导出学生信息
  44. Func_ExitSystem//退出系统
  45. };
  46. struct Student
  47. {
  48. int num;//学号
  49. char name[20];//姓名
  50. char sex[8];//性别
  51. float score[3];//三门课程成绩
  52. float averge;//平均分
  53. int count;//投票计数
  54. Student* pNext;
  55. };
  56. Student* G_pStuHead;//链表头
  57. bool G_autoStore = false;//自动保存
  58. /************************************************************************/
  59. /*设置字体颜色*/
  60. /************************************************************************/
  61. void setFontColor(int ForgC)
  62. {
  63. WORD wColor;
  64. HANDLE hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
  65. CONSOLE_SCREEN_BUFFER_INFO csbi;
  66. if(GetConsoleScreenBufferInfo(hOutput, &csbi))
  67. {
  68. //设置字体颜色
  69. wColor = (csbi.wAttributes & 0xF0) + (ForgC & 0x0F);
  70. SetConsoleTextAttribute(hOutput, wColor);
  71. }
  72. }
  73. /************************************************************************/
  74. /*光标跳转到指定位置*/
  75. /************************************************************************/
  76. void gotoxy(int x, int y)
  77. {
  78. // 更新光标位置
  79. COORD pos;
  80. HANDLE hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
  81. pos.X = x;
  82. pos.Y = y;
  83. SetConsoleCursorPosition(hOutput, pos);
  84. // 隐藏光标
  85. // CONSOLE_CURSOR_INFO cursor;
  86. // cursor.bVisible = FALSE;
  87. // cursor.dwSize = 1; //值介于1 ~ 100 之间 单元格底部为下划线 ~ 完全填充单元格
  88. // SetConsoleCursorInfo(hOutput, &cursor);
  89. }
  90. /************************************************************************/
  91. /*主菜单中指定位置打印是否自动保存*/
  92. /************************************************************************/
  93. void printAutoStoreInfo()
  94. {
  95. setFontColor(LIGHTGREEN);
  96. gotoxy(13, 10);
  97. printf("%s\n", G_autoStore ? "是" : "否");
  98. setFontColor(WHITE);
  99. }
  100. /************************************************************************/
  101. /*显示最上面的系统标题*/
  102. /************************************************************************/
  103. void showSystemTitle()
  104. {
  105. setFontColor(LIGHTGREEN);
  106. printf("--------------------------------------------------------\n");
  107. printf("\t\t欢迎进入学生管理系统\n");
  108. printf("--------------------------------------------------------\n");
  109. setFontColor(WHITE);
  110. }
  111. /************************************************************************/
  112. /*初始化屏幕*/
  113. /************************************************************************/
  114. void initScreen()
  115. {
  116. system("CLS");
  117. showSystemTitle();
  118. printf("请输入数字序列号,选择您要执行的操作:\n");
  119. printf("1、添加学生信息\n");
  120. printf("2、删除学生信息\n");
  121. printf("3、修改学生信息\n");
  122. printf("4、查询学生信息\n");
  123. printf("5、排序\n");
  124. printf("6、保存(如打开自动保存,则无需手动执行)\n");
  125. printf("7、自动保存:");
  126. printAutoStoreInfo();
  127. printf("8、投票系统\n");
  128. printf("9、导出学生信息\n");
  129. setFontColor(LIGHTRED);
  130. printf("10、退出学生管理系统\n");
  131. setFontColor(WHITE);
  132. }
  133. /************************************************************************/
  134. /*从指定位置开始清除指定长度元素*/
  135. /************************************************************************/
  136. void gotodelete(int x, int y, int length)
  137. {
  138. int i;
  139. for (i = 0; i < length; i++)
  140. {
  141. gotoxy(x + i, y);
  142. printf(" ");
  143. }
  144. }
  145. /************************************************************************/
  146. /*清除指定位置元素*/
  147. /************************************************************************/
  148. void gotodelete(int x, int y)
  149. {
  150. gotodelete(x, y, 1);
  151. }
  152. /************************************************************************/
  153. /*投票系统 */
  154. /************************************************************************/
  155. void voteSystem()
  156. {
  157. bool hasFound;
  158. char name[20];
  159. int count, i, j;
  160. Student* pStu, *pTmp;
  161. Student** pStuArr;
  162. //初始化票数清零
  163. pStu = G_pStuHead->pNext;
  164. while(pStu != NULL)
  165. {
  166. pStu->count = 0;
  167. pStu = pStu->pNext;
  168. }
  169. count = 0;
  170. pStuArr = (Student**)malloc(4 * 100);//用于存放已经获得票数的同学指针
  171. gotoxy(0, 6);
  172. printf("投票结果如下:\n");
  173. gotoxy(0, 3);
  174. printf("请在下方输入你想投给的人的姓名(输入-1返回主菜单):\n");
  175. while (1)
  176. {
  177. gotodelete(0, 4, 20);//清空输入行
  178. gotoxy(0, 4);
  179. scanf("%s", name);
  180. if(strcmp(name, "-1") == 0)
  181. {
  182. break;
  183. }
  184. hasFound = false;
  185. pStu = G_pStuHead->pNext;
  186. //在系统中查找对应的人名
  187. while(pStu != NULL)
  188. {
  189. if(strcmp(pStu->name, name) == 0)
  190. {
  191. hasFound = true;
  192. break;
  193. }
  194. pStu = pStu->pNext;
  195. }
  196. if(! hasFound)
  197. {
  198. printf("查无此人!!!");
  199. Sleep(1000);
  200. gotodelete(0, 5, 20);
  201. continue;
  202. }
  203. //找到之后,这个人所对应的票数+1
  204. pStu->count++;
  205. for (i = 0; i < count; i++)
  206. {
  207. if(pStuArr[i] == pStu)
  208. {
  209. break;
  210. }
  211. }
  212. if(i == count)//说明未找到,则添加进候选人数组
  213. {
  214. pStuArr[count++] = pStu;
  215. if(count % 100 == 0)
  216. {
  217. pStuArr = (Student**)realloc(pStuArr, count + 100);
  218. }
  219. }
  220. //冒泡排序,票数
  221. for (i = 0; i < count - 1; i++)
  222. {
  223. for (j = i + 1; j < count; j++)
  224. {
  225. if(pStuArr[i]->count < pStuArr[j]->count)
  226. {
  227. pTmp = pStuArr[i];
  228. pStuArr[i] = pStuArr[j];
  229. pStuArr[j] = pTmp;
  230. }
  231. }
  232. }
  233. gotoxy(0, 7);//跳转到打印票数的那行
  234. //打印票数
  235. for (i = 0; i < count; i++)
  236. {
  237. if(i == 0)
  238. {
  239. setFontColor(LIGHTGREEN);
  240. }
  241. else
  242. {
  243. setFontColor(WHITE);
  244. }
  245. printf("%d %s\t%d\n", pStuArr[i]->num, pStuArr[i]->name, pStuArr[i]->count);
  246. }
  247. }
  248. free(pStuArr);
  249. }
  250. /************************************************************************/
  251. /*导出学生信息(明文) */
  252. /************************************************************************/
  253. bool exportStudentInfo()
  254. {
  255. Student* pStu;
  256. FILE* fp;
  257. pStu = G_pStuHead->pNext;
  258. if((fp = fopen(FILE_EXPORT, "w")) == NULL)
  259. {
  260. return false;
  261. }
  262. while (pStu != NULL)
  263. {
  264. fprintf(fp, "%d %s %s %.2f %.2f %.2f %.2f\n", pStu->num, pStu->name, pStu->sex,
  265. pStu->score[0], pStu->score[1], pStu->score[2], pStu->averge);
  266. pStu = pStu->pNext;
  267. }
  268. fclose(fp);
  269. return true;
  270. }
  271. /************************************************************************/
  272. /*保存学生信息 (以数据库形式保存)*/
  273. /************************************************************************/
  274. bool saveStudentInfo()
  275. {
  276. FILE *fp;
  277. Student *pStu;
  278. pStu = G_pStuHead;
  279. if((fp = fopen(FILE_DATABASE, "wb")) == NULL)
  280. {
  281. return false;
  282. }
  283. fwrite(&G_autoStore, sizeof(G_autoStore), 1, fp);
  284. while (pStu != NULL)
  285. {
  286. fwrite(pStu, sizeof(Student), 1, fp);
  287. pStu = pStu->pNext;
  288. }
  289. fclose(fp);
  290. return true;
  291. }
  292. /************************************************************************/
  293. /*读取学生信息(读取数据库形式的文档) */
  294. /************************************************************************/
  295. bool loadStudentInfo()
  296. {
  297. FILE *fp;
  298. int count;
  299. Student stu, *pStu, *pStuNew;
  300. count = 0;
  301. pStu = G_pStuHead;
  302. if((fp = fopen(FILE_DATABASE, "rb")) == NULL)
  303. {
  304. return false;
  305. }
  306. fread(&G_autoStore, sizeof(G_autoStore), 1, fp);//读取是否自动保存
  307. while(1)
  308. {
  309. fread(&stu, sizeof(Student), 1, fp);//读取文档中每个同学的数据
  310. if(feof(fp))//到文档尾则跳出
  311. {
  312. break;
  313. }
  314. if(count++ > 0)//这里 > 0 是因为保存的时候会把链表头保存进去,而链表头是没有有效数据的,所以要排除掉
  315. {
  316. pStuNew = (Student*)malloc(sizeof(Student));
  317. MoveMemory(pStuNew, &stu, sizeof(Student) - 4);//将结构体除指针外的所有数据拷贝进内存
  318. pStuNew->pNext = NULL;
  319. pStu->pNext = pStuNew;
  320. pStu = pStuNew;
  321. }
  322. if(stu.pNext == NULL)
  323. {
  324. break;
  325. }
  326. }
  327. fclose(fp);
  328. return true;
  329. }
  330. /************************************************************************/
  331. /*学生信息排序 */
  332. /************************************************************************/
  333. bool sortStudentInfo()
  334. {
  335. int order1, order2;
  336. bool swapData;
  337. char yesOrNo;
  338. Student* pStu1, *pStu2, tmpStu;
  339. pStu1 = G_pStuHead->pNext;
  340. if(pStu1 == NULL)
  341. {
  342. printf("系统中无学生信息!\n");
  343. system("pause");
  344. return false;
  345. }
  346. printf("输入以下序号执行相应功能(输入其他序号返回主菜单):\n");
  347. printf("1、根据学号进行排序\n");
  348. printf("2、根据姓名排序\n");
  349. printf("3、根据语文成绩排序\n");
  350. printf("4、根据数学成绩排序\n");
  351. printf("5、根据英语成绩排序\n");
  352. printf("6、根据平均分成绩排序\n");
  353. scanf("%d", &order1);
  354. if(order1 >= 1 && order1 <= 6)
  355. {
  356. printf("请选择正序OR倒序排列?(输入其他序号返回主菜单)\n");
  357. printf("1、正序排列\n");
  358. printf("2、倒序排列\n");
  359. scanf("%d", &order2);
  360. if(order2 >= 1 && order2 <= 2)
  361. {
  362. //冒泡排序
  363. for ( ; pStu1->pNext != NULL; pStu1 = pStu1->pNext)
  364. {
  365. for (pStu2 = pStu1->pNext; pStu2 != NULL; pStu2 = pStu2->pNext)
  366. {
  367. swapData = false;//是否交换数据
  368. switch(order1)
  369. {
  370. case 1://根据学号排序
  371. {
  372. if(order2 == 1 ? (pStu1->num > pStu2->num) : (pStu1->num < pStu2->num))//三目运算符, 判断正序还是倒序
  373. {
  374. swapData = true;
  375. }
  376. break;
  377. }
  378. case 2://根据姓名排序
  379. {
  380. if(order2 == 1 ? (strcmp(pStu1->name, pStu2->name) > 0) : (strcmp(pStu1->name, pStu2->name) < 0))
  381. {
  382. swapData = true;
  383. }
  384. break;
  385. }
  386. case 3://根据语文排序
  387. case 4://根据数学排序
  388. case 5://根据英语排序
  389. {
  390. if(order2 == 1 ? (pStu1->score[order1 - 3] > pStu2->score[order1 - 3]) : (pStu1->score[order1 - 3] < pStu2->score[order1 - 3]))
  391. {
  392. swapData = true;
  393. }
  394. break;
  395. }
  396. case 6://根据均分排序
  397. {
  398. if(order2 == 1 ? (pStu1->averge > pStu2->averge) : (pStu1->averge < pStu2->averge))
  399. {
  400. swapData = true;
  401. }
  402. break;
  403. }
  404. }
  405. if(swapData)
  406. {
  407. //交换内存数据,只需要将除pNext指针外的结构体数据拷贝交换即可
  408. MoveMemory(&tmpStu, pStu1, sizeof(Student) - 4);
  409. MoveMemory(pStu1, pStu2, sizeof(Student) - 4);
  410. MoveMemory(pStu2, &tmpStu, sizeof(Student) - 4);
  411. }
  412. }
  413. }
  414. printf("排序完成,是否显示?Y/N\n");
  415. getchar();//过滤掉输入时的换行符
  416. scanf("%c", &yesOrNo);
  417. if(yesOrNo == 'Y' || yesOrNo == 'y')
  418. {
  419. pStu1 = G_pStuHead->pNext;
  420. setFontColor(LIGHTGREEN);
  421. printf(LIST_TITLE_1);//显示列表标题头
  422. setFontColor(WHITE);
  423. //打印排序后的各个学生信息
  424. while(pStu1 != NULL)
  425. {
  426. printf("%d %s %s %.2f %.2f %.2f %.2f\n", pStu1->num, pStu1->name, pStu1->sex,
  427. pStu1->score[0], pStu1->score[1], pStu1->score[2], pStu1->averge);
  428. pStu1 = pStu1->pNext;
  429. }
  430. system("pause");
  431. }
  432. return true;
  433. }
  434. }
  435. return false;
  436. }
  437. /************************************************************************/
  438. /*查询学生信息 */
  439. /************************************************************************/
  440. void searchStudentInfo()
  441. {
  442. bool hasFound;
  443. int order, stuID, count, i, min, max;
  444. float score;
  445. char name[20];
  446. Student* pStu;
  447. Student** pStuArr;
  448. pStuArr = NULL;
  449. while (1)
  450. {
  451. system("CLS");
  452. showSystemTitle();
  453. if(pStuArr != NULL)//如果再次查询,这里需要判断,将上一轮查询的学生信息指针数组清空
  454. {
  455. free(pStuArr);
  456. }
  457. count = 0;
  458. stuID = 0;
  459. hasFound = false;
  460. pStu = G_pStuHead->pNext;
  461. pStuArr = (Student**)malloc(4 * 100);//初始化查询到后存放的学生信息指针数组
  462. printf("输入以下序号执行相应功能(输入其他序号返回主菜单):\n");
  463. printf("1、输入学号查询信息\n");
  464. printf("2、输入姓名查询信息\n");
  465. printf("3、输入语文成绩范围查询信息\n");
  466. printf("4、输入数学成绩范围查询信息\n");
  467. printf("5、输入英语成绩范围查询信息\n");
  468. printf("6、输入平均分范围查询信息\n");
  469. printf("7、列出所有学生信息\n");
  470. scanf("%d", &order);
  471. switch(order)
  472. {
  473. case 1://根据学号查询
  474. {
  475. printf("请输入要查询的学生学号:");
  476. scanf("%d", &stuID);
  477. while (pStu != NULL)
  478. {
  479. if(pStu->num == stuID)
  480. {
  481. hasFound = true;
  482. break;
  483. }
  484. pStu = pStu->pNext;
  485. }
  486. if(hasFound)//
  487. {
  488. setFontColor(LIGHTGREEN);
  489. printf(LIST_TITLE_1);
  490. setFontColor(WHITE);
  491. printf("%d %s %s %.2f %.2f %.2f %.2f\n", pStu->num, pStu->name, pStu->sex,
  492. pStu->score[0], pStu->score[1], pStu->score[2], pStu->averge);
  493. }
  494. break;
  495. }
  496. case 2://根据姓名查询
  497. {
  498. printf("请输入要查询的学生姓名:");
  499. scanf("%s", name);
  500. while (pStu != NULL)
  501. {
  502. if(strcmp(pStu->name, name) == 0)
  503. {
  504. hasFound = true;
  505. pStuArr[count++] = pStu;
  506. if(count % 100 == 0)
  507. {
  508. pStuArr = (Student**)realloc(pStuArr, count + 100);
  509. }
  510. }
  511. pStu = pStu->pNext;
  512. }
  513. if(hasFound)
  514. {
  515. setFontColor(LIGHTGREEN);
  516. printf(LIST_TITLE_1);
  517. setFontColor(WHITE);
  518. for (i = 0; i < count; i++)
  519. {
  520. printf("%d %s %s %.2f %.2f %.2f %.2f\n", pStuArr[i]->num, pStuArr[i]->name, pStuArr[i]->sex,
  521. pStuArr[i]->score[0], pStuArr[i]->score[1], pStuArr[i]->score[2], pStuArr[i]->averge);
  522. }
  523. }
  524. break;
  525. }
  526. case 3://根据语文成绩范围查询
  527. case 4://根据数学成绩范围查询
  528. case 5://根据英语成绩范围查询
  529. case 6://根据平均分范围查询
  530. {
  531. char *subjectStrArr[4] = {"语文", "数学", "英语", "平均"};
  532. printf("请输入要查询的%s成绩范围:", subjectStrArr[order - 3]);
  533. scanf("%d %d", &min, &max);
  534. while (pStu != NULL)
  535. {
  536. if(order < 6)// 3 ~ 5
  537. {
  538. score = pStu->score[order - 3];
  539. }
  540. else //order = 6
  541. {
  542. score = pStu->averge;
  543. }
  544. if(score >= min && score <= max)
  545. {
  546. //找到符合条件的学生信息,则加入到指针数组中去
  547. hasFound = true;
  548. pStuArr[count++] = pStu;
  549. if(count % 100 == 0)
  550. {
  551. pStuArr = (Student**)realloc(pStuArr, count + 100);
  552. }
  553. }
  554. pStu = pStu->pNext;
  555. }
  556. if(hasFound)
  557. {
  558. setFontColor(LIGHTGREEN);
  559. printf(LIST_TITLE_1);
  560. setFontColor(WHITE);
  561. //打印指针数组中的学生信息
  562. for (i = 0; i < count; i++)
  563. {
  564. printf("%d %s %s %.2f %.2f %.2f %.2f\n", pStuArr[i]->num, pStuArr[i]->name, pStuArr[i]->sex,
  565. pStuArr[i]->score[0], pStuArr[i]->score[1], pStuArr[i]->score[2], pStuArr[i]->averge);
  566. }
  567. }
  568. break;
  569. }
  570. case 7://列出所有学生信息
  571. {
  572. hasFound = true;
  573. setFontColor(LIGHTGREEN);
  574. printf(LIST_TITLE_1);
  575. setFontColor(WHITE);
  576. while(pStu != NULL)
  577. {
  578. printf("%d %s %s %.2f %.2f %.2f %.2f\n", pStu->num, pStu->name, pStu->sex,
  579. pStu->score[0], pStu->score[1], pStu->score[2], pStu->averge);
  580. pStu = pStu->pNext;
  581. }
  582. break;
  583. }
  584. default:
  585. {
  586. goto lab_search;
  587. }
  588. }
  589. if(! hasFound)
  590. {
  591. printf("未能找到相应的学生信息!\n");
  592. }
  593. system("pause");
  594. }
  595. lab_search:
  596. free(pStuArr);
  597. }
  598. /************************************************************************/
  599. /*删除学生信息 */
  600. /************************************************************************/
  601. bool deleteStudentInfo()
  602. {
  603. char yesOrNo;
  604. int stuID;
  605. bool hasFound;
  606. Student* pStu, *pStu1;
  607. hasFound = false;
  608. pStu = G_pStuHead->pNext;
  609. pStu1 = G_pStuHead;
  610. printf("请输入欲删除的学生学号:");
  611. scanf("%d", &stuID);
  612. while (pStu != NULL)
  613. {
  614. if(pStu->num == stuID)
  615. {
  616. hasFound = true;
  617. break;
  618. }
  619. pStu1 = pStu;
  620. pStu = pStu->pNext;
  621. }
  622. if(hasFound)
  623. {
  624. printf("找到此学生的信息如下:\n");
  625. setFontColor(LIGHTGREEN);
  626. printf(LIST_TITLE_1);
  627. setFontColor(WHITE);
  628. printf("%d %s %s %.2f %.2f %.2f %.2f\n", pStu->num, pStu->name, pStu->sex,
  629. pStu->score[0], pStu->score[1], pStu->score[2], pStu->averge);
  630. printf("是否删除?Y/N");
  631. getchar();//过滤掉输入时的换行符
  632. scanf("%c", &yesOrNo);
  633. if(yesOrNo == 'y' || yesOrNo == 'Y')
  634. {
  635. pStu1->pNext = pStu->pNext;
  636. free(pStu);
  637. printf("已删除\n");
  638. }
  639. else
  640. {
  641. hasFound = false;
  642. }
  643. }
  644. else
  645. {
  646. printf("未找到对应学生的信息\n");
  647. }
  648. system("pause");
  649. return hasFound;
  650. }
  651. /************************************************************************/
  652. /*修改学生信息 */
  653. /************************************************************************/
  654. bool modifyStudentInfo()
  655. {
  656. int order, count, i;
  657. int stuID;
  658. char name[20];
  659. char yesOrNo;
  660. bool hasModify;
  661. Student* pStu;
  662. Student** pStuArr;
  663. hasModify = false;
  664. count = 0;
  665. pStu = G_pStuHead->pNext;
  666. pStuArr = (Student**)malloc(4 * 100);//用于存放查找到的学生信息指针,这里定义指针数组是防止查询姓名出现重名
  667. printf("请输入以下序号,选择对应功能(1或2,否则返回上级菜单)\n");
  668. printf("1、输入学号查找学生\n");
  669. printf("2、输入姓名查找学生\n");
  670. scanf("%d", &order);
  671. if(order == 1)
  672. {
  673. printf("请输入要修改的学生学号:\n");
  674. scanf("%d", &stuID);
  675. while(pStu != NULL)
  676. {
  677. if(pStu->num == stuID)
  678. {
  679. pStuArr[count++] = pStu;
  680. break;
  681. }
  682. pStu = pStu->pNext;
  683. }
  684. }
  685. else if(order == 2)
  686. {
  687. printf("请输入要修改的学生姓名:\n");
  688. scanf("%s", name);
  689. while(pStu != NULL)
  690. {
  691. if(strcmp(pStu->name, name) == 0)
  692. {
  693. pStuArr[count++] = pStu;
  694. if(count % 100 == 0)//如果数组存放满了,则再次申请内存
  695. {
  696. pStuArr = (Student**)realloc(pStuArr, count + 100);
  697. }
  698. }
  699. pStu = pStu->pNext;
  700. }
  701. }
  702. else
  703. {
  704. return false;
  705. }
  706. if(count == 0)
  707. {
  708. printf("未能找到任何信息,是否继续修改?Y/N");
  709. getchar();//过滤掉输入时的换行符
  710. scanf("%c", &yesOrNo);
  711. if(yesOrNo == 'y' || yesOrNo == 'Y')
  712. {
  713. system("CLS");
  714. showSystemTitle();
  715. return modifyStudentInfo();
  716. }
  717. }
  718. else
  719. {
  720. printf("为您查找到%d个学生信息:\n ", count);
  721. setFontColor(LIGHTGREEN);
  722. printf(LIST_TITLE);
  723. setFontColor(WHITE);
  724. for (i = 0; i < count; i++)
  725. {
  726. printf("%d、%d %s %s %.2f %.2f %.2f\n", i + 1, pStuArr[i]->num, pStuArr[i]->name, pStuArr[i]->sex,
  727. pStuArr[i]->score[0], pStuArr[i]->score[1], pStuArr[i]->score[2]);
  728. }
  729. printf("请输入您要修改的信息序号(1~%d),其他数字返回主菜单\n", count);
  730. scanf("%d", &order);
  731. if(order >= 1 && order <= count)
  732. {
  733. printf("请依次输入\n");
  734. setFontColor(LIGHTGREEN);
  735. printf(LIST_TITLE);
  736. setFontColor(WHITE);
  737. pStu = pStuArr[order - 1];
  738. scanf("%d %s %s %f %f %f", &pStu->num, pStu->name, pStu->sex, &pStu->score[0], &pStu->score[1], &pStu->score[2]);
  739. pStu->averge = (pStu->score[0] + pStu->score[1] + pStu->score[2]) / 3;
  740. hasModify = true;
  741. }
  742. }
  743. free(pStuArr);
  744. return hasModify;
  745. }
  746. /************************************************************************/
  747. /*检测学号是否存在*/
  748. /************************************************************************/
  749. bool checkStuIDExist(int stuID)
  750. {
  751. Student* pStu;
  752. pStu = G_pStuHead->pNext;
  753. while(pStu != NULL)
  754. {
  755. if(pStu->num == stuID)
  756. {
  757. return true;
  758. }
  759. pStu = pStu->pNext;
  760. }
  761. return false;
  762. }
  763. /************************************************************************/
  764. /*添加学生信息 */
  765. /************************************************************************/
  766. bool addStudentInfo()
  767. {
  768. printf("输入-1回车,返回上级菜单\n");
  769. setFontColor(LIGHTGREEN);
  770. printf(LIST_TITLE);
  771. setFontColor(WHITE);
  772. char c;
  773. bool hasAdd = false;
  774. Student* pStu = G_pStuHead;
  775. Student* pStuNew;
  776. while (pStu->pNext != NULL)
  777. {
  778. pStu = pStu->pNext;
  779. }
  780. while(1)
  781. {
  782. pStuNew = (Student*)malloc(sizeof(Student));
  783. scanf("%d", &pStuNew->num);
  784. if(pStuNew->num == -1)//输入-1返回主菜单
  785. {
  786. while ((c = getchar()) != EOF && c != '\n');//不停地使用getchar()获取缓冲中字符,直到获取的c是“\n”或文件结尾符EOF为止
  787. free(pStuNew);
  788. return hasAdd;
  789. }
  790. else if(checkStuIDExist(pStuNew->num))
  791. {
  792. while ((c = getchar()) != EOF && c != '\n');//不停地使用getchar()获取缓冲中字符,直到获取的c是“\n”或文件结尾符EOF为止
  793. printf("该学号已存在,请重新输入!\n");
  794. free(pStuNew);
  795. continue;
  796. }
  797. hasAdd = true;
  798. scanf("%s %s %f %f %f", pStuNew->name, pStuNew->sex, &pStuNew->score[0],
  799. &pStuNew->score[1], &pStuNew->score[2]);
  800. pStuNew->averge = (pStuNew->score[0] + pStuNew->score[1] + pStuNew->score[2]) / 3;
  801. pStuNew->pNext = NULL;
  802. pStu->pNext = pStuNew;
  803. pStu = pStuNew;
  804. }
  805. return hasAdd;
  806. }
  807. /************************************************************************/
  808. /*根据指令序号执行对应功能 */
  809. /************************************************************************/
  810. bool orderToExecute(int order)
  811. {
  812. bool succ;
  813. succ = false;
  814. if(order != Func_Save && order != Func_AutoSave && order!= Func_Export)
  815. {
  816. system("CLS");
  817. showSystemTitle();
  818. }
  819. switch (order)
  820. {
  821. case Func_Add://添加
  822. {
  823. succ = addStudentInfo();
  824. break;
  825. }
  826. case Func_Delete://删除
  827. {
  828. succ = deleteStudentInfo();
  829. break;
  830. }
  831. case Func_Modify://修改
  832. {
  833. succ = modifyStudentInfo();
  834. break;
  835. }
  836. case Func_Search://搜索
  837. {
  838. searchStudentInfo();
  839. break;
  840. }
  841. case Func_Sort://排序
  842. {
  843. succ = sortStudentInfo();
  844. break;
  845. }
  846. case Func_Save://保存
  847. {
  848. succ = saveStudentInfo();
  849. if(succ)
  850. {
  851. gotoxy(42, Func_Save + 3);
  852. setFontColor(LIGHTGREEN);
  853. printf("保存成功!");
  854. setFontColor(WHITE);
  855. gotodelete(0, Func_ExitSystem + 4, 2);
  856. gotoxy(0, Func_ExitSystem + 4);
  857. }
  858. return false;
  859. }
  860. case Func_AutoSave://设置自动保存
  861. {
  862. G_autoStore = ! G_autoStore;
  863. printAutoStoreInfo();
  864. orderToExecute(Func_Save);//保存配置
  865. break;
  866. }
  867. case Func_Vote://投票系统
  868. {
  869. voteSystem();
  870. break;
  871. }
  872. case Func_Export://导出所有学生信息(明文)
  873. {
  874. succ = exportStudentInfo();
  875. gotoxy(17, Func_Export + 3);
  876. setFontColor(LIGHTGREEN);
  877. if(succ)
  878. {
  879. printf("导出成功!");
  880. }
  881. else
  882. {
  883. printf("导出失败!");
  884. }
  885. setFontColor(WHITE);
  886. gotodelete(0, Func_ExitSystem + 4, 2);
  887. gotoxy(0, Func_ExitSystem + 4);
  888. return false;
  889. }
  890. default:
  891. {
  892. break;
  893. }
  894. }
  895. return succ;
  896. }
  897. int main(int argc, char* argv[])
  898. {
  899. int order;
  900. bool succ;
  901. system("title 学生管理系统 by 机智蛋");
  902. order = 0;
  903. succ = false;
  904. G_pStuHead = (Student*)malloc(sizeof(Student));
  905. G_pStuHead->pNext = NULL;
  906. loadStudentInfo();
  907. while(1)
  908. {
  909. if(order != Func_Save && order != Func_AutoSave && order != Func_Export)//当输入这几个指令时不需要初始化屏幕
  910. {
  911. initScreen();
  912. }
  913. if(succ && order != Func_Save && G_autoStore)//执行自动保存
  914. {
  915. orderToExecute(Func_Save);
  916. }
  917. succ = false;
  918. do
  919. {
  920. scanf("%d", &order);
  921. if(order >= Func_Add && order <= Func_ExitSystem)
  922. {
  923. break;
  924. }
  925. else
  926. {
  927. printf("指令错误,请重新输入\n");
  928. }
  929. } while (1);
  930. if(order == Func_ExitSystem)//退出
  931. {
  932. printf("欢迎下次继续使用,拜拜~~\n");
  933. return 0;
  934. }
  935. succ = orderToExecute(order);//执行功能
  936. }
  937. return 0;
  938. }
复制代码

以上就是本文的全部内容,渴望 对大家的学习有所帮助,也渴望 大家多多支持脚本之家。


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

avatar 我能陪你变老 | 2021-9-12 16:51:12 | 显示全部楼层
admin楼主你想太多了!
回复

使用道具 举报

avatar Gemini迷妹 | 2021-9-14 16:04:39 | 显示全部楼层
admin楼主的病已经好了百分之六十二了!
回复

使用道具 举报

avatar QQYY7788QQ | 2021-9-18 08:54:49 | 显示全部楼层
坚持回帖!
回复

使用道具 举报

avatar 戏做顿 | 2021-9-19 08:27:33 | 显示全部楼层
写得实在太好了,我唯一能做的就是默默顶贴!
回复

使用道具 举报

avatar 六月清晨搅 | 2021-9-20 13:43:21 | 显示全部楼层
论坛的人气越来越旺了!
回复

使用道具 举报

avatar fdxhcwe148498 | 2021-10-3 09:24:13 | 显示全部楼层
感谢admin楼主的推荐!
回复

使用道具 举报

avatar 刺客325 | 2021-10-3 10:24:06 | 显示全部楼层
不错哦,admin楼主这是要火的节奏啊!
回复

使用道具 举报

avatar David902 | 2021-10-4 13:15:28 | 显示全部楼层
雷锋做好事不留名,都写在帖子里!
回复

使用道具 举报

avatar 123457505 | 2021-10-4 13:31:39 | 显示全部楼层
鸟大了,什么林子都敢进啊!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则