這篇文章主要為大家詳細介紹了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();
}
|