这篇文章主要为大家详细介绍了C语言利用结构体数组实现学生成绩管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

要求:

某班有最多不超过30人(具体人数由键盘输入)参加期末考试,最多不超过6门(具体门数由键盘输入)。定义结构体类型描述学生信息,每个学生信息包括:学号、姓名、多门课的成绩、总成绩和平均成绩。用结构体数组作为函数参数,编程实现如下菜单驱动的学生成绩管理系统。
(1) 录入每个学生的学号、姓名和各科考试成绩。
(2) 计算每门课程的总分和平均分。
(3) 计算每个学生的总分和平均分。
(4) 按每个学生的总分由高到低排出名次表。
(5) 按学号由小到大排出成绩表。
(6) 按姓名的字典顺序排出成绩表。
(7) 按学号查询学生排名极其考试成绩。
(8) 按姓名查询学生排名极其考试成绩。
(9) 按优秀(90~100)、良好(80~90)、中等(70~80)、及格(60~70)、不及格(0~59)5个类别,对每门课程分别统计每个类别的人数以及所占的百分比。
(10) 输出每个学生的学号、姓名、各科考试成绩以及每门课程的总分和平均分。

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
#include<stdio.h>
#include<Windows.h>
#include<conio.h>
 
#define SN 30 //学生人数
#define CN 6 //科目数
#define NL 20 //名字字节长度
 
typedef struct student{
 long int num;
 char name[NL];
 float score[CN];
 float sum;
 float aver;
}STU;
 
STU s[SN];
int itemSelected=-1;
int n=0;//学生数
int m=0;//课程数
 
int Menu();//菜单
void chose(int itemSelected);//选择
void inputScore();//输入分数
void AverofC();//计算每门课程平均数
void AverofS();//每名学生总分和平均分
void sortByNum();//学生总分排行
void sortByGrade();
void sortByName();
void findByNum();
void findByName();
void statisticsAnalysis();
void printScore();
 
void main(){
 printf("请输入学生总数(n<%d):\n",SN);
 scanf("%d",&n);
 printf("请输入课程总数(m<%d):\n",CN);
 scanf("%d",&m);
 while(1){
 itemSelected=Menu();
 chose(itemSelected);
 itemSelected=-1;
 }
}
 
int Menu(){
 int itemSelected;
 system("cls");
 printf("\n ==============学生成绩管理系统===============\n");
 printf("\t 1.输入学号、姓名及各科成绩\n");
 printf("\t 2.计算每门课程总分和平均分\n");
 printf("\t 3.计算每个学生总分和平局分\n");
 printf("\t 4.按每个学生总分高低排出名次表\n");
 printf("\t 5.按学号从小到大排出成绩表\n");
 printf("\t 6.按学生字典顺序排出成绩表\n");
 printf("\t 7.按学号查询学生排名和考试成绩\n");
 printf("\t 8.按姓名查询学生排名和成绩\n");
 printf("\t 9.结果分析\n");
 printf("\t 10.输出信息\n");
 printf("\t 0.退出\n");
 printf("===============================================\n");
 printf("请选择选项:");
 scanf("%d",&itemSelected);
 return itemSelected;
}
 
void chose(int itemSelected){
 switch(itemSelected){
 case 1: inputScore(); break;
 case 2: AverofC();break;
 case 3: AverofS();break;
 case 4: sortByGrade();break;
 case 5: sortByNum();break;
 case 6: sortByName();break;
 case 7: findByNum();break;
 case 8: findByName();break;
 case 9: statisticsAnalysis();break;
 case 10: printScore();break;
 case 0: exit(0);
 printf("即将退出程序");break;
 default: printf("输入错误!");break;
 }
}
 
void inputScore(){
 printf("\n===============================================\n");
 printf("请输入学生学号、姓名及各科信息(输入0停止信息输入)\n");
 for(int i=0;i<n;i++){
 printf("学号(8位)");
 scanf("%ld",&s[i].num);
 if(s[i].num==0) break;
 getchar();//吸收多余换行符
 printf("姓名");
 gets(s[i].name);
 printf("请输入各科成绩");
 s[i].sum=0;
 for(int j =0;j<m;j++){
  scanf("%f",&s[i].score[j]);
  s[i].sum +=s[i].score[j];
 }
 }
}
 
void AverofC(){
 float sum[CN]={0};
 float average[CN]={0};
 for(int i=0;i<m;i++){
 for(int j=0;j<n;j++){
 sum[i]+=s[j].score[i];
 }
 average[i]=sum[i]/n;
 printf("第%d门课程的总分为:%.2f,平均分为%.2f\n",i+1,sum[i],average[i]);
 }
 getch();
}
 
void AverofS(){
 float sum[SN]={0};
 float average[SN]={0};
 for (int i=0;i<n;i++){
 for(int j=0;j<m;j++){
  sum[i]+=s[i].score[j];
 }
 average[i]=sum[i]/m;
 printf("第%d个学生的总分为:%.2f,平均分为%.2f\n",i+1,sum[i],average[i]);
 }
 getch();
}
 
void sortByNum(){
 //按学号从小到大排序
 STU temp1={0};
 for(int i=0;i<n-1;i++){
 if(s[i].num>s[i+1].num){
  temp1=s[i];
  s[i]=s[i+1];
  s[i+1]=temp1;
 }
 }
 printf("\n==============按学号从小到排序===============\n");
 for(int j=0;j<n;j++){
 printf("该学生的学号为:%d\n",s[j].num);
 printf("该学生的姓名为:");
 for(int k=0;k<NL;k++){
  printf("%c",s[j].name[k]);
 }
 printf("\n该学生的各科成绩为\n");
 for(int c=0;c<m;c++){
  printf("第%d门成绩为%.2f\n",c+1,s[j].score[c]);
 }
 printf("\n");
 }
 getch();
}
 
void sortByGrade(){
 //按总分从高到低排序
 STU temp1={0};
 for(int i=0;i<n-1;i++){
  if(s[i].sum<s[i+1].sum){
  temp1=s[i];
  s[i]=s[i+1];
  s[i+1]=temp1;
 }
 }
 printf("\n============按总成绩从高到低排序===========\n");
 for(int j=0;j<n;j++){
 printf("该学生的学号为:%d\n",s[j].num);
 printf("该学生的姓名为:");
 for(int k=0;k<NL;k++){
  printf("%c",s[j].name[k]);
 }
 printf("\n该学生的各科成绩为\n");
 for(int c=0;c<m;c++){
  printf("第%d门成绩为%.2f\n",c+1,s[j].score[c]);
 }
 printf("该学生的总成绩为:%.2f",s[j].sum);
 printf("\n");
 }
 getch();
}
 
void sortByName(){
 //按姓名首字母字典顺序排序
 STU temp1={0};
 for(int i=0;i<n-1;i++){
  if(((int)(s[i].name[0])>(int)(s[i+1].name[0]))){
  //将名字首字母转成成ASCII码从而比较大小排序
  temp1=s[i];
  s[i]=s[i+1];
  s[i+1]=temp1;
 }
 }
 printf("\n==============按学号从小到排序===============\n");
 for(int j=0;j<n;j++){
 printf("该学生的学号为:%d\n",s[j].num);
 printf("该学生的姓名为:");
 for(int k=0;k<NL;k++){
  printf("%c",s[j].name[k]);
 }
 printf("\n该学生的各科成绩为\n");
 for(int c=0;c<m;c++){
  printf("第%d门成绩为%.2f\n",c+1,s[j].score[c]);
 }
 printf("该学生的总成绩为:%.2f",s[j].sum);
 printf("\n");
 }
 getch();
}
 
void findByNum() {
 int find=-1;
 //记录需要查找的学号,并作为查找成功与否的标识符
 printf("请输入要查找的学号:");
 scanf("%d",&find);
 for(int i=0;i<n;i++){
 if(s[i].num==find){
  printf("\n查找成功\n");
  printf("该学生的学号为%d\n",s[i].num);
  printf("该学生的姓名为:");
  for(int k=0;k<NL;k++){
  printf("%c",s[i].name[k]);
  }
  printf("\n该学生的各科成绩为\n");
  for(int c=0;c<m;c++){
  printf("第%d门成绩为%.2f\n",c+1,s[i].score[c]);
  }
  printf("该学生的总成绩为:%.2f",s[i].sum);
  printf("\n");
  find=-2;
 }
 }
 if(find!=-2){
 printf("查无此人\n");
 printf("按任意键继续");
 }
 getch();
}
 
void findByName(){
 int is_find=0;
 char find[SN];
 printf("请输入要查找的姓名:");
 getchar();
 gets(find);
 for(int i=0;i<n;i++){
 if(strcmp(s[i].name,find)==0){
  printf("\n查找成功\n");
  printf("该学生的学号为%d\n",s[i].num);
  printf("该学生的姓名为:");
  for(int k=0;k<NL;k++){
  printf("%c",s[i].name[k]);
  }
  printf("\n该学生的各科成绩为\n");
  for(int c=0;c<m;c++){
  printf("第%d门成绩为%.2f\n",c+1,s[i].score[c]);
  }
  printf("该学生的总成绩为:%.2f",s[i].sum);
  printf("\n");
  is_find=1;
 }
 }
 if(is_find!=1){
 printf("查无此人\n");
 printf("按任意键继续");
 }
 getch();
}
 
void statisticsAnalysis(){
 printf("输出每门课程优秀、良好、中等、及格、不及格人数所占的百分比\n");
 int a1[CN]={0},a2[CN]={0},a3[CN]={0},a4[CN]={0},a5[CN]={0};
 for(int i=0;i<n;i++){
 for(int j=0;j<m;j++){
  if(s[i].score[j]>=90 && s[i].score[j]<=100){
  a1[j]++;
  }else if (s[i].score[j]>=80 && s[i].score[j]<90){
  a2[j]++;
  }else if (s[i].score[j]>=70 && s[i].score[j]<80){
  a3[j]++;
  }else if (s[i].score[j]>=60 && s[i].score[j]<70){
  a4[j]++;
  }else if (s[i].score[j]<60){
  a5[j]++;
  }
 }
 }
 printf("\n====================各们课程概况==================\n");
 for(int k=0;k<m;k++){
  printf("第%d门课的优秀人数占%.2f%%,",k+1,(a1[k]/(n*1.0))*100);
  printf("良好人数占%.2f%%,",(a2[k]/(n*1.0))*100);
  printf("中等人数占%.2f%%,",(a3[k]/(n*1.0))*100);
  printf("及格人数占%.2f%%,",(a4[k]/(n*1.0))*100);
  printf("不及格人数占%.2f%%,",(a5[k]/(n*1.0))*100);
 
  printf("\n");
 }
 getch();
}
 
void printScore(){
 printf("==============以下为学生信息==============");
 for(int j=0;j<n;j++){
 printf("该学生的学号为:%d\n",s[j].num);
 printf("该学生的姓名为:");
 for(int k=0;k<NL;k++){
  printf("%c",s[j].name[k]);
 }
 printf("\n该学生的各科成绩为\n");
 for(int c=0;c<m;c++){
  printf("第%d门成绩为%.2f\n",c+1,s[j].score[c]);
 }
 printf("该学生的总成绩为:%.2f",s[j].sum);
 printf("\n");
 }
 getch();
}

C语言利用结构体数组实现学生成绩管理系统的更多相关文章

  1. C语言之:结构体动态分配内存(利用结构体数组保存不超过10个学生的信息,每个学生的信息包括:学号、姓名和三门课(高数、物理和英语 )的成绩和平均分(整型)。)

    题目内容: 利用结构体数组保存不超过10个学生的信息,每个学生的信息包括:学号.姓名和三门课(高数.物理和英语 )的成绩和平均分(整型). 编写程序,从键盘输入学生的人数,然后依次输入每个学生的学号. ...

  2. C语言 指向结构体数组的指针

    当结构体指针变量指向一个结构体变量数组的时候,此时指针变量的值就是结构体数组的首地址 关于如何定义结构体数组,和将结构体指针指向结构体变量数组,不是重点. 重点是,明白结构体指针的是怎么移动的, 我个 ...

  3. C#9 结构体 员工信息 学生成绩

    结构体:相当于是我们自己定义的一种复杂的类型. int...  double float bool char string  DateTime  数组类型 生活中大部份的对象都是复合型的对象. 如何定 ...

  4. JAVA语言课堂测试01源代码(学生成绩管理系统)

    package 考试; /*信1807-8 * 20183798 * 向瑜 */ import java.util.Scanner; //ScoreInformation 类 class ScoreI ...

  5. c语言指向结构体数组的指针

    #include <stdio.h> #include <stdlib.h> struct dangdang { ]; ]; ]; int num; int bugnum; ] ...

  6. C语言:将结构体数组的成绩按照从小到大进行排序。

    #include<stdio.h> typedef struct student { char *name; int sno; int age; float score; }Student ...

  7. 使用C++名单在文档处理和学生成绩管理系统相结合

    对于学生成绩管理系统,我并不陌生,几乎学习C人的语言.做项目会想到学生成绩管理系统,我也不例外.在研究中的一段时间C语言之后,还用C语言到学生管理系统,然后做几个链接.计数,这个系统是以前的系统上的改 ...

  8. C语言中的结构体,结构体数组

    C语言中的结构体是一个小难点,下面我们详细来讲一下:至于什么是结构体,结构体为什么会产生,我就不说了,原因很简单,但是要注意到是结构体也是连续存储的,但要注意的是结构体里面类型各异,所以必然会产生内存 ...

  9. C语言 结构体(嵌套结构体--结构体数组)

    //结构体--嵌套结构体和结构体数组 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> ...

随机推荐

  1. 【idea&spring mvc】搭建简易的spring mvc项目(基于maven)!

    一.创建项目 1.打开idea,file--new--project 2.按照步骤①②③④操作 3.输入包名,并点击下一步 4.选择下载包的maven的setting.xml配置路径和包的存放地,然后 ...

  2. 【组合计数】visit

    题目大意 从 \((0,0)\) 开始,每次只可走上下左右一个单位长度,可走重复路,求第 \(T\) 步正好走到 \((n,m)\) 的方案数. 答案要求对 \(MOD\) 取模,\(MOD\) 保证 ...

  3. 【暑假集训】HZOI2019 水站 多种解法

    题目内容 已知有一个\(n\)层的水站: \(W_i\)表示未操作之前第\(i\)层的已有水量: \(L_i\)表示第\(i\)个水站能够维持或者储存的水的重量: 表示在第\(P_i\)层进行减压放水 ...

  4. kafka-伪集群搭建

      一.简介 Apache Kafka是一个快速.可扩展的.高吞吐的.可容错的分布式"发布-订阅"消息系统,使用Scala与Java语言编写,能够将消息从一个端点传递到另一个端点, ...

  5. IDEA Cannot resolve plugin org.apache.maven.plugins:maven-site-plugin:3.8.2-plugin爆红错误

    如果确认本地库存在,maven仓库配置正确,将其显式声明出来,问题解决 <!--报找不到该依赖的错误, 本地库又存在,将其显式声明在这里,问题解决--> <plugin> &l ...

  6. ES6里class杂乱随笔

    这是一篇乱七八糟的随笔.class是ES6新增的特性,用于解决JavaScript没有类的困惑. --杂谈 ES5及之前,类都是用函数来替代,包括实例. 如: 1 function Person(na ...

  7. IDEA配置类和方法注释模板

    1定义java文件头部的注释 2给java类中的方法添加上注释 2.1第一步勾选Enable Live  Templates 2.2第二步新建一个Group 2.3第三步新建一个Template 2. ...

  8. java后端选型20200729

    参考地址:https://gitee.com/shuzheng/zheng 后端技术: 技术 名称 官网 Spring Framework 容器 http://projects.spring.io/s ...

  9. java数据结构-04单循环链表

    单循环链表与单链表的不同是,单循环链表尾结点的next指向第一个结点(或头结点)  代码: 无头结点: public class SingleCircleLinkedList<E> ext ...

  10. UI自动化执行时报Parent suite setup failed: SessionNotCreatedException: Message: session not created: This version of ChromeDriver only supports Chrome version 81报错的问题解决

    持续集成在执行UI时报错:Parent suite setup failed: SessionNotCreatedException: Message: session not created: Th ...