当前位置:   article > 正文

档案管理系统源码_学生成绩管理系统实验报告(新鲜出炉)

档案信息管理系统实验

C语言课程设计报告

源码下载方式

关注微信公众号 跨时代的jay

回复 学生成绩管理系统

为大家提供一些帮助!

获取链接后复制到浏览器即可下载

课题题目: 学生信息管理系统

班 级: 信卓11801

姓 名: 聂健

班级序号: 09

同组成员: 无

完成时间: 2019 年 12 月 11 日

目录

一.题目

二.设计目的

三.总体设计

四.详细设计

五.调试与测试:

六.课程设计心得及体会

七.程序清单

一.题目:学生信息管理系统

要求:从文件中读取原始数据,并将修改后的数据保存在一个新的文件当中。

功能:

    1. 浏览所有学生的所有信息
    2. 用姓名和学号查询学生的信息
    3. 用姓名和学号修改学生的信息
    4. 用姓名和学号删除学生
    5. 统计各个课程分数段的人数
    6. 统计总分和各个课程的最高分、最低分以及对应的姓名


二.设计目的

如今学校的学生越来越多,成绩管理的工作量越来越大,手工管理成绩的弊端也越来越明显。随着科学技术的不断提高,计算机科学日渐成熟,它已进入人类社会的各个领域并发挥着越来越重要的作用。作为计算机应用的一部分,使用计算机对学生档案信息进行管理,具有手工管理所无法比拟的优点。所以我想借本次课程设计之际,设计一个简易的学生成绩管理系统。

掌握: 1.掌握动态创建链表,并实现对数据的删除,检索,修改。

  1. 增强工程化意识,提高c语言实践能力。

三.总体设计

d2f8a9200072fa10ec0db88059cf9dc7.png

d8f1e66d35d4ec731f5f0b4dbbd36a8b.png

(1)程序源文件分为:

1.student.h 包含所有的头文件以及定义

2.function.cpp 实现各个函数的功能

3.main.cpp 主函数

4.data.txt 学生原始数据

(2)主函数实现菜单的选择:使用swicth语句实现菜单的选择

1.浏览学生信息

2.查询学生信息

3.修改学生信息

4.删除学生信息

5.各科成绩

6.最高分最低分以及对应的姓名

(3)函数包括:

1.struct student * create() //用动态链表建立基础的学生信息库 从文件中将学生信息读取出来

2.void sort(struct student *head) //排序

3.void locatename(struct student *head) //通过姓名查询信息

4.void locatenum(struct student *head) //通过学号查询信息

5.struct student * delname(struct student *head) //通过姓名删除学生信息

6.struct student * delnum(struct student *head) //通过学号删除学生信息

7.void changename(struct student *head) //通过姓名去修改学生数据

8.void changenum(struct student *head) //通过学号去修改学生数据

9.void filein(struct student *head) //保存到文件中

10.void print(struct student *head) //打印所有学生信息

11.void ABCD(struct student *head) //统计各分段的人数

12.void max(struct student * head) //总分以及各个课程的最高分,最低分以及对应的姓名

对于创建链表和删除学生这两个函数需要返回head

创建链表时返回head:

其他函数中都传入了一个参数head

那么都可以访问到链表中的所有数据

删除学生返回head:

当删除第一个学生时,即把头给删了

这时需要换头 head = delname(head); head= delnum(head);

其它函数使用void类型即可

四.详细设计

使用结构体链表实现上述要求,在头文件中定义结构体,分为数据域和指针域。首先创建一个动态链表,将文件中的原始数据保存在链表中,指针域将链表链接起来。

a94ae70415cfd0598744531b563f8bfd.png

实现整个系统:菜单调用函数

  1. <0> filein(head); //将修改后的信息保存在新的文件中 data11.txt
  2. <1> print(head); //打印所有学生的所有信息 实现菜单1的功能
  3. <2> locatename(head) //通过姓名查询单个学生的所有信息 实现菜单2的姓名查询功能
  4. locatenum(head) //通过学号查询单个学生的所有信息 实现菜单2的学号查询功能
  5. <3> changename(head); //通过姓名修改学生的信息 实现菜单3的姓名查询功能
  6. changenum(head); //通过学号修改学生的功能 实现菜单3的学号查询功能
  7. <4> head= delname(head); //通过姓名删除学生数据 实现菜单4的姓名删除功能
  8. head= delnum(head); //通过学号删除学生数据 实现菜单4的学号删除功能
  9. //如果删除的是头 这时头换了 p = head; head = p->next;
  10. <5> ABCD(head); //统计各个分数段的人数 并将运行结果写进一个新的文件 abcd.txt
  11. <6> max(head); //输出总分和各个课程的最高分和最低分的相关信息

各个函数的实现过程:

1.动态创建链表

  1. //动态创建链表的过程
  2. struct student *p,*q,*head;
  3. p = q = (struct student *)malloc(sizeof(struct student));//开辟空间
  4. head = p;
  5. while(p!=NULL)
  6. {
  7. q = (struct student *)malloc(sizeof(struct student));
  8. p->next = q;
  9. p = q;
  10. }
  11. p->next = NULL;return head;//在while中将数据域加入即可

核心部分即为:链表连接过程使用while循环,使用feof判断有没有到达文件的最后一行。

ad56b5e17d56abda785cc760f9800358.png

创建链表流程图

对于从文件中读取数据,核心部分是不变的。但是需要注意的是,由于文件中第一行是字符串,所以需要使用fgets读取第一行数据。从第二行开始将数据依次保存在里链表中。

从文件中将数据赋值给变量,使用fscanf。

读取完毕后,fclose关闭文件。

2.排序

为什么要将排序单独写成一个函数?

当老师问我这个问题时,我是这样回答的。因为在后面的功能中有删除以及修改学生的数据,我只要调用一下函数,即可实现排序的实时更新。

使用擂台法进行排序。

3.查询信息

  1. 通过姓名
  2. 通过学号

姓名匹配需要调用一个函数 strcmp(A,B);

当两字符串完全相同时,函数返回0。

当为整形时,只许判断 if(A == B)即可。

f53c31bf52d08d831719d765d38c445d.png

(查询学生信息流程图)

4.修改学生信息

对于修改学生数据,与查询是差不多的流程。当匹配到了学生后,重新赋值就可以了。

  1. scanf("%f",&p->s1);
  2. scanf("%f",&p->s2);
  3. scanf("%f",&p->s3);

此时,重新调用一下排序函数,sort(head);即可实现数据的实时更新。

5.删除学生

  1. struct student *p , *q;
  2. p = head;
  3. while( p不匹配 && p->next!=NULL)
  4. {
  5. q = p;
  6. p = p->next;
  7. }//一旦匹配,跳出while
  8. if(匹配)
  9. {
  10. if( p == head ) //如果是头匹配
  11. {
  12. head = p->next;//换头,此过程就把头也删了
  13. }
  14. else
  15. {
  16. q->next = p->next;
  17. }
  18. }if(不匹配)
  19. {
  20. NONE
  21. }
  22. return head;//当删除了头时,把新的头返回

048b9b8146139cfa860b7a6c2f775096.png

删除学生流程图

6.输出所有学生的所有数据

print(head);

将链表中的头找到,即可找到访问所有人的所有数据

  1. p = head;
  2. while(p)
  3. {
  4. printf( "%ldt%st%.2ft%.2ft%.2ft%.2ft%3dn",p->num,p->name , p->s1 , p->s2 , p->s3 , p->sum , p->rank );
  5. p = p->next;

7.统计各分数段的人数

c140198badc0be199132df66d2701063.png

统计各个等级的人数流程图

遍历链表,对数据域进行判断

设置12个变量,初始化为1

将90-100设为等级A,将80-89设置为B,将60-79设置为C将<60设置为D。

每次判断,在相应的位置就+1,最终算出人数,以一个表格的形式展现,并定义文件指针,将结果写进一个新的文件当中。

  1. 统计总分和各科的最高分,最低分,以及相应的姓名

使用擂台法进行比较

  1. while(p!=NULL)
  2. {
  3. if(p->sum > summax->sum)
  4. {
  5. summax = p;
  6. }
  7. p = p->next;
  8. }

总分与各科的方法是一样的

当找到了这个节点,就可以找到对应的姓名。

五.调试与测试

在这个过程中出现了许许多多的问题,在不断的调试中,将bug不断地修复。开始有删除头删不掉的情况,打印的时候排名有问题,最终形成了第三个版本的此系统。

一般情况下我是首先去测试一下代码,看看所有的功能是否都能正常使用。如果出现逻辑上的问题,会debug寻找错误的原因,并去解决bug。一个常见的方法就是合理的使用printf。

比如之前我就遇到了一个问题。

19198ab7465404c1333c0c1acf91dcb4.png

当时在if语句中是这么写的,if(answer == 1),运行就出问题。我要查询的是姓名查询,但是按了1后没有反应。然而说明在哪里出现了问题。于是我用printf测试。

到底有没有进入到locatename(head)这个函数。

0646c3303ac09b3e8c496ec93c812808.png

883fab1946b1b4d6abb48af93ff27dc4.png

再次运行时,没有出现???,于是判定是在if语句中出现问题,根本没有进入。最后排查得出,由于定义char类型 ,必须使用字符,用‘1’表示。

系统测试:

功能1:打印所有学生的所有信息

4d29a4f5320aad4b35fa7f7fddf67043.png

功能2:用学号和姓名查询学生的信息

f9f0bc30cc2abe3e3f9f557f17d204cf.png

功能3:修改学生的成绩:完成总分和排名的实时更新

3a32963cb8c0846a39edecffeeb11446.png

功能4:删除学生

d365376f32d7274b7bc83b0c657ae279.png

我们回到功能1,测试一下曹操有没有被删掉

e568df0394e8f3dca42764df1e35631c.png

可以看到,曹操已经被删除。

功能5:各科成绩分析

45424fdf5d8fa277130cfba140d52215.png

由于删掉一人,因此总人数29人。

功能6:总分以及各个课程的最高分最低分以及对应的姓名。

6e83968cda9a3ffa6d8559b30a181983.png

再来测试一下:假如我修改了张三的成绩为3个100

3c358c13f11c26a0e14c338573b1a069.png

再来看看6的功能

205d3bff7d785d414ed5defe24bd7647.png

测试成功!

六.课程设计心得与体会

通过此次课程设计,使我更加扎实的掌握了有关链表和结构体方面的知识,在设计过程中,中虽然遇到了一些问题,但经过一次又一次的思考,一遍又一遍的检查终于找出了原因。所在,也暴露出了前期我在这方面的知识欠缺和经验不足。实践出真知,通过亲自动手制作,使我们掌握的知识不再是纸上谈兵。这次课程设计终于顺利完成了,在设计中遇到了很多问题,最后在老师的指导下,终于游逆而解。在今后社会的发展和学习实践过程中,一定要不懈努力,不能遇到问题就想到要退缩,一定要不厌其烦的发现问题所在,然后一一进行解决,只有这样,才能成功的做成想做的事,才能在今后的道路上劈荆斩棘,而不是知难而退,那样永远不可能收课程设计诚然是一门专业课,给我很多专业知识以及专业技能上的提升,同时又是一门讲道课,一门辩思课,给了我许多道,给了我很多思,给了我莫大的空间。同时,设计让我感触很深。使我对抽象的理论有了具体的认识。通过这次课程设计,我对建立一个工程有了一个新的认识,首先是想清楚这个系统的流程,将框架搭建起来后,再起写一些细节方面的东西,千万不能稀里糊涂的写,到最后没有用处,白白浪费时间。

我认为此次课设不仅培养了独立思考、动手操作的能力,在各种其它能力上也都有了提高。同时也希望今后能够多花时间去思考,去动手写一些代码。

七.程序清单

student.h

  1. /*
  2. 头文件
  3. */
  4. #include<stdio.h>
  5. #include<stdlib.h>
  6. #include<string.h>
  7. #include<malloc.h>
  8. #include<math.h>
  9. #include<conio.h
  10. #define LEN sizeof(struct student)
  11. /*
  12. 结构体
  13. */
  14. struct student
  15. {
  16. long num;
  17. char name[100];
  18. float s1;
  19. float s2;
  20. float s3;
  21. float sum;
  22. int rank;
  23. struct student *next;
  24. };
  25. /*
  26. 函数声明
  27. */
  28. struct student * create();
  29. struct student * delname(struct student *head);
  30. struct student * delnum(struct student *head);
  31. void sort(struct student *head);
  32. struct student * changename(struct student *head);
  33. struct student * changenum(struct student *head);
  34. void filein(struct student *head);
  35. void locatename(struct student *head);
  36. void locatenum(struct student *head);
  37. void print(struct student *head);
  38. void ABCD(struct student *head);
  39. void max(struct student *head);

function.cpp

  1. #include"student.h"
  2. /*
  3. 函数
  4. */
  5. struct student * create() //建立基础的学生信息库 从文件中将学生信息读取出来
  6. {
  7. char title[100];
  8. FILE *fp;
  9. struct student *head, *p , *q;
  10. p = q = (struct student *)malloc(LEN);
  11. if( ( fp = fopen("data00.txt","r") ) == NULL )
  12. {
  13. printf( "can't open filen" );
  14. exit(1);
  15. }
  16. fgets( title, 100, fp );
  17. head = p;
  18. fscanf( fp , "%ld%s%f%f%fn",&q->num, p->name, &p->s1,&p->s2,&p->s3 );
  19. p->sum = p->s1 + p->s2 + p->s3;
  20. while(!feof(fp))
  21. {
  22. q = (struct student *)malloc(LEN);
  23. fscanf( fp,"%ld%s%f%f%f%n", &q->num,q->name, &q->s1,&q->s2,&q->s3 );
  24. q->sum = q->s1 + q->s2 + q->s3;
  25. p->next = q;
  26. p = q;
  27. }
  28. p->next = NULL;
  29. fclose(fp);
  30. return head;
  31. }
  32. void sort(struct student *head) //排序
  33. {
  34. struct student *p , *q ;
  35. p = head;
  36. while( p ) //擂台法进行排序
  37. {
  38. p->sum = p->s1 + p->s2 + p->s3;
  39. p->rank = 1;
  40. q = head;
  41. while(q!=p)
  42. {
  43. if((q->sum) > (p->sum))
  44. {
  45. p->rank +=1;
  46. }
  47. else if((q->sum)< (p->sum))
  48. {
  49. q->rank +=1;
  50. }
  51. q = q->next;
  52. }
  53. p = p->next;
  54. }
  55. }
  56. void locatename(struct student *head) //查询信息
  57. {
  58. struct student *p , *q;
  59. char name[20];
  60. printf("n请输入要查询学生的姓名:");
  61. scanf("%s",name);
  62. p = head;
  63. q = p->next;
  64. if(strcmp(name,p->name)==0)
  65. {
  66. printf("n学号t姓名t课程1t课程2t课程3t总分t排名n");
  67. printf( "%ldt%st%.2ft%.2ft%.2ft%.2ft%3dn" ,p->num,p->name, p->s1, p->s2, p->s3 , p->sum ,p->rank );
  68. }
  69. else
  70. {
  71. while(q && (strcmp(q->name,name)!=0))
  72. {
  73. q = q->next;
  74. }
  75. if(q)
  76. {
  77. printf("查询的信息为:n");
  78. printf("学号t姓名t课程1t课程2t课程3t总分t排名n");
  79. printf( "%ldt%st%.2ft%.2ft%.2ft%.2ft%3dn" ,q->num,q->name, q->s1, q->s2, q->s3 , q->sum ,q->rank );
  80. }
  81. else
  82. {
  83. printf("没有%s学生n",name);
  84. }
  85. }
  86. }
  87. void locatenum(struct student *head) //查询信息
  88. {
  89. struct student *p , *q;
  90. long num;
  91. printf("n请输入要查询学生的学号:");
  92. scanf("%d",&num);
  93. fflush(stdin);
  94. p = head;
  95. q = p->next;
  96. if( p->num == num )
  97. {
  98. printf("n学号t姓名t课程1t课程2t课程3t总分t排名n");
  99. printf( "%ldt%st%.2ft%.2ft%.2ft%.2ft%3dn" ,p->num,p->name, p->s1, p->s2, p->s3 , p->sum ,p->rank );
  100. }
  101. else
  102. {
  103. while(q && q->num != num )
  104. {
  105. q = q->next;
  106. }
  107. if(q)
  108. {
  109. printf("查询的信息为:n");
  110. printf("学号t姓名t课程1t课程2t课程3t总分t排名n");
  111. printf( "%ldt%st%.2ft%.2ft%.2ft%.2ft%3dn" ,q->num,q->name, q->s1, q->s2, q->s3 , q->sum ,q->rank );
  112. }
  113. else
  114. {
  115. printf("没有该学生,请重新输入n");
  116. }
  117. }
  118. }
  119. struct student * delname(struct student *head) //通过姓名删除学生信息
  120. {
  121. char name[20];
  122. struct student *p , *q;
  123. printf("请输如你想要删除的姓名n");
  124. scanf("%s",name);
  125. if( head==NULL )
  126. {
  127. printf("nlist null!n");
  128. return head;
  129. }
  130. p = head;
  131. while( strcmp(p->name,name)!=0 && p->next!=NULL)
  132. {
  133. q = p ;
  134. p = p->next;
  135. } //直到找到为止
  136. if(strcmp(p->name,name)==0 ) //姓名匹配
  137. {
  138. if( p == head ) //如果这个学生是第一个学生的话
  139. {
  140. head = p->next;
  141. printf("你删除的学生信息为:n");
  142. printf("学号t姓名t课程1t课程2t课程3t总分t排名n");
  143. printf( "%ldt%st%.2ft%.2ft%.2ft%.2ft%3dn" , p->num,p->name, p->s1, p->s2, p->s3 ,p->sum, p->rank );
  144. printf("学生%s删除成功n",name);
  145. }//头head要换 不然找不到了
  146. else
  147. {
  148. q->next=p->next;
  149. printf("你删除的学生信息为:n");
  150. printf("学号t姓名t课程1t课程2t课程3t总分t排名n");
  151. printf( "%ldt%st%.2ft%.2ft%.2ft%.2ft%3dn" ,p->num, p->name, p->s1, p->s2, p->s3 ,p->sum, p->rank );
  152. printf("学生%s删除成功n",name);
  153. }
  154. }
  155. if(strcmp(p->name,name)!=0 )
  156. {
  157. printf("没有%s学生n",name);
  158. }
  159. return head;
  160. }
  161. struct student * delnum(struct student *head) //通过学号删除学生信息
  162. {
  163. long num;
  164. struct student *p , *q;
  165. printf("请输如你想要删除的学号n");
  166. scanf("%ld",&num);
  167. fflush(stdin);
  168. if( head==NULL )
  169. {
  170. printf("nlist null!n");
  171. return head;
  172. }
  173. p = head;
  174. while( p->num != num && p->next!=NULL)
  175. {
  176. q = p ;
  177. p = p->next;
  178. } //直到找到为止
  179. if(p->num == num ) //姓名匹配
  180. {
  181. if( p == head ) //如果这个学生是第一个学生的话
  182. {
  183. head = p->next;
  184. printf("你删除的学生信息为:n");
  185. printf("学号t姓名t课程1t课程2t课程3t总分t排名n");
  186. printf( "%ldt%st%.2ft%.2ft%.2ft%.2ft%3dn" , p->num,p->name, p->s1, p->s2, p->s3 ,p->sum, p->rank );
  187. printf("学号为%ld的学生删除成功n",num);
  188. }//头head要换 不然找不到了
  189. else
  190. {
  191. q->next=p->next;
  192. printf("你删除的学生信息为:n");
  193. printf("学号t姓名t课程1t课程2t课程3t总分t排名n");
  194. printf( "%ldt%st%.2ft%.2ft%.2ft%.2ft%3dn" ,p->num, p->name, p->s1, p->s2, p->s3 ,p->sum, p->rank );
  195. printf("学号为%ld的学生删除成功n",num);
  196. }
  197. }
  198. if(p->num != num )
  199. {
  200. printf("没有该学生,请重新输入n");
  201. }
  202. return head;
  203. }
  204. struct student * changename(struct student *head) //通过姓名去修改学生数据
  205. {
  206. struct student *p ,*q;
  207. char name[20];
  208. printf("请输入你想修改的姓名n");
  209. scanf("%s",name);
  210. fflush(stdin);
  211. p = head;
  212. while( strcmp(p->name,name)!=0 && p->next!=NULL)
  213. {
  214. q = p ;
  215. p = p->next;
  216. } //直到找到为止
  217. if(strcmp(p->name,name)==0)
  218. {
  219. printf("学生%s存在n",p->name);
  220. printf("你要修改的学生信息为:n");
  221. printf("学号t姓名t课程1t课程2t课程3t总分t排名n");
  222. printf( "%ldt%st%.2ft%.2ft%.2ft%.2ft%3dn" ,p->num, p->name, p->s1, p->s2, p->s3 ,p->sum, p->rank );
  223. printf("请修改课程1的成绩:n");
  224. scanf("%f",&p->s1);
  225. printf("请修改课程2的成绩:n");
  226. scanf("%f",&p->s2);
  227. printf("请修改课程3的成绩:n");
  228. scanf("%f",&p->s3);
  229. p->sum = p->s1 + p->s2 + p->s3;
  230. sort(head);
  231. printf("成绩已经完成更新n");
  232. printf("更新后的学生信息为:n");
  233. printf("学号t姓名t课程1t课程2t课程3t总分t排名n");
  234. printf( "%ldt%st%.2ft%.2ft%.2ft%.2ft%3dn" ,p->num, p->name, p->s1, p->s2, p->s3 ,p->sum,p->rank );
  235. }
  236. else
  237. {
  238. printf("没有%s学生n",name);
  239. }
  240. return head;
  241. }
  242. struct student * changenum(struct student *head) //通过学号去修改学生数据
  243. {
  244. struct student *p ,*q;
  245. long num;
  246. printf("请输入你想修改的学号n");
  247. scanf( "%ld",&num );
  248. fflush(stdin);
  249. p = head;
  250. while( p->num != num && p->next!=NULL)
  251. {
  252. q = p ;
  253. p = p->next;
  254. } //直到找到为止
  255. if( p->num == num )
  256. {
  257. printf("学号为%ld的学生存在n",p->num);
  258. printf("你要修改的学生信息为:n");
  259. printf("学号t姓名t课程1t课程2t课程3t总分t排名n");
  260. printf( "%ldt%st%.2ft%.2ft%.2ft%.2ft%3dn" ,p->num, p->name, p->s1, p->s2, p->s3 ,p->sum, p->rank );
  261. printf("请修改课程1的成绩:n");
  262. scanf("%f",&p->s1);
  263. printf("请修改课程2的成绩:n");
  264. scanf("%f",&p->s2);
  265. printf("请修改课程3的成绩:n");
  266. scanf("%f",&p->s3);
  267. p->sum = p->s1 + p->s2 + p->s3;
  268. sort(head);
  269. printf("成绩已经完成更新n");
  270. printf("更新后的学生信息为:n");
  271. printf("学号t姓名t课程1t课程2t课程3t总分t排名n");
  272. printf( "%ldt%st%.2ft%.2ft%.2ft%.2ft%3dn" ,p->num, p->name, p->s1, p->s2, p->s3 ,p->sum,p->rank );
  273. }
  274. else if( p->num == num )
  275. {
  276. printf("学号为%ld的学生存在n",p->num);
  277. printf("请修改课程1的成绩:n");
  278. scanf("%f",&p->s1);
  279. printf("请修改课程2的成绩:n");
  280. scanf("%f",&p->s2);
  281. printf("请修改课程3的成绩:n");
  282. scanf("%f",&p->s3);
  283. printf("成绩已经完成更新n");
  284. p->sum = p->s1 + p->s2 + p->s3;
  285. }
  286. else
  287. {
  288. printf("n没有该学生,请重新输入n");
  289. }
  290. return head;
  291. }
  292. void filein(struct student *head)//保存到文件中
  293. {
  294. char title[50];
  295. FILE *fp;
  296. struct student *p;
  297. if((fp=fopen("data11.txt","w"))==NULL)//打开文件
  298. {
  299. printf("can't open.n");
  300. exit(-1);
  301. }
  302. p = head;
  303. fprintf(fp,"学号t姓名t课程1t课程2t课程3t总分t排名tn");
  304. while(p)
  305. {
  306. p->sum = p->s1 + p->s2 + p->s3;
  307. fprintf(fp , "%ldt%st%.2ft%.2ft%.2ft%.2ft%2dn",p->num,p->name, p->s1, p->s2, p->s3 , p->sum , p->rank );
  308. p = p->next;
  309. }
  310. fclose(fp);
  311. }
  312. //输出学生信息 此函数已经完成
  313. void print(struct student *head)
  314. {
  315. struct student *p;
  316. p = head;
  317. while(p)
  318. {
  319. printf( "%ldt%st%.2ft%.2ft%.2ft%.2ft%3dn",p->num,p->name , p->s1 , p->s2 , p->s3 , p->sum , p->rank );
  320. p = p->next;
  321. }
  322. }
  323. void ABCD(struct student *head)
  324. {
  325. int n1 = 0;
  326. int n2 = 0;
  327. int n3 = 0;
  328. int n4 = 0;
  329. int n5 = 0;
  330. int n6 = 0;
  331. int n7 = 0;
  332. int n8 = 0;
  333. int n9 = 0;
  334. int n10 = 0;
  335. int n11 = 0;
  336. int n12 = 0;
  337. //统计分数段的人数
  338. struct student *p;
  339. FILE *fp;
  340. p = head;
  341. printf("A等级为90--100nB等级为80--89nC等级为60--80nD等级为<60n");
  342. while(p!=NULL)
  343. {
  344. if( p->s1 >= 90 )
  345. {
  346. n1 ++;
  347. }
  348. if( (p->s1 >= 80 ) && ( p->s1 < 90 ) )
  349. {
  350. n2 ++;
  351. }
  352. if( (p->s1 >= 60 ) && ( p->s1 < 80 ) )
  353. {
  354. n3 ++;
  355. }
  356. if( p->s1 < 60 )
  357. {
  358. n4 ++;
  359. }
  360. if( p->s2 >= 90 )
  361. {
  362. n5 ++;
  363. }
  364. if( (p->s2 >= 80 ) && ( p->s2 < 90 ) )
  365. {
  366. n6 ++;
  367. }
  368. if( (p->s2 >= 60 ) && ( p->s2 < 80 ) )
  369. {
  370. n7 ++;
  371. }
  372. if( p->s2 < 60 )
  373. {
  374. n8 ++;
  375. }
  376. if( p->s3 >= 90 )
  377. {
  378. n9 ++;
  379. }
  380. if( (p->s3 >= 80 ) && ( p->s3 < 90 ) )
  381. {
  382. n10 ++;
  383. }
  384. if( (p->s3 >= 60 ) && ( p->s3 < 80 ) )
  385. {
  386. n11 ++;
  387. }
  388. if( p->s3 < 60 )
  389. {
  390. n12 ++;
  391. }
  392. p = p->next;
  393. }
  394. printf("n成绩分析已经生成表格n");
  395. printf("n等级tAtBtCtDt总数n课程1t%dt%dt%dt%dt%3dn",n1,n2,n3,n4,n1+n2+n3+n4);
  396. printf("课程2t%dt%dt%dt%dt%3dn",n5,n6,n7,n8,n5+n6+n7+n8);
  397. printf("课程3t%dt%dt%dt%dt%3dn",n9,n10,n11,n12,n9+n10+n11+n12);
  398. printf("总数t%dt%dt%dt%dt%3dn",n1+n5+n9,n2+n6+n10,n3+n7+n11,n4+n8+n12,n1+n2+n3+n4+n5+n6+n7+n8+n9+n10+n11+n12);
  399. if((fp=fopen("abcd.txt","w"))==NULL)//打开文件
  400. {
  401. printf("can't open.n");
  402. exit(-1);
  403. }
  404. fprintf(fp,"成绩分析已经生成表格n");
  405. fprintf(fp,"A等级为90--100nB等级为80--89nC等级为60--80nD等级为<60n");
  406. fprintf(fp,"n等级tAtBtCtDt总数n课程1t%dt%dt%dt%dt%3dn",n1,n2,n3,n4,n1+n2+n3+n4);
  407. fprintf(fp,"课程2t%dt%dt%dt%dt%3dn",n5,n6,n7,n8,n5+n6+n7+n8);
  408. fprintf(fp,"课程3t%dt%dt%dt%dt%3dn",n9,n10,n11,n12,n9+n10+n11+n12);
  409. fprintf(fp,"总数t%dt%dt%dt%dt%3dn",n1+n5+n9,n2+n6+n10,n3+n7+n11,n4+n8+n12,n1+n2+n3+n4+n5+n6+n7+n8+n9+n10+n11+n12);
  410. fclose(fp);
  411. }
  412. void max(struct student * head)
  413. {
  414. struct student *p,*p1,*p2,*p3,*p4,*p5,*p6,*p7,*summax,*summin,*s1max,*s2max,*s3max,*s1min,*s2min,*s3min;
  415. FILE *fp;
  416. p = head;
  417. p1 = head;
  418. p2 = head;
  419. p3 = head;
  420. p4 = head;
  421. p5 = head;
  422. p6 = head;
  423. p7 = head;
  424. summax = p;
  425. s1max = p1;
  426. s2max = p2;
  427. s3max = p3;
  428. summin = p4;
  429. s1min = p5;
  430. s2min = p6;
  431. s3min = p7;
  432. summax->sum = summax->s1+summax->s2+summax->s3;
  433. summin->sum = summin->s1+summin->s2+summin->s3;
  434. while(p!=NULL)
  435. {
  436. if(p->sum > summax->sum)
  437. {
  438. summax = p;
  439. }
  440. p = p->next;
  441. }
  442. while(p1!=NULL)
  443. {
  444. if(p1->sum > s1max->sum)
  445. {
  446. s1max = p1;
  447. }
  448. p1 = p1->next;
  449. }
  450. while(p2!=NULL)
  451. {
  452. if(p2->sum > s2max->sum)
  453. {
  454. s2max = p2;
  455. }
  456. p2 = p2->next;
  457. }
  458. while(p3!=NULL)
  459. {
  460. if(p3->sum > s3max->sum)
  461. {
  462. s3max = p3;
  463. }
  464. p3 = p3->next;
  465. }
  466. while(p4!=NULL)
  467. {
  468. if(p4->sum < summin->sum)
  469. {
  470. summin = p4;
  471. }
  472. p4 = p4->next;
  473. }
  474. while(p5!=NULL)
  475. {
  476. if(p5->s1 < s1min->s1)
  477. {
  478. s1min = p5;
  479. }
  480. p5= p5->next;
  481. }
  482. while(p6!=NULL)
  483. {
  484. if(p6->s2 < s2min->s2)
  485. {
  486. s2min = p6;
  487. }
  488. p6 = p6->next;
  489. }
  490. while(p7!=NULL)
  491. {
  492. if(p7->s2 < s3min->s3)
  493. {
  494. s3min = p7;
  495. }
  496. p7 = p7->next;
  497. }
  498. printf("t总分tt课程1ttt课程2ttt课程3n");
  499. printf("最高分t%.2f(%s)t%.2f(%s)tt%.2f(%s)tt%.2f(%s)n",summax->sum,summax->name,s1max->s1,s1max->name,s2max->s2,s2max->name,s3max->s3,s3max->name);
  500. printf("最低分t%.2f(%s)t%.2f(%s)tt%.2f(%s)tt%.2f(%s)n",summin->sum,summin->name,s1min->s1,s1min->name,s2min->s2,s2min->name,s3min->s3,s3min->name);
  501. if((fp=fopen("max.txt","w"))==NULL)//打开文件
  502. {
  503. printf("can't open.n");
  504. exit(-1);
  505. }
  506. fprintf(fp,"tt总分ttt课程1ttt课程2ttt课程3n");
  507. fprintf(fp,"最高分t%.2f(%s)t%.2f(%s)t%.2f(%s)t%.2f(%s)n",summax->sum,summax->name,s1max->s1,s1max->name,s2max->s2,s2max->name,s3max->s3,s3max->name);
  508. fprintf(fp,"最低分t%.2f(%s)t%.2f(%s)t%.2f(%s)t%.2f(%s)n",summin->sum,summin->name,s1min->s1,s1min->name,s2min->s2,s2min->name,s3min->s3,s3min->name);
  509. fclose(fp);
  510. }

main.cpp

  1. #include"student.h"
  2. #define _CRT_SECURE_NO_WARNINGS
  3. int main()
  4. {
  5. char answer;
  6. int choice;
  7. struct student *head ;
  8. head = create();
  9. sort(head);
  10. printf("ttt学生成绩管理系统n");
  11. printf("nt************STUDENT-SCORE-SYSTEM 5.0***************n");
  12. printf("nt************powered by 信卓11801聂健***************n");
  13. printf("nttt按任意键登录系统n");
  14. getchar();
  15. system("cls");
  16. do
  17. {
  18. printf("欢迎你,管理员!n");
  19. printf("|---------------------------------------|n");
  20. printf("|t请输入选项编号(0-6):tt|");
  21. printf("n|---------------------------------------|n");
  22. printf("|t1--浏览学生信息:tt|n");
  23. printf("|t2--查询学生信息:tt|n");
  24. printf("|t3--修改学生信息:tt|n");
  25. printf("|t4--删除学生信息:tt|n");
  26. printf("|t5--各科成绩:ttt|n");
  27. printf("|t6--最高分:ttt|n");
  28. printf("|t0--退出系统:ttt|n");
  29. printf("|---------------------------------------|n");
  30. printf("请输入选项");
  31. scanf("%d",&choice);
  32. fflush(stdin);
  33. switch(choice)
  34. {
  35. case 0:
  36. {
  37. printf("********退出系统*********n");
  38. filein(head);//将修改后的成绩保存在data11.txt中
  39. printf("修改的数据已经保存在data11.txt中n");
  40. printf("欢迎下次使用n");
  41. exit(0);
  42. break;
  43. }
  44. case 1:
  45. {
  46. system("cls");
  47. printf("*************学生成绩一览表********************n");
  48. printf("学号t姓名t课程1t课程2t课程3t总分t排名n");
  49. print(head); //打印所有人的信息
  50. printf("n按任意键继续回到菜单n");
  51. getch();
  52. system("cls");
  53. break;
  54. }
  55. case 2:
  56. {
  57. while(1)
  58. {
  59. printf("请选择查询方式n");
  60. printf("1.姓名n2.学号n");
  61. scanf("%s",&answer);
  62. if( answer == '1' )
  63. {
  64. locatename(head);//查询信息
  65. }
  66. if(answer == '2' )
  67. {
  68. locatenum(head);
  69. }
  70. if(answer != '1' && answer!= '2')
  71. {
  72. printf("输入错误n");
  73. }
  74. printf("1.按任意键回车后继续查询n0.退出n");
  75. scanf("%s",&answer);
  76. fflush(stdin);
  77. if(answer == '0' )
  78. {
  79. break;
  80. }
  81. }
  82. printf("n按任意键回到菜单");
  83. getch();
  84. system("cls");
  85. break;
  86. }
  87. case 3:
  88. {
  89. while(1)
  90. {
  91. printf("请选择修改成绩的方式n");
  92. printf("1.姓名n2.学号n");
  93. scanf("%s",&answer);
  94. if(answer == '1')
  95. {
  96. changename(head);
  97. sort(head); //修改成绩后重新排序
  98. }
  99. if(answer == '2')
  100. {
  101. changenum(head);
  102. sort(head); //修改成绩后重新排序
  103. }
  104. if(answer != '1' && answer!= '2')
  105. {
  106. printf("输入错误n");
  107. }
  108. printf("是否继续n");
  109. printf("1.按任意键回车后继续修改n0.退出n");
  110. scanf("%s",&answer);
  111. if(answer=='0')
  112. {
  113. break;
  114. }
  115. }
  116. printf("n按任意键回到菜单n");
  117. getch();
  118. system("cls");
  119. break;
  120. }
  121. case 4:
  122. {
  123. while(1)
  124. {
  125. printf("请选择删除学生的方式n");
  126. printf("1.姓名n2.学号n");
  127. scanf("%s",&answer);
  128. if(answer=='1')
  129. {
  130. head= delname(head); //删除头时头要换
  131. sort(head); //删除学生后重新排序
  132. }
  133. if(answer=='2')
  134. {
  135. head= delnum(head); //删除头时头要换
  136. sort(head); //删除学生后重新排序
  137. }
  138. if(answer != '1' && answer!= '2')
  139. {
  140. printf("输入错误n");
  141. }
  142. printf("是否继续n");
  143. printf("1.继续删除n0.退出n");
  144. scanf("%s",&answer);
  145. if(answer=='0')
  146. {
  147. break;
  148. }
  149. }
  150. printf("n按任意键继续执行你想要的操作");
  151. getch();
  152. system("cls");
  153. break;
  154. }
  155. case 5:
  156. {
  157. ABCD(head);//计算人数
  158. printf("n按任意键继续执行你想要的操作");
  159. getch();
  160. system("cls");
  161. break;
  162. }
  163. case 6:
  164. {
  165. max(head);
  166. printf("n按任意键继续执行你想要的操作");
  167. getch();
  168. system("cls");
  169. break;
  170. }
  171. default:
  172. {
  173. printf("********没有这个选项*********n按任意键重新输入n");
  174. getch();
  175. break;
  176. }
  177. }
  178. }while(1);
  179. return 0;
  180. }

学生原始数据没有展现出来,需要的私我哦

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/311281
推荐阅读
相关标签
  

闽ICP备14008679号