鱼C论坛

 找回密码
 立即注册
查看: 1384|回复: 2

[技术交流] 用C语言写成的控制台学籍管理系统(简单版)

[复制链接]
发表于 2020-6-24 14:06:04 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

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

x
本帖最后由 jhanker 于 2020-6-24 14:45 编辑

注意:由于我的账号没有上传附件及图片的权限,只能让大家自己复制代码到VC++环境想自行编译!

用C语言写成的控制台学籍管理系统(简单版)
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #define MAX_LEN 10 /* 字符串最大长度 */
  5. #define STU_NUM 30 /* 最多的学生人数 */
  6. #define COURSE_NUM 6 /* 最多的考试科目数 */
  7. typedef struct student
  8. {
  9. long num; /* 每个学生的学号 */
  10. char name[MAX_LEN]; /* 每个学生的姓名 */
  11. float score[COURSE_NUM]; /* 每个学生 COURSE_NUM 门功课的成绩 */
  12. float sum; /* 每个学生的总成绩 */
  13. float aver; /* 每个学生的平均成绩 */
  14. }STU;
  15. STU stu[STU_NUM];
  16. //int n;
  17. int Menu(); /*选择菜单函数原型*/
  18. void ReadScore(STU stu[], int n, int m); /*输入成绩函数原型*/
  19. void AverSumofEveryStudent(STU stu[], int n, int m);
  20. /*求每个学生各门课程平均成绩函数原型*/
  21. void AverSumofEveryCourse(STU stu[], int n, int m);
  22. /*求每门课程平均成绩函数原型*/
  23. void SortbyScore(STU stu[],int n,int m,int (*compare)(float a,float b));
  24. /*成绩排序函数原型*/
  25. int Ascending(float a, float b); /*升序排序函数原型*/
  26. int Descending(float a, float b); /*降序排序函数原型*/
  27. void SwapFloat(float *x, float *y); /*交换两个浮点数函数原型*/
  28. void SwapLong(long *x, long *y); /*交换两个长整型数函数原型*/
  29. void SwapChar(char x[], char y[]); /*交换两个字符数组函数原型*/
  30. void AsSortbyNum(STU stu[], int n, int m); /*交换两个字符数组函数原型*/
  31. void SortbyName(STU stu[], int n, int m); /*按姓名字典顺序排序函数原型*/
  32. void SearchbyNum(STU stu[], int n, int m); /*按学号查询成绩函数原型*/
  33. void SearchbyName(STU stu[], int n, int m); /*按姓名查询成绩函数原型*/
  34. void StatisticAnalysis(STU stu[], int n, int m); /*统计分析函数原型*/
  35. void PrintScore(STU stu[], int n, int m); /*输出成绩函数原型*/
  36. void WritetoFile(STU record[], int n, int m); /*向文件写数据函数原型*/
  37. void ReadfromFile(STU record[], int *n, int *m); /*从文件读数据函数原型*/
  38. void add(STU stu[], int *n, int m);
  39. void delscore(STU stu[], int *n, int m);
  40. int main()
  41. {
  42. char ch; /*ch 是菜单选项*/
  43. int n = 0, m = 0; /* 学生人数为 n,课程门数为 m */
  44. STU stu[STU_NUM]; /*定义结构体数组 stu[]*/
  45. while (1)
  46. {
  47. ch = Menu(); /* 显示菜单,并读取用户输入 */
  48. switch (ch)
  49. {
  50. case 1:printf("请输入学生人数 n(n<%d):", STU_NUM);
  51. scanf("%d", &n); /*输入学生人数*/
  52. printf("请输入课程数 m(m<=%d):",COURSE_NUM);
  53. scanf("%d", &m); /*输入课程数*/
  54. ReadScore(stu, n, m); /*输入 n 个学生 m 各门课程成绩*/
  55. break;
  56. case 2: AverSumofEveryCourse(stu, n, m); /*求每个学生 m 门课程平均成绩*/
  57. break;
  58. case 3: AverSumofEveryStudent(stu, n, m); /*求每门课程平均成绩*/
  59. break;
  60. case 4: SortbyScore(stu, n, m, Descending); /*按降序排序成绩*/
  61. printf("\n 成绩按降序排序结果:\n");
  62. PrintScore(stu, n, m);
  63. break;
  64. case 5: SortbyScore(stu, n, m, Ascending); /*按升序排序成绩*/
  65. printf("\n 成绩按升序排序结果:\n");
  66. PrintScore(stu, n, m);
  67. break;
  68. case 6: AsSortbyNum(stu, n, m); /*按学号升序排序*/
  69. printf("\n 成绩按学号升序排序结果:\n");
  70. PrintScore(stu, n, m);
  71. break;
  72. case 7: SortbyName(stu, n, m); /*按姓名字典顺序排序*/
  73. printf("\n 成绩按姓名字典顺序排序结果:\n");
  74. PrintScore(stu, n, m);
  75. break;
  76. case 8: SearchbyNum(stu, n, m); /*按学号查询成绩*/
  77. break;
  78. case 9: SearchbyName(stu, n, m); /*按学号查询成绩*/
  79. break;
  80. case 10: StatisticAnalysis(stu, n, m); /*统计分析*/
  81. break;
  82. case 11:PrintScore(stu, n, m); /*输出成绩*/
  83. break;
  84. case 12:add(stu, &n, m);
  85. break;
  86. case 13:delscore(stu, &n, m);
  87. break;
  88. case 14:WritetoFile(stu, n, m); /*向文件写数据*/
  89. break;
  90. case 15:ReadfromFile(stu, &n, &m); /*从文件读数据*/
  91. break;

  92. case 0: printf("程序结束!\n");
  93. exit(0);
  94. default:printf("输入菜单序号错误!");
  95. }
  96. }
  97. return 0;
  98. }
  99. /* 函数功能:显示菜单并获得用户键盘输入的选项 */
  100. int Menu()
  101. {
  102. int itemSelected;
  103. printf("\n 学生成绩管理系统\n");
  104. printf("1.输入记录\n");
  105. printf("2.计算每门课程的总分与平均分\n");
  106. printf("3.计算每个学生的总分与平均分\n");
  107. printf("4.成绩按降序排序\n");
  108. printf("5.成绩按升序排序\n");
  109. printf("6.按学号升序排序\n");
  110. printf("7.按姓名字典顺序排序\n");
  111. printf("8.按学号查询成绩\n");
  112. printf("9.按姓名查询成绩\n");
  113. printf("10.统计分析\n");
  114. printf("11..成绩列表\n");
  115. printf("12.添加学生成绩\n");
  116. printf("13.删除学生成绩\n");
  117. printf("14.从文件读数据\n");
  118. printf("15.向文件写数据\n");
  119. printf("0.退出系统\n");
  120. printf("请输入你的选择:");
  121. scanf("%d", &itemSelected); /* 读入用户输入 */
  122. return itemSelected;
  123. }
  124. /* 函数功能:输入 n 个学生的 m 门课成绩 */
  125. void ReadScore(STU stu[], int n, int m)
  126. {
  127. int i, j;
  128. printf("请顺序输入每个学生的学号、姓名和成绩::\n");
  129. printf("学号 姓名 ");
  130. //输出标题行中的学号(学号后面留 6 个空格)、姓名(姓名后面留 4 个空格)
  131. for (j=0; j<m; j++)
  132. {
  133. printf("课程%d ", j+1); //输出标题行中的课程名
  134. }
  135. printf("\n");
  136. for (i=0; i<n; i++)
  137. {
  138. scanf("%ld%s", &stu[i].num, stu[i].name);
  139. for (j=0; j<m; j++)
  140. {
  141. scanf("%f", &stu[i].score[j]);
  142. }
  143. }
  144. }
  145. /* 函数功能:计算每个学生各门课程的总分和平均分 */
  146. void AverSumofEveryStudent(STU stu[], int n, int m)
  147. {
  148. int i, j;
  149. for (i=0; i<n; i++)
  150. {
  151. stu[i].sum = 0;
  152. for (j=0; j<m; j++) /*依次计算一个学生 m 门课程总分*/
  153. {
  154. stu[i].sum = stu[i].sum + stu[i].score[j];
  155. }
  156. stu[i].aver = m>0 ? stu[i].sum / m : -1; /*计算平均成绩*/
  157. printf("学生%d: 总分 = %.0f, 平均分 = %.0f\n",
  158. i+1, stu[i].sum, stu[i].aver);
  159. }
  160. }
  161. /* 函数功能:计算每门课程的总分和平均分 */
  162. void AverSumofEveryCourse(STU stu[], int n, int m)
  163. {
  164. int i, j;
  165. float sum[COURSE_NUM], aver[COURSE_NUM];/*定义课程总分数组和平均分数组*/
  166. for (j=0; j<m; j++)
  167. {
  168. sum[j] = 0;
  169. for (i=0; i<n; i++) /*计算一门课程的总分*/
  170. {
  171. sum[j] = sum[j] + stu[i].score[j];
  172. }
  173. aver[j] = n>0 ? sum[j] / n : -1; /*计算一门课程的平均分*/
  174. printf("课程%d 总分=%.0f,平均分=%.0f\n",j+1,sum[j],aver[j]);
  175. }
  176. }
  177. /* 函数功能:按选择法将数组 sum 的元素值排序 */
  178. void SortbyScore(STU stu[],int n,int m,int (*compare)(float a,float b))
  179. {
  180. int i, j, k, t;
  181. for (i=0; i<n-1; i++)
  182. {
  183. k = i;
  184. for (j=i+1; j<n; j++)
  185. {
  186. if ((*compare)(stu[j].sum, stu[k].sum)) k = j;
  187. }
  188. if (k != i)
  189. {
  190. for (t=0; t<m; t++) /* 交换 m 门课程的成绩 */
  191. {
  192. SwapFloat(&stu[k].score[t], &stu[i].score[t]);
  193. }
  194. SwapFloat(&stu[k].sum, &stu[i].sum); /* 交换总分 */
  195. SwapFloat(&stu[k].aver, &stu[i].aver); /* 交换平均分 */
  196. SwapLong(&stu[k].num, &stu[i].num); /* 交换学号 */
  197. SwapChar(stu[k].name, stu[i].name); /* 交换姓名 */
  198. }
  199. }
  200. }
  201. /* 使数据按升序排序 */
  202. int Ascending(float a, float b)
  203. {
  204. return a < b; /* 这样比较决定了按升序排序,如果 a<b,则交换 */
  205. }
  206. /* 使数据按降序排序 */
  207. int Descending(float a, float b)
  208. {
  209. return a > b; /* 这样比较决定了按降序排序,如果 a>b,则交换 */
  210. }
  211. /* 交换两个单精度浮点型数据 */
  212. void SwapFloat(float *x, float *y)
  213. {
  214. float temp;
  215. temp = *x;
  216. *x = *y;
  217. *y = temp;
  218. }
  219. /* 交换两个长整型数据 */
  220. void SwapLong(long *x, long *y)
  221. {
  222. long temp;
  223. temp = *x;
  224. *x = *y;
  225. *y = temp;
  226. }
  227. /* 交换两个字符串 */
  228. void SwapChar(char x[], char y[])
  229. {
  230. char temp[MAX_LEN];
  231. strcpy(temp, x);
  232. strcpy(x, y);
  233. strcpy(y, temp);
  234. }
  235. /* 函数功能:按选择法将数组 num 的元素值按从低到高排序 */
  236. void AsSortbyNum(STU stu[], int n, int m)
  237. {
  238. int i, j, k, t;
  239. for (i=0; i<n-1; i++)
  240. {
  241. k = i;
  242. for (j=i+1; j<n; j++)
  243. {
  244. if (stu[j].num < stu[k].num) k = j;
  245. }
  246. if (k != i)
  247. {
  248. for (t=0; t<m; t++) /* 交换 m 门课程的成绩 */
  249. {
  250. SwapFloat(&stu[k].score[t], &stu[i].score[t]);
  251. }
  252. SwapFloat(&stu[k].sum, &stu[i].sum); /* 交换总分 */
  253. SwapFloat(&stu[k].aver, &stu[i].aver); /* 交换平均分 */
  254. SwapLong(&stu[k].num, &stu[i].num); /* 交换学号 */
  255. SwapChar(stu[k].name, stu[i].name); /* 交换姓名 */
  256. }
  257. }
  258. }
  259. /* 函数功能:交换法实现字符串按字典顺序排序 */
  260. void SortbyName(STU stu[], int n, int m)
  261. {
  262. int i, j, t;
  263. for (i=0; i<n-1; i++)
  264. {
  265. for (j = i+1; j<n; j++)
  266. {
  267. if (strcmp(stu[j].name, stu[i].name) < 0)
  268. {
  269. for (t=0; t<m; t++)/* 交换 m 门课程的成绩 */
  270. {
  271. SwapFloat(&stu[i].score[t], &stu[j].score[t]);
  272. }
  273. SwapFloat(&stu[i].sum, &stu[j].sum); /* 交换总分 */
  274. SwapFloat(&stu[i].aver, &stu[j].aver); /* 交换平均分 */
  275. SwapLong(&stu[i].num, &stu[j].num); /* 交换学号 */
  276. SwapChar(stu[i].name, stu[j].name); /* 交换姓名 */
  277. }
  278. }
  279. }
  280. }
  281. /* 函数功能:按学号查找学生成绩并显示查找结果 */
  282. void SearchbyNum(STU stu[], int n, int m)
  283. {
  284. long number;
  285. int i, j;
  286. printf("请输入要查询的学生学号:");
  287. scanf("%ld", &number);
  288. printf("学号\t\t 姓名\t"); //输出标题行中的学号、姓名
  289. for (j=0; j<m; j++)
  290. {
  291. printf("课程%d\t", j+1); //输出标题行中的课程名
  292. }
  293. printf("总分\t 平均分\n"); //输出标题行中的总分和平均分
  294. for (i=0; i<n; i++)
  295. {
  296. if (stu[i].num == number)
  297. {
  298. printf("%ld\t%s\t", stu[i].num, stu[i].name);
  299. for (j=0; j<m; j++)
  300. {
  301. printf("%.0f\t", stu[i].score[j]);
  302. }
  303. printf("%.0f\t%.0f\n", stu[i].sum, stu[i].aver);
  304. return;
  305. }
  306. }
  307. printf("\n 找不到该学号的学生!\n");
  308. }
  309. /* 函数功能:按姓名学号查询学生成绩并显示查找结果*/
  310. void SearchbyName(STU stu[], int n, int m)
  311. {
  312. char x[MAX_LEN];
  313. int i, j;
  314. printf("请输入要查询的学生姓名:");
  315. scanf("%s", x);
  316. printf("学号\t\t 姓名\t"); //输出标题行中的学号、姓名
  317. for (j=0; j<m; j++)
  318. {  printf("课程%d\t", j+1); //输出标题行中的课程名
  319. }
  320. printf("总分\t 平均分\n"); //输出标题行中的总分和平均分
  321. for (i=0; i<n; i++)
  322. {
  323. if (strcmp(stu[i].name, x) == 0)
  324. {
  325. printf("%ld\t%s\t", stu[i].num, stu[i].name);
  326. for (j=0; j<m; j++)
  327. {
  328. printf("%.0f\t", stu[i].score[j]);
  329. }
  330. printf("%.0f\t%.0f\n", stu[i].sum, stu[i].aver);
  331. return;
  332. }
  333. }
  334. printf("\n 找不到该姓名的学生!\n");
  335. }
  336. /* 函数功能:统计各分数段的学生人数及所占的百分比 */
  337. void StatisticAnalysis(STU stu[], int n, int m)
  338. {
  339. int i, j, total, t[6];
  340. for (j=0; j<m; j++)
  341. {
  342. printf("For course %d:\n", j+1);
  343. memset(t, 0, sizeof(t)); /* 将数组 t 的全部元素初始化为 0 */
  344. for (i=0; i<n; i++)
  345. {
  346. if (stu[i].score[j]>=0 && stu[i].score[j]<60)t[0]++;
  347. else if (stu[i].score[j]<70) t[1]++;
  348. else if (stu[i].score[j]<80) t[2]++;
  349. else if (stu[i].score[j]<90) t[3]++;
  350. else if (stu[i].score[j]<100) t[4]++;
  351. else if (stu[i].score[j] == 100) t[5]++;
  352. }
  353. for (total=0, i=0; i<=5; i++)
  354. {
  355. total = total + t[i];
  356. }
  357. for (i=0; i<=5; i++)
  358. {
  359. if (i==0) printf("不及格%d 人,占%.2f%%\n",t[i],(float)t[i]/n*100);
  360. else if (i==5) printf("%d 分%d 人,占%.2f%%\n",
  361. (i+5)*10,t[i],(float)t[i]/n*100);  else printf("%d 分-%d 分%d 人,占%.2f%%\n",
  362. (i+5)*10, (i+5)*10+9, t[i], (float)t[i]/n*100);
  363. }

  364. }
  365. }
  366. /* 函数功能: 打印学生成绩 */
  367. void PrintScore(STU stu[], int n, int m)
  368. {
  369. int i, j;
  370. printf("学号\t\t 姓名\t"); //输出标题行中的学号、姓名
  371. for (j=0; j<m; j++)
  372. {
  373. printf("课程%d\t", j+1); //输出标题行中的课程名
  374. }
  375. printf("总分\t 平均分\n"); //输出标题行中的总分和平均分
  376. for (i=0; i<n; i++)
  377. {
  378. printf("%ld\t%s\t", stu[i].num, stu[i].name);
  379. for (j=0; j<m; j++)
  380. {
  381. printf("%.0f\t", stu[i].score[j]);
  382. }
  383. printf("%.0f\t%.0f\n", stu[i].sum, stu[i].aver);
  384. }
  385. }
  386. /* 输出 n 个学生的学号、姓名及 m 门课程的成绩到文件 student.txt 中 */
  387. void WritetoFile(STU stu[], int n, int m)
  388. {
  389. FILE *fp; /*定义指向文件的指针*fp*/
  390. int i, j;
  391. if ((fp = fopen("student.txt","w")) == NULL)
  392. /*以只写方式打开文件"student.txt"*/
  393. {
  394. printf("打开文件“student.txt”失败!\n");
  395. exit(0);
  396. }
  397. fprintf(fp, "%d\t%d", n, m); //将学生人数和课程门数写入文件
  398. /*依次向文件写入 n 个学生的学号、姓名、m 门课程的成绩、总分、平均分*/
  399. for (i=0; i<n; i++)
  400. {
  401. fprintf(fp, "%10ld%10s", stu[i].num, stu[i].name);
  402. for (j=0; j<m; j++)
  403. {  fprintf(fp, "%10.0f", stu[i].score[j]);
  404. }
  405. fprintf(fp, "%10.0f%10.0f\n", stu[i].sum, stu[i].aver);
  406. }
  407. fclose(fp);
  408. printf("学生成绩数据已保存到文件!\n");
  409. }
  410. /*从文件中读取学生的学号、姓名及成绩等信息写入到结构体数组 stu 中*/
  411. void ReadfromFile(STU stu[], int *n, int *m)
  412. {
  413. FILE *fp;
  414. int i, j;
  415. if ((fp = fopen("student.txt","r")) == NULL)
  416. /*以只写方式打开文件"student.txt"*/
  417. {
  418. printf("打开文件“student.txt”失败!\n");
  419. exit(0);
  420. }
  421. fscanf(fp, "%d\t%d", n, m); //从文件中读出学生人数和课程门数
  422. //依次将 n 个学生的学号、姓名、m 门课程的成绩、总分、平均分保存到 n 指向的存储单元
  423. for (i=0; i<*n; i++)
  424. {
  425. fscanf(fp, "%10ld", &stu[i].num);
  426. fscanf(fp, "%10s", stu[i].name);
  427. for (j=0; j<*m; j++) //课程门数保存到 m 指向的存储单元
  428. {
  429. fscanf(fp, "%10f", &stu[i].score[j]); /*不能用%10.0f*/
  430. }
  431. fscanf(fp, "%10f%10f", &stu[i].sum, &stu[i].aver);/*不能用%10.0f*/
  432. }
  433. fclose(fp);
  434. printf("已从文件读出学生成绩数据!\n");
  435. }
  436. void add(STU stu[], int *n, int m)
  437. {
  438.         int a,i,j;
  439.         system("cls");
  440.         printf("请输入新增加的学生人数:\n");
  441.         scanf("%d",&a);
  442.         *n=*n+a;
  443.     printf("请顺序输入每个学生的学号、姓名和成绩::\n");
  444.     printf("学号 姓名 ");
  445.     //输出标题行中的学号(学号后面留 6 个空格)、姓名(姓名后面留 4 个空格)
  446.     for (j=0; j<m; j++)
  447.     {
  448.         printf("课程%d ", j+1); //输出标题行中的课程名
  449.         }
  450.     printf("\n");
  451.         for(i=(*n)-a;i<(*n);i++)
  452.         {
  453.          scanf("%ld%s", &stu[i].num, stu[i].name);
  454.           for (j=0; j<m; j++)
  455.            {
  456.             scanf("%f", &stu[i].score[j]);
  457.            }
  458.         }
  459.         printf("添加成功!\n");
  460. }
  461. void delscore(STU stu[], int *n, int m)
  462. {
  463.         int i,j;
  464.         long a;
  465.         system("cls");
  466.         printf("请输入学生学号\n");
  467.         scanf("%ld",&a);
  468.         for(i=0;i<(*n);i++)
  469.         {
  470.                 if(a==stu[i].num)
  471.                 {
  472.                   printf("学号\t\t 姓名\t"); //输出标题行中的学号、姓名
  473.                   for (j=0; j<m; j++)
  474.                    {
  475.                     printf("课程%d\t", j+1); //输出标题行中的课程名
  476.                    }
  477.                     printf("总分\t 平均分\n"); //输出标题行中的总分和平均分
  478.                         printf("%ld\t%s\t", stu[i].num, stu[i].name);
  479.             for (j=0; j<m; j++)
  480.             {
  481.                printf("%.0f\t", stu[i].score[j]);
  482.                     }
  483.             printf("%.0f\t%.0f\n", stu[i].sum, stu[i].aver);
  484.                         break;
  485.                 }
  486.                 else
  487.                         printf("未找到该学生信息\n");
  488.         }
  489.                 printf("是否删除该学生信息<y/n>\n");
  490.                 scanf("%s",&m);
  491.                 if(m=='y')
  492.                 {
  493.                     for(;i<(*n);i++)
  494.                         {
  495.                             stu[i].num=stu[i+1].num;
  496.                                 strcpy(stu[i].name, stu[i+1].name);
  497.                                 for (j=0; j<m; j++)
  498.                                 {
  499.                                      stu[i].score[j]=stu[i+1].score[j];
  500.                             }
  501.                                 stu[i].sum=stu[i+1].sum;
  502.                                 stu[i].aver=stu[i+1].aver;
  503.                         }
  504.                         printf("删除成功\n");
  505.                         (*n)--;
  506.                 }
  507.                 else
  508.                         printf("删除失败\n");
  509. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-9-14 15:51:33 | 显示全部楼层
图片发一个
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-9-14 17:48:00 | 显示全部楼层
运行图
无标题.jpg
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-26 18:30

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表