学生成绩管理系统(C语言版)

谁践踏了优雅 2023-01-01 08:56 298阅读 0赞

C语言版学生成绩管理系统

教材里的,要提交实验报告,能实现以下功能。
在这里插入图片描述

  1. #include "stdio.h"
  2. #include "stdlib.h"
  3. #include "string.h"
  4. #define MAX_LRN 10
  5. #define STU_NUM 30
  6. #define COURSE_NUM 6
  7. typedef struct student
  8. {
  9. long num;
  10. char name[MAX_LRN];
  11. float score[COURSE_NUM];
  12. float sum;
  13. float aver;
  14. }STU;
  15. int Menu(void);
  16. void ReadScore(STU stu[],int n,int m);
  17. void AverSumofEveryStudent(STU stu[],int n ,int m);
  18. void AverSumofEveryCourse(STU stu[],int n ,int m);
  19. void SortbyScore(STU stu[],int n ,int m,int(*compare)(float a,float b));
  20. int Ascending(float a,float b);
  21. int Descending(float a,float b);
  22. void SwapFloat(float *x,float *y);
  23. void SwapLong (long*x,long*y);
  24. void SwapChar(char x[],char y[]);
  25. void AsSortbyNum(STU stu[],int n,int m);
  26. void SortbyName(STU stu[],int n,int m);
  27. void SearchbyNum(STU stu[],int n,int m);
  28. void SearchbyName(STU stu[],int n,int m);
  29. void StatisticAnalysis(STU stu[],int n,int m);
  30. void PrintScore(STU stu[],int n,int m);
  31. void WritetoFile(STU record[],int n,int m);
  32. void ReadfromFile(STU record[],int *n,int *m);
  33. int main(void)
  34. {
  35. char ch;
  36. int n = 0,m = 0;
  37. STU stu[STU_NUM];
  38. printf("Input student number(n<%d):",STU_NUM);
  39. scanf("%d",&n);
  40. printf("Input course number(m<=%d):",COURSE_NUM);
  41. scanf("%d",&m);
  42. while(1)
  43. {
  44. ch = Menu();
  45. switch(ch)
  46. {
  47. case 1:ReadScore(stu, n ,m);
  48. break;
  49. case 2:AverSumofEveryCourse(stu,n,m);
  50. break;
  51. case 3:AverSumofEveryStudent(stu,n,m);
  52. break;
  53. case 4:SortbyScore(stu,n,m,Descending);
  54. printf("\nSort in descending order by score:\n");
  55. PrintScore(stu,n,m);
  56. break;
  57. case 5:SortbyScore(stu,n,m,Ascending);
  58. printf("\nSort in ascending order by score:\n");
  59. PrintScore(stu,n,m);
  60. break;
  61. case 6:AsSortbyNum(stu,n,m);
  62. printf("\nSort in ascending order by number:\n");
  63. PrintScore(stu,n,m);
  64. break;
  65. case 7:SortbyName(stu,n,m);
  66. printf("\nSort in dictionary order by name:\n");
  67. PrintScore(stu,n,m);
  68. break;
  69. case 8:SearchbyNum (stu,n,m);
  70. break;
  71. case 9:SearchbyName(stu,n,m);
  72. break;
  73. case 10:StatisticAnalysis(stu,n,m);
  74. break;
  75. case 11:PrintScore(stu,n,m);
  76. break;
  77. case 12:WritetoFile(stu,n,m);
  78. break;
  79. case 13:ReadfromFile(stu,&n,&m);
  80. break;
  81. case 0:printf("End of program!");
  82. exit (0);
  83. default:printf("Input error!");
  84. }
  85. }
  86. return 0;
  87. }
  88. //函数功能:显示菜单并获得用户键盘输入的选项
  89. int Menu(void)
  90. {
  91. int itemSelected;
  92. printf("Management for Students'scores\n");
  93. printf("1.Input record\n");
  94. printf("2.Calculate total and average score of every course\n");
  95. printf("3.Calculate total and average score of every student\n");
  96. printf("4.Sort in descending order by score\n");
  97. printf("5.Sort in ascending order by score\n");
  98. printf("6.Sort in ascending order by number\n");
  99. printf("7.Sort in dictionary order by name\n");
  100. printf("8.Search by number\n");
  101. printf("9.Search by name\n");
  102. printf("10.Statistic analysis\n");
  103. printf("11.List record\n");
  104. printf("12.Write to a file\n");
  105. printf("13.Read from a file\n");
  106. printf("0.Exit\n");
  107. printf("Please Input your choice:");
  108. scanf("%d",&itemSelected); //读入用户输入
  109. return itemSelected;
  110. }
  111. //函数功能:输入n个学生m门课成绩
  112. void ReadScore (STU stu[],int n,int m)
  113. {
  114. int i,j;
  115. printf("Input student's ID,name and score:\n");
  116. for(i=0;i<n;i++)
  117. {
  118. scanf("%ld%s",&stu[i].num,stu[i].name);
  119. for(j=0;j<m;j++)
  120. {
  121. scanf("%f",&stu[i].score[j]);
  122. }
  123. }
  124. }
  125. //函数功能:计算每个学生各门课程的总分和平均分
  126. void AverSumofEveryStudent(STU stu[],int n ,int m)
  127. {
  128. int i,j;
  129. for(i=0;i<n;i++)
  130. {
  131. stu[i].sum = 0 ;
  132. for(j=0;j<m;j++)
  133. {
  134. stu[i].sum = stu[i].sum+stu[i].score[j];
  135. }
  136. stu[i].aver=m>0?stu[i].sum/m : -1;
  137. printf("student %d:sum = %.0f,aver = %.0f\n",
  138. i+1,stu[i].sum,stu[i].aver );
  139. }
  140. }
  141. //函数功能:计算每门课程的总分和平均分
  142. void AverSumofEveryCourse(STU stu[],int n,int m)
  143. {
  144. int i,j;
  145. float sum[COURSE_NUM],aver[COURSE_NUM];
  146. for(j=0;j<m;j++)
  147. {
  148. sum[j]=0;
  149. for (i=0;i<n;i++)
  150. {
  151. sum[j]=sum[j]+stu[i].score[j];
  152. }
  153. aver[j] =n>0? sum[j]/n:-1;
  154. printf("course %d:sum=%.0f,aver=%.0f\n",j+1,sum[j],aver[j]);
  155. }
  156. }
  157. //函数功能:按选择法将数组sum的元素值排序
  158. void SortbyScore(STU stu[],int n ,int m,int(* compare)(float a,float b))
  159. {
  160. int i,j,k,t;
  161. for(i=0;i<n-1;i++)
  162. {
  163. k=i;
  164. for (j=i+1;j<n;j++)
  165. {
  166. if((* compare)(stu[j].sum,stu[k].sum))k=j;
  167. }
  168. if(k!=i)
  169. {
  170. for (t=0;t<m;t++) //交换m门课程的成绩
  171. {
  172. SwapFloat(&stu[k].score[t],&stu[i].score[t]);
  173. }
  174. SwapFloat(&stu[k].sum,&stu[i].sum); //交换总分
  175. SwapFloat(&stu[k].aver,&stu[i].aver); //交换平均分
  176. SwapLong(&stu[k].num,&stu[i].num); //交换学号
  177. SwapChar(stu[k].name,stu[i].name); //交换姓名
  178. }
  179. }
  180. }
  181. //使数据按升序排序
  182. int Ascending(float a,float b)
  183. {
  184. return a<b; //这样比较决定了按升序排列,如果a<b,则交换
  185. }
  186. //使数据按降序排序
  187. int Descending(float a,float b)
  188. {
  189. return a>b; //这样比较决定了按降序排列,如果a>b,则交换
  190. }
  191. //交换两个单精度浮点型数据
  192. void SwapFloat(float *x,float *y)
  193. {
  194. float temp;
  195. temp = *x;
  196. *x = *y;
  197. *y =temp;
  198. }
  199. //交换两个长整型数据
  200. void SwapLong(long *x, long *y)
  201. {
  202. long temp;
  203. temp = *x;
  204. *x = *y;
  205. *y=temp;
  206. }
  207. //交换两个字符串
  208. void SwapChar(char x[],char y[])
  209. {
  210. char temp[MAX_LRN];
  211. strcpy(temp,x);
  212. strcpy(x,y);
  213. strcpy(y,temp);
  214. }
  215. //函数功能:按选择法将数组NUM的元素值按从低到高排序
  216. void AsSortbyNum(STU stu[],int n,int m)
  217. {
  218. int i,j,k,t;
  219. for(i=0;i<n-1;i++)
  220. {
  221. k=i;
  222. for (j=i+1;j<n;j++)
  223. {
  224. if(stu[j].num<stu[k].num) k=j;
  225. }
  226. if(k!=i)
  227. {
  228. for(t=0;t<m;t++) //交换m门课程的成绩
  229. {
  230. SwapFloat(&stu[k].score[t],&stu[i].score[t]);
  231. }
  232. SwapFloat(&stu[k].sum,&stu[i].sum); //交换总分
  233. SwapFloat(&stu[k].aver,&stu[i].aver); //交换平均分
  234. SwapLong(&stu[k].num,&stu[i].num); //交换学号
  235. SwapChar(stu[k].name,stu[i].name); //交换姓名
  236. }
  237. }
  238. }
  239. //函数功能:交换法实现字符串按字典顺序排序
  240. void SortbyName(STU stu[],int n,int m)
  241. {
  242. int i,j,t;
  243. for (i=0;i<n-1;i++)
  244. {
  245. for(j=i+1;j<n;j++)
  246. {
  247. if(strcmp (stu[j].name,stu[i].name)<0)
  248. {
  249. for (t=0;t<m;t++) //交换m门课程的成绩
  250. {
  251. SwapFloat(&stu[i].score[t],&stu[j].score[t]);
  252. }
  253. SwapFloat(&stu[i].sum,&stu[j].sum); //交换总分
  254. SwapFloat(&stu[i].aver,&stu[j].aver); //交换平均分
  255. SwapLong(&stu[i].num,&stu[j].num); //交换学号
  256. SwapChar(stu[i].name,stu[j].name); //交换姓名
  257. }
  258. }
  259. }
  260. }
  261. //函数功能:按学号查找学生成绩并显示查找结果
  262. void SearchbyNum(STU stu[],int n,int m)
  263. {
  264. long number;
  265. int i,j;
  266. printf("Input the number you want to search:");
  267. scanf("%ld",&number);
  268. for(i=0;i<n;i++)
  269. {
  270. if(stu[i].num == number)
  271. {
  272. printf("%ld\t%s\t",stu[i].num,stu[i].name);
  273. for (j=0;j<m;j++)
  274. {
  275. printf("%.0f\t",stu[i].score[j]);
  276. }
  277. printf("%.0f\t%.0f\n",stu[i].sum,stu[i].aver);
  278. return;
  279. }
  280. }
  281. printf("\nNot founf!\n");
  282. }
  283. //函数功能:按姓名的字典顺序排出成绩表
  284. void SearchbyName(STU stu[],int n,int m)
  285. {
  286. char x[MAX_LRN];
  287. int i,j;
  288. printf("Input the name you want to search:");
  289. scanf("%s",x);
  290. for (i=0;i<n;i++)
  291. {
  292. if(strcmp(stu[i].name,x) == 0)
  293. {
  294. printf("%ld\t%s\t",stu[i].num,stu[i].name);
  295. for(j=0;j<m;j++)
  296. {
  297. printf("%.0f\t",stu[i].score[j]);
  298. }
  299. printf("%.0f\t%.0f\n",stu[i].sum,stu[i].aver);
  300. return;
  301. }
  302. }
  303. printf("\nNot found!\n");
  304. }
  305. //函数功能:统计各分数段的学生人数及所占的百分比
  306. void StatisticAnalysis(STU stu[],int n,int m)
  307. {
  308. int i,j,t[6];
  309. for(j=0;j<m;j++)
  310. {
  311. printf("For course %d:\n",j+1);
  312. memset(t,0,sizeof(t));
  313. for(i=0;i<n;i++)
  314. {
  315. if (stu[i].score[j]>=0 && stu[i].score[j]<60) t[0]++;
  316. else if(stu[i].score[j]<70) t[1]++;
  317. else if(stu[i].score[j]<80) t[2]++;
  318. else if(stu[i].score[j]<90) t[3]++;
  319. else if(stu[i].score[j]<100) t[4]++;
  320. else if(stu[i].score[j]==100) t[5]++;
  321. }
  322. for(i=0;i<=5;i++)
  323. {
  324. if(i==0)printf("<60\t%d\t%.2f%% \n",t[i],(float)t[i]/n*100);
  325. else if(i==5)printf("%d\t%d\t%.2f%% \n",
  326. (i+5)*10,t[i],(float)t[i]/n*100);
  327. else printf("%d-%d\t%d\t%.2f%%\n",(i+5)*10,(i+5)*10+9,
  328. t[i],(float)t[i]/n*100);
  329. }
  330. }
  331. }
  332. //函数功能:打印学生成绩
  333. void PrintScore(STU stu[],int n,int m )
  334. {
  335. int i,j;
  336. for(i=0;i<n;i++)
  337. {
  338. printf("%ld\t%s\t",stu[i].num,stu[i].name);
  339. for (j=0;j<m;j++)
  340. {
  341. printf("%.0f\t",stu[i].score[j]);
  342. }
  343. printf("%.0f\t%0f\n",stu[i].sum,stu[i].aver);
  344. }
  345. }
  346. //输入n个学生的学号、姓名及m门课程的成绩到文件 student。txt中
  347. void WritetoFile(STU stu[],int n,int m)
  348. {
  349. FILE *fp;
  350. int i,j;
  351. if((fp=fopen("student.txt","w")) ==NULL)
  352. {
  353. printf("Failure to open score.txt!\n");
  354. exit(0);
  355. }
  356. fprintf(fp,"%d\t%d\n",n,m);
  357. for (i=0;i<n;i++)
  358. {
  359. fprintf(fp,"%10ld%10s",stu[i].num,stu[i].name);
  360. for (j=0;j<m;j++)
  361. {
  362. fprintf(fp,"%10.0f",stu[i].score[j]);
  363. }
  364. fprintf(fp,"%10.0f%10.0f\n",stu[i].sum,stu[i].aver);
  365. }
  366. fclose(fp);
  367. }
  368. //从文件中读取学生的学号、姓名及成绩等信息写入到结构体数组stu中
  369. void ReadfromFile(STU stu[],int *n,int *m)
  370. {
  371. FILE *fp;
  372. int i,j;
  373. if((fp = fopen("student.txt","r")) == NULL)
  374. {
  375. printf("Failure to open score.txt!\n");
  376. exit(0);
  377. }
  378. fscanf(fp,"%d\t%d",n,m); //从文件中读出学生人数和课程门数
  379. for (i=0;i<*n;i++) //学生人数保存在n指向的存储单元
  380. {
  381. fscanf(fp,"%10ld",&stu[i].num);
  382. fscanf(fp,"%10s",stu[i].name);
  383. for (j=0;j<*m;j++) //课程门数保存在m指向的存储单元
  384. {
  385. fscanf(fp,"%10f",&stu[i].score[j]);
  386. }
  387. fscanf(fp,"%10f%10f",&stu[i].sum,&stu[i].aver);
  388. }
  389. fclose(fp);
  390. }

发表评论

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

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

相关阅读

    相关 C语言 学生成绩管理系统

    任务描述 设计一个学生成绩管理系统,实现对学生成绩的动态管理,实现对学生成绩的输入,显示,删除,查找,插入,最佳,保存,计算,排序等主要功能。 功能要求 1、每一条