基于C语言的学生成绩管理系统

Jasmine

发布日期: 2018-10-26 10:23:25 浏览量: 2615
评分:
star star star star star star star star star_border star_border
*转载请注明来自write-bug.com

一 需求分析

假设某班有不超过40人(具体人数在程序运行时由键盘录入)参加本学期的期末考试,考试科目为语文(CN),数学(MT),英语(EN),科学(SC)。编写一个学生成绩管理系统,实现对班级学生成绩的录入、修改、查找、删除、显示、排序、统计、保存等操作的管理。

二 程序设计

2.1 功能设计

系统功能如下:

  • 录入每个同学的学号、姓名、性别和各科的考试成绩

  • 成绩修改:可以根据输入的学号修改成绩;在修改之前需要用户进一步确认,确认无误后再进行操作

  • 计算每门课程的总分和平均分

  • 计算每个学生所有课程的总分和平均分

  • 按每个学生的总分进行排序

  • 按学号排出成绩表

  • 按姓名的字典顺序排出成绩表

  • 按姓名查询学生的各科成绩、总分、平均分及在班级的排名

  • 按学号查询学生的各科成绩、总分、平均分及在班级的排名

  • 对每门课程按优(90~100)、良(80~89)、中(70~79)、及格(60~69)、不及格(0~59)统计人数,及所占的百分比

  • 输出每个学生的姓名、学号、性别、各门课程的考试成绩、总分、平均分及在班级内的排名

  • 输出班级每门课程的统计数据:包括每门课程的平均分、每门课程优、良、中、及格、不及格的人数及所占百分比

  • 将每个学生的相关信息写入文件保存

  • 从文件中读出相关信息并进行处理

  • 退出系统

2.2 系统结构

系统结构框图如下所示:

三 程序实现

3.1 主函数

主函数主要进行了登陆和选择数据读入方式的操作,其他具体操作在子函数中。

  1. /*********************************主函数*****************************************/
  2. int main()
  3. {
  4. int error;
  5. error = passWord();
  6. if(error!=3)
  7. Choice();
  8. else
  9. printf("连续三次密码错误,程序退出!!!");
  10. return 0;
  11. }

3.2 Choice()函数

选择输入函数读取数据。

  1. /**********************选择函数(选择输入函数读取数据)*************************/
  2. void Choice()//选择读取还是输入
  3. {
  4. int choice;//用来选择输入还是读取的变量
  5. int student;
  6. int subjects;
  7. char subname[8][10];
  8. int i;
  9. FILE * fp;
  10. while(1)
  11. {
  12. choice = Menu1();
  13. if(choice==2)//输入
  14. {
  15. Input();
  16. break;
  17. }
  18. else if(choice==1)//读取
  19. {
  20. char filename[20];
  21. while(1)
  22. {
  23. printf("请输入要读入的文件名:");
  24. scanf("%s",filename);
  25. if((fp = fopen(filename,"rb"))==NULL)
  26. {
  27. printf("没有此文件,请重新输入!\n");
  28. continue;
  29. }
  30. else break;
  31. }
  32. fread(&flag,sizeof(flag),1,fp);
  33. fread(&student,sizeof(student),1,fp);
  34. fread(&subjects,sizeof(subjects),1,fp);
  35. for(i=0; i<subjects; i++)
  36. {
  37. fread(&subname[i],sizeof(subname[i]),1,fp);
  38. }
  39. for(i=0; i<student; i++)
  40. {
  41. fread(&stu[i],sizeof(struct students),1,fp);
  42. }
  43. fclose(fp);
  44. Process(student,subjects,subname);
  45. break;
  46. }
  47. else
  48. {
  49. printf("您输入有误,请重新输入!\n");
  50. }
  51. }
  52. }

3.3 passWord()函数

输入密码登陆系统的函数。

  1. /******************************登陆密码函数**************************************/
  2. int passWord()//密码输入
  3. {
  4. int i,count;
  5. printf("请输入密码:(密码为student)\n");
  6. while(1)
  7. {
  8. char password[20]= {"student"},input[20];
  9. for(count=0; count<3; count++)
  10. {
  11. for(i=0; i<20; i++)
  12. {
  13. input[i] = getch();
  14. if(input[i]=='\r')
  15. {
  16. input[i]='\0';
  17. break;
  18. }
  19. printf("*");
  20. }
  21. printf("\n");
  22. if(strcmp(input,password)==0)break;
  23. else printf("密码错误\n");
  24. }
  25. break;
  26. }
  27. return count;
  28. }
  29. /********************************函数结束****************************************/

3.4 Input ()函数

从键盘输入学生数据并保存到相应的变量数组里。

  1. /******************************数据输入函数**************************************/
  2. void Input ()//数据输入
  3. {
  4. int i,j;//循环控制变量
  5. int student;//保存各班学生总人数
  6. int student_AfterMinus;
  7. int subjects;//保存科目总数
  8. char subname[8][10];//保存科目名称
  9. printf("请输入班级学生总人数:");
  10. scanf("%d",&student);
  11. student_AfterMinus = student - flag;
  12. printf("请输入科目总数:");
  13. scanf("%d",&subjects);
  14. for(i=0; i<subjects; i++)
  15. {
  16. printf("请输入第%d门科目名称:",i+1);
  17. scanf("%s",subname[i]);
  18. }
  19. for(i=0; i<student_AfterMinus; i++)
  20. {
  21. printf("请输入第%d名学生的姓名:",i+1);
  22. scanf("%s",stu[i].name);
  23. printf("请输入第%d名同学的学号:",i+1);
  24. scanf("%d",&stu[i].stu_number);
  25. printf("请输入第%d名同学的性别:",i+1);
  26. scanf("%s",stu[i].sex);
  27. stu[i].sum=0;
  28. for(j=0; j<subjects; j++)
  29. {
  30. printf("请输入%s同学的%s成绩:",stu[i].name,subname[j]);
  31. scanf("%d",&stu[i].score[j]);
  32. stu[i].sum += stu[i].score[j];
  33. }
  34. stu[i].average = stu[i].sum/subjects;
  35. }
  36. Process(student,subjects,subname);
  37. }

3.5 Process()函数

主要处理函数,按照不同的指令进行不同的操作.

  1. /********************处理函数(对应主菜单的所有操作)************************/
  2. /*****************************功能主要包括************************************/
  3. /**************************1.输出总分排序结果*********************************/
  4. /**************************2.输出学号排序结果*********************************/
  5. /**************************3.输出姓名排序结果*********************************/
  6. /**************************4.修改&删除****************************************/
  7. /**************************5.查询*********************************************/
  8. /**************************6.统计课程结果*************************************/
  9. /**************************7.将数据保存到文件*********************************/
  10. /**************************8.退出系统*****************************************/
  11. void Process(int student,int subjects,char subname[8][10])//处理函数
  12. {
  13. int student_AfterMinus = student - flag;
  14. int i,j,k;//循环控制变量
  15. float sub_sum[subjects];//各科总成绩
  16. int choice;//目录选择变量
  17. int edit_number;//修改和查找的时候输入的学号
  18. struct students *p = stu;
  19. int change;//确定是否修改的变量
  20. char name_temp[20];//通过姓名查询时用来输入姓名
  21. int qualify[subjects][5];//判断课程优良数目的数组
  22. while(1)
  23. {
  24. choice = Menu2();
  25. for(i=0; i<subjects; i++)
  26. for(j=0; j<5; j++)
  27. qualify[i][j]=0;//每次统计前清零
  28. if(choice==1)//总分排序
  29. {
  30. printf("按总分排序结果为:\n");
  31. sort1(p,student);
  32. printf("姓名\t学号\t性别\t");
  33. for(i=0; i<subjects; i++)
  34. {
  35. printf("%s\t",subname[i]);
  36. }
  37. printf("总分\t平均分");
  38. printf("\n");
  39. for(i=0; i<student - flag; i++)
  40. {
  41. printf("%s\t%d\t%s\t",stu[i].name,stu[i].stu_number,stu[i].sex);
  42. for(j=0; j<subjects; j++)
  43. {
  44. printf("%d\t",stu[i].score[j]);
  45. }
  46. printf("%5.2f\t%5.2f",stu[i].sum,stu[i].average);
  47. printf("\n");
  48. }
  49. }
  50. else if(choice==2)//学号排序
  51. {
  52. printf("按学号排序结果为:\n");
  53. sort2(p,student);
  54. printf("姓名\t学号\t性别\t");
  55. for(i=0; i<subjects; i++)
  56. {
  57. printf("%s\t",subname[i]);
  58. }
  59. printf("总分\t平均分");
  60. printf("\n");//输出表头到控制台
  61. for(i=0; i<student - flag; i++)
  62. {
  63. printf("%s\t%d\t%s\t",stu[i].name,stu[i].stu_number,stu[i].sex);
  64. for(j=0; j<subjects; j++)
  65. {
  66. printf("%d\t",stu[i].score[j]);
  67. }
  68. printf("%5.2f\t%5.2f",stu[i].sum,stu[i].average);
  69. printf("\n");
  70. }
  71. }
  72. else if(choice==3)//姓名排序
  73. {
  74. printf("按姓名排序结果为:\n");
  75. sort3(p,student);
  76. printf("姓名\t学号\t性别\t");
  77. for(i=0; i<subjects; i++)
  78. {
  79. printf("%s\t",subname[i]);
  80. }
  81. printf("总分\t平均分");
  82. printf("\n");//输出表头到控制台
  83. for(i=0; i<student - flag; i++)
  84. {
  85. printf("%s\t%d\t%s\t",stu[i].name,stu[i].stu_number,stu[i].sex);
  86. for(j=0; j<subjects; j++)
  87. {
  88. printf("%d\t",stu[i].score[j]);
  89. }
  90. printf("%5.2f\t%5.2f",stu[i].sum,stu[i].average);
  91. printf("\n");
  92. }
  93. }
  94. else if(choice==4)//输入学号进行修改
  95. {
  96. printf("请输入要修改的学生的学号:");
  97. scanf("%d",&edit_number);
  98. for(i=0; i<student_AfterMinus; i++)
  99. {
  100. if(edit_number==stu[i].stu_number)
  101. {
  102. printf("该名同学的成绩信息如下:\n");
  103. printf("姓名\t学号\t性别\t");
  104. for(j=0; j<subjects; j++)
  105. {
  106. printf("%s\t",subname[i]);
  107. }
  108. printf("总分\t平均分");
  109. printf("\n");
  110. printf("%s\t%d\t%s\t",stu[i].name,stu[i].stu_number,stu[i].sex);
  111. for(k=0; k<subjects; k++)
  112. {
  113. printf("%d\t",stu[i].score[k]);
  114. }
  115. printf("%5.2f\t%5.2f",stu[i].sum,stu[i].average);
  116. printf("\n");
  117. printf("您确定要修改该学生的成绩?(修改请输入1,删除请输入2,否请输入其他数字):");
  118. scanf("%d",&change);
  119. if(change==1)
  120. {
  121. for(i=0; i<student_AfterMinus; i++)
  122. {
  123. if(edit_number==stu[i].stu_number)
  124. {
  125. stu[i].sum=0;
  126. for(j=0; j<subjects; j++)
  127. {
  128. printf("请输入第%s同学的%s成绩:",stu[i].name,subname[j]);
  129. scanf("%d",&stu[i].score[j]);
  130. stu[i].sum += stu[i].score[j];
  131. }
  132. stu[i].average = stu[i].sum/subjects;
  133. }
  134. }
  135. }
  136. else if(change==2)
  137. {
  138. flag++;
  139. for(i=0; i<student_AfterMinus; i++)
  140. {
  141. if(edit_number==stu[i].stu_number)
  142. {
  143. for(j=0; j<20; j++)
  144. stu[i].name[j] = 'z';
  145. stu[i].stu_number = 999999;
  146. stu[i].sum = -1;
  147. sort1(p,student);
  148. }
  149. }
  150. }
  151. else
  152. continue;
  153. }
  154. else
  155. {
  156. printf("学生不存在!\n");
  157. break;
  158. }
  159. }
  160. }
  161. else if(choice==5)//查询
  162. {
  163. choice=Menu3();
  164. if(choice==1)
  165. {
  166. printf("请输入要查找的学生学号:");
  167. scanf("%d",&edit_number);
  168. for(i=0; i<student_AfterMinus; i++)
  169. {
  170. if(edit_number==stu[i].stu_number)
  171. {
  172. printf("该名同学的成绩信息如下:\n");
  173. printf("姓名\t学号\t性别\t");
  174. for(j=0; j<subjects; j++)
  175. {
  176. printf("%s\t",subname[i]);
  177. }
  178. printf("总分\t平均分");
  179. printf("\n");
  180. printf("%s\t%d\t%s\t",stu[i].name,stu[i].stu_number,stu[i].sex);
  181. for(k=0; k<subjects; k++)
  182. {
  183. printf("%d\t",stu[i].score[k]);
  184. }
  185. printf("%5.2f\t%5.2f",stu[i].sum,stu[i].average);
  186. printf("\n");
  187. }
  188. }
  189. }
  190. else if(choice==2)
  191. {
  192. printf("请输入要查找的学生姓名:");
  193. scanf("%s",name_temp);
  194. for(i=0; i<student_AfterMinus; i++)
  195. {
  196. if(strcmp(name_temp,stu[i].name)==0)
  197. {
  198. printf("该名同学的成绩信息如下:\n");
  199. printf("姓名\t学号\t性别\t");
  200. for(j=0; j<subjects; j++)
  201. {
  202. printf("%s\t",subname[i]);
  203. }
  204. printf("总分\t平均分");
  205. printf("\n");
  206. printf("%s\t%d\t%s\t",stu[i].name,stu[i].stu_number,stu[i].sex);
  207. for(k=0; k<subjects; k++)
  208. {
  209. printf("%d\t",stu[i].score[k]);
  210. }
  211. printf("%5.2f\t%5.2f",stu[i].sum,stu[i].average);
  212. printf("\n");
  213. }
  214. }
  215. }
  216. }
  217. else if(choice==6)//课程数据统计
  218. {
  219. for(i=0; i<subjects; i++)
  220. {
  221. sub_sum[i]=0;
  222. for(j=0; j<student_AfterMinus; j++)
  223. {
  224. sub_sum[i] += stu[j].score[i];
  225. if(stu[j].score[i]/10>=9&&stu[j].score[i]/10<=10)
  226. qualify[i][0]++;
  227. else if(stu[j].score[i]/10<6)
  228. qualify[i][4]++;
  229. else
  230. qualify[i][9-(stu[j].score[i]/10)]++;
  231. }
  232. }
  233. printf("课程信息统计如下:\n");
  234. for(i=0; i<subjects; i++)
  235. {
  236. printf("\t%s\t",subname[i]);
  237. }
  238. printf("\n");
  239. printf("优");
  240. for(i=0; i<subjects; i++)
  241. {
  242. printf("\t%d(%4.2f%%)",qualify[i][0],((float)qualify[i][0]/student_AfterMinus)*100);
  243. }
  244. printf("\n");
  245. printf("良");
  246. for(i=0; i<subjects; i++)
  247. {
  248. printf("\t%d(%4.2f%%)",qualify[i][1],((float)qualify[i][1]/student_AfterMinus)*100);
  249. }
  250. printf("\n");
  251. printf("中");
  252. for(i=0; i<subjects; i++)
  253. {
  254. printf("\t%d(%4.2f%%)",qualify[i][2],((float)qualify[i][2]/student_AfterMinus)*100);
  255. }
  256. printf("\n");
  257. printf("及格");
  258. for(i=0; i<subjects; i++)
  259. {
  260. printf("\t%d(%4.2f%%)",qualify[i][3],((float)qualify[i][3]/student_AfterMinus)*100);
  261. }
  262. printf("\n");
  263. printf("不及格");
  264. for(i=0; i<subjects; i++)
  265. {
  266. printf("\t%d(%4.2f%%)",qualify[i][4],((float)qualify[i][4]/student_AfterMinus)*100);
  267. }
  268. printf("\n");
  269. printf("总分");
  270. for(i=0; i<subjects; i++)
  271. {
  272. printf("\t%5.2f\t",sub_sum[i]);
  273. }
  274. printf("\n");
  275. printf("平均分");
  276. for(i=0; i<subjects; i++)
  277. {
  278. printf("\t%5.2f\t",sub_sum[i]/student_AfterMinus);
  279. }
  280. printf("\n");
  281. }
  282. else if(choice==7)//保存到文件
  283. {
  284. FILE * fp;
  285. char filename[20];
  286. printf("请输入要输出的文件名:");
  287. scanf("%s",filename);
  288. fp = fopen(filename,"wb+");
  289. fwrite(&flag,sizeof(flag),1,fp);
  290. fwrite(&student,sizeof(student),1,fp);
  291. fwrite(&subjects,sizeof(subjects),1,fp);
  292. for(i=0; i<subjects; i++)
  293. {
  294. fwrite(&subname[i],sizeof(subname[i]),1,fp);
  295. }
  296. for(i=0; i<student; i++)
  297. {
  298. fwrite(&stu[i],sizeof(struct students),1,fp);
  299. }
  300. fclose(fp);
  301. }
  302. else if(choice==8)//退出系统
  303. {
  304. break;
  305. }
  306. else//指令输入错误时的提示
  307. printf("您输入有误,请重新输入!\n");
  308. }
  309. }

3.6 sort1,sort2,sort3函数

排序函数的子函数,分别是按照总分,学号,姓名进行排序。

  1. /*****************************按总分进行排序*************************************/
  2. void sort1(struct students stu[],int n)//总分排序
  3. {
  4. int i,j;//循环控制变量
  5. struct students stu_temp;//排序时交换的临时结构体变量
  6. for(i=0; i<n; i++)
  7. {
  8. for(j=0; j<n; j++)
  9. {
  10. if(stu[i].sum>stu[j].sum)
  11. {
  12. stu_temp = stu[j];
  13. stu[j]=stu[i];
  14. stu[i] = stu_temp;
  15. }
  16. }
  17. }
  18. }
  19. /******************************总分排序结束**************************************/
  20. /*****************************按学号进行排序*************************************/
  21. void sort2(struct students stu[],int n)//学号排序
  22. {
  23. int i,j;//循环控制变量
  24. struct students stu_temp;//排序时交换的临时结构体变量
  25. for(i=0; i<n; i++)
  26. {
  27. for(j=0; j<n; j++)
  28. {
  29. if(stu[i].stu_number<stu[j].stu_number)
  30. {
  31. stu_temp = stu[j];
  32. stu[j]=stu[i];
  33. stu[i] = stu_temp;
  34. }
  35. }
  36. }
  37. }
  38. /******************************学号排序结束**************************************/
  39. /*****************************按姓名进行排序*************************************/
  40. void sort3(struct students stu[],int n)//姓名排序
  41. {
  42. int i,j;//循环控制变量
  43. struct students stu_temp;//排序时交换的临时结构体变量
  44. for(i=0; i<n; i++)
  45. {
  46. for(j=0; j<n; j++)
  47. {
  48. if(strcmp(stu[i].name,stu[j].name)<0)
  49. {
  50. stu_temp = stu[j];
  51. stu[j]=stu[i];
  52. stu[i] = stu_temp;
  53. }
  54. }
  55. }
  56. }

3.7 Menu1,Menu2,Menu3函数

为用户呈现选择界面的函数。

  1. /*****************选择菜单,用来选择输入还是读取数据****************************/
  2. int Menu1()//选择菜单
  3. {
  4. int choice;//选择用的变量
  5. printf("****************************************************************\n");
  6. printf("****************************欢迎使用****************************\n");
  7. printf("***********************学生成绩管理系统*************************\n");
  8. printf("****************************************************************\n");
  9. printf("\n");
  10. printf("**********************请选择您要进行的操作**********************\n");
  11. printf("\t\t\t1.打开已有数据\n");
  12. printf("\t\t\t2.输入新的数据\n");
  13. printf("****************************************************************\n");
  14. printf("\n");
  15. scanf("%d",&choice);
  16. return choice;
  17. }
  18. /********************************菜单结束****************************************/
  19. /*********************主菜单,用来选择要进行的操作******************************/
  20. int Menu2()//主菜单
  21. {
  22. int choice;//选择用的变量
  23. printf("****************************************************************\n");
  24. printf("**********************请选择您要进行的操作**********************\n");
  25. printf("\t\t\t1.按总分进行排序\n");
  26. printf("\t\t\t2.按学号进行排序\n");
  27. printf("\t\t\t3.按姓名进行排序\n");
  28. printf("\t\t\t4.成绩修改&删除\n");
  29. printf("\t\t\t5.查询\n");
  30. printf("\t\t\t6.课程数据统计\n");
  31. printf("\t\t\t7.保存\n");
  32. printf("\t\t\t8.退出系统\n");
  33. printf("****************************************************************\n");
  34. printf("****************************************************************\n");
  35. scanf("%d",&choice);
  36. printf("\n");
  37. return choice;
  38. }
  39. /********************************菜单结束****************************************/
  40. /**********************查询时用来选择查询方式的菜单*****************************/
  41. int Menu3()//查询菜单
  42. {
  43. int choice;
  44. printf("****************************************************************\n");
  45. printf("**********************请选择您要进行的操作**********************\n");
  46. printf("\t\t\t1.按学号进行查询\n");
  47. printf("\t\t\t2.按姓名进行查询\n");
  48. printf("****************************************************************\n");
  49. scanf("%d",&choice);
  50. return choice;
  51. }

四 测试运行

程序界面如下图所示:

上传的附件 cloud_download 基于C语言的学生成绩管理系统.zip ( 73.92kb, 132次下载 )
error_outline 下载需要9点积分

发送私信

当你成功时,谁还在乎你的过去

11
文章数
13
评论数
最近文章
eject