C语言程序设计大作业——学籍管理系统

  |  

文章导航

大一下C语言程序设计大作业,好像是上网找的,非原创

1.程序设计与分析

要求程序能实现以下基本功能:

(1).提供基本的菜单选项,能根据不同的选项执行不同操作;

(2).对学生信息进行录入,修改,删除、查询等操作;

(3).对学生信息进行统计、排序等操作。

(4).采用数据类型:整型,浮点型,字符型,指针类型,结构体类型

(5).核心算法:

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
#define MAX 10

//MAX代表学籍管理系统所能处理的最大学生数量,宏定义后,依据实际情况对程序的对应修改更易进行

//实际代码中是将子函数的定义写在了main函数的前面,但此处为了程序结构清晰将main函数写在了前面,因此main函数中没有子函数声明的语句

int main()

{

进行各种类型的变量定义以及初始化,以供后续程序使用

定义一个结构体类型,并定义一个该类型的结构体变量用于存储将要录入的学生信息数据:

struct Student

{

char Id[MAX];//学号

char name[50];//姓名

int clas;//班级

float score[4];//三科成绩以及总成绩

} student[MAX];

定义若干指针变量用于将main函数中的变量地址传递给各子函数,使子函数能够改变main函数中的变量的值

定义各种所需变量

定义整型变量mingling

定义一个变量num来记录总人数的变化并将其初始化为零

for(;;)

{

输出主菜单选项

输入数字命令并赋值给整型变量mingling

判断

若mingling=1,执行函数input进行学生信息输入操作

若mingling=2,执行函数del进行学生信息删除操作

若mingling=3,执行函数selet进行学生信息选择输出操作

若mingling=4,执行函数order进行学生信息整体排序操作

若mingling=5,执行函数output进行学生信息全体输出操作

若mingling=6,执行break语句跳出for循环

}

return 0

}

void input(通过指针引用学生信息、当前学生总人数等数据)

//我的源代码中每个子函数都是用了许多指针将结构体中的元素一一引用,此处可以改为利用指向结构体变量的指针,代码会简洁许多

{

利用指针来引用主函数中的学生信息变量

定义整型变量i用作循环

定义字符数组panduan[10]用作判断整个学生数据的录入操作是否结束

for(i=0;;i++)

{

输出"Id "

输入学号

输出"class "

输入班级

输出"name "

输入姓名

输出"score1 "

输入成绩1

输出"score2 "

输入成绩2

输出"score3 "

输入成绩3

将存储总成绩数据的变量赋值为成绩1,成绩2,成绩3的和

利用指针使main函数中记录学生人数的变量num自增1

输出"continue?"

输入命令并赋值给字符数组panduan

判断字符串panduan与"no"是否相等

若相等则执行break语句跳出循环

}

}

void del(通过指针引用学生信息、当前学生总人数等数据)

{

定义字符数组panduan[10]用于在已有学生信息中查找需要删除的对应学生信息

定义整型变量h用于判断是否找到了所需删除的学生信息

定义字符数组jueding[10]用于判断用户的删除操作是否全部结束

定义整型变量i用于进行循环查找所需删除的学生

//以下使用num的语句均指通过指针引用main函数中的num变量,为了书写简便,省略了指针引用的过程

for(;;)

{

h=0;

输入所需删除学生的信息关键字(姓名或学号)

for(i=0;i<=num-1;i++)

{

判断字符数组panduan中记录的关键字与第i+1个学生的姓名是否相同

若相同

{

则判断当前的学生信息总数是否为1

若为1,则执行break语句跳出循环

若不为1,则将第i+1个学生的所有信息依次与后一个学生的所有信息交换,直到将该学生信息交换至所有学生信息的最后一个记录处

按序输出num-1个学生的信息

利用指针使main函数中记录当前学生总数的变量num自减1

h=h+1;

}

若不相同

{

判断字符数组panduan中记录的关键字与第i+1个学生的学号是否相同

若相同

{

则判断当前的学生信息总数是否为1

若为1,则执行break语句跳出循环

若不为1,则将第i+1个学生的所有信息依次与后一个学生的所有信息交换,直到将该学生信息交换至所有学生信息的最后一个记录处

按序输出num-1个学生的信息

利用指针使main函数中记录当前学生总数的变量num自减1

h=h+1;

}

若不相同,不执行任何语句

}

}

判断h是否不等于0

若不等于0

{

则输出"continue?"

输入命令并将命令赋值给字符数组jueding

判断字符串jueding与"no"是否相等

若相等则执行break语句跳出循环

}

若等于0

{

则按序输出num个学生的所有信息

执行break语句跳出循环

}

}

}

void selet(通过指针引用学生信息、当前学生总人数等数据)

{

char panduan1[10],jueding[10];

int panduan2,m;

//panduan1用于存储输入的关键字,panduan2用于存储输入的关键字转换成对应整型数的数值,jueding用于判断整个选择过程是否结束,m用于判断是否找到了所需查找的学生

for(;;)

{

m=0;

输入查找关键字并将其赋值给字符数组panduan1

将panduan1中的数字字符转换为对应的整型数并将数值赋值给panduan2

在当前学生中循环查找学号与panduan1中数字字符串相同的学生,若找到则输出该学生所有信息,并使m++

每次循环判断时若当前接受判断的学生学号与panduan1中数字字符串不相同,则继续判断其班级与panduan2存储的数值是否相等,若相等则输出该学生,并使m++

循环查找结束后,判断m是否等于0,若为0,则输出"there is no eligible student"并执行break语句跳出循环

若不为0,则输出"continue?"

输入命令并将命令字符赋给jueding[10]

判断字符串jueding是否与"no"相等,若相等则执行break语句跳出循环

}

}

void order(通过指针引用学生信息、当前学生总人数等数据)

{

对当前存在的所有学生信息按照班级从小到大,同一班级内总成绩从大到小进行冒泡排序,排序结束后按序输出所有学生信息

}

void output(通过指针引用学生信息、当前学生总人数等数据)

{

将当前存在的所有学生信息按数组顺序循环输出

}

2.程序设计中存在的问题和解决思路

(1).由于为了在进行删除操作时比较方便进行输入数据的识别,我把学号和姓名都存储在字符数组中,结果在编写选择函数时由于要求输入班级或学号,而班级是存储在定义为整型的变量中的,因此出现了编写困难。

​ 解决方法:预处理时包含了头文件stdlib.h,在编写选择函数时调用了atoi()函数,将存储学号信息的字符数组中的数字字符转换为对应的整型数,并将其存储在一个新的整型变量中,以供后续程序判断使用。

(2).这一版学籍管理系统的学生数据交换方式还可以改进,如果定义一个struct Student jiaohuan的结构体变量用来交换学生数据会简便许多

另外程序中指针的使用也不够熟练,只是起到了在主函数与子函数之间传递地址的作用,没有体现指针简化数据处理的作用,定义了太多指针去指向结构体中的各个元素,若定义为指向结构体变量的指针会好很多

(3).学籍管理系统的代码和算法优化仍在进行中,这一版不会是最后一版。。。

3.实验收获

​ 对于程序的设计有了更加清晰的认识,对各种命令和数据类型的使用更加熟练,对于一个完整的学籍管理系统的设计有了清晰的思路。

对指针的运用更加熟练,对指针的作用有了更清晰的认识。(虽然代码中指针的运用比较肤浅,但是程序做完之后的思考和对有关知识的重温使我对指针有了更深的了解)

实际上为了用到所学的全部知识,这一版学籍管理系统用了很多不必要的算法,程序反而复杂了,但相对的因为使用到了这学期的几乎所有知识,所以对知识的掌握也上升了一个层次。

发现实现一定功能的程序其算法的多样性,不同的算法有不同的优点,使用的数据结构也有很大不同。

在编写程序的过程中对本学期的知识进行了系统的整理,巩固了所学的知识,为以后的继续学习打下了一个很好的基础。

4.程序的源代码清单

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
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
#include "stdio.h"

#include "string.h"

#include "stdlib.h"

#define MAX 10

void input(int *ban[MAX],char *ming[MAX],char *hao[MAX],float *fen[MAX][4],int *renshu)

{

int i;

char panduan[10];

for(i=*renshu;i<MAX;i++)

{

printf("Id ");

scanf("%s",hao[i]);

printf("class ");

scanf("%d",ban[i]);

printf("name ");

scanf("%s",ming[i]);

printf("score1 ");

scanf("%f",fen[i][0]);

printf("score2 ");

scanf("%f",fen[i][1]);

printf("score3 ");

scanf("%f",fen[i][2]);

*fen[i][3]=*fen[i][0]+*fen[i][1]+*fen[i][2];

printf("continue?\n");

scanf("%s",panduan);

*renshu=*renshu+1;

if(strcmp(panduan,"no")==0)

break;

}

}

void del(int *ban[MAX],char *ming[MAX],char *hao[MAX],float *fen[MAX][4],int *renshu)

{

int i,q,m,h;

float f;

char panduan[10],c[10],jueding[10];

for(;;)

{

h=0;

scanf("%s",panduan);

for(i=0;i<=*renshu-1;i++)

{

if(strcmp(ming[i],panduan)==0)

{

if(*renshu==1)

break;

for(;i<=*renshu-2;i++)

{

q=*ban[i];*ban[i]=*ban[i+1];*ban[i+1]=q;

strcpy(c,hao[i]);strcpy(hao[i],hao[i+1]);strcpy(hao[i+1],c);

strcpy(c,ming[i]);strcpy(ming[i],ming[i+1]);strcpy(ming[i+1],c);

for(m=0;m<=3;m++)

{

f=*fen[i][m];*fen[i][m]=*fen[i+1][m];*fen[i+1][m]=f;

}

}

for(m=0;m<=*renshu-2;m++)

{

printf("%s,%d,%s,%4.1f,%4.1f,%4.1f,%5.1f\n",hao[m],*ban[m],ming[m],*fen[m][0],*fen[m][1],*fen[m][2],*fen[m][3]);

}

*renshu=*renshu-1;

h=h+1;

}

else if(strcmp(hao[i],panduan)==0)

{

if(*renshu==1)

break;

for(;i<=*renshu-2;i++)

{

q=*ban[i];*ban[i]=*ban[i+1];*ban[i+1]=q;

strcpy(c,hao[i]);strcpy(hao[i],hao[i+1]);strcpy(hao[i+1],c);

strcpy(c,ming[i]);strcpy(ming[i],ming[i+1]);strcpy(ming[i+1],c);

for(m=0;m<=3;m++)

{

f=*fen[i][m];*fen[i][m]=*fen[i+1][m];*fen[i+1][m]=f;

}

}

for(m=0;m<=*renshu-2;m++)

{

printf("%s,%d,%s,%4.1f,%4.1f,%4.1f,%5.1f\n",hao[m],*ban[m],ming[m],*fen[m][0],*fen[m][1],*fen[m][2],*fen[m][3]);

}

*renshu=*renshu-1;

h=h+1;

}

}

if(h!=0)

{

printf("continue?\n");

scanf("%s",jueding);

if(strcmp(jueding,"no")==0)

break;

}

else

{

for(m=0;m<=*renshu-1;m++)

{

printf("%s,%d,%s,%4.1f,%4.1f,%4.1f,%5.1f\n",hao[m],*ban[m],ming[m],*fen[m][0],*fen[m][1],*fen[m][2],*fen[m][3]);

}

break;

}

}

}

void selet(int *ban[MAX],char *ming[MAX],char *hao[MAX],float *fen[MAX][4],int *renshu)

{

char panduan1[10],jueding[10];

int panduan2,i,m;

for(;;)

{

m=0;

scanf("%s",panduan1);

panduan2=atoi(panduan1);

for(i=0;i<=*renshu-1;i++)

{

if(strcmp(hao[i],panduan1)==0)

{

printf("%s,%d,%s,%4.1f,%4.1f,%4.1f,%5.1f\n",hao[i],*ban[i],ming[i],*fen[i][0],*fen[i][1],*fen[i][2],*fen[i][3]);

m=m+1;

}

else if(panduan2==*ban[i])

{

printf("%s,%d,%s,%4.1f,%4.1f,%4.1f,%5.1f\n",hao[i],*ban[i],ming[i],*fen[i][0],*fen[i][1],*fen[i][2],*fen[i][3]);

m=m+1;

}

}

if(m==0)

{

printf("there is no eligible student\n");

break;

}

printf("continue?\n");

scanf("%s",jueding);

if(strcmp(jueding,"no")==0)

break;

}

}

void order(int *ban[MAX],char *ming[MAX],char *hao[MAX],float *fen[MAX][4],int *renshu)

{

int i,k,q,m;

char c[10];

float f;

for(k=1;k<=*renshu-1;k++)

for(i=0;i<=*renshu-1-k;i++)

if(*ban[i]>*ban[i+1])

{

q=*ban[i];*ban[i]=*ban[i+1];*ban[i+1]=q;

strcpy(c,hao[i]);strcpy(hao[i],hao[i+1]);strcpy(hao[i+1],c);

strcpy(c,ming[i]);strcpy(ming[i],ming[i+1]);strcpy(ming[i+1],c);

for(m=0;m<=3;m++)

{

f=*fen[i][m];*fen[i][m]=*fen[i+1][m];*fen[i+1][m]=f;

}

}

for(k=1;k<=*renshu-1;k++)

for(i=0;i<=*renshu-1-k;i++)

if(*ban[k]==*ban[k+1])

if(*fen[k][3]<*fen[k+1][3])

{

q=*ban[i];*ban[i]=*ban[i+1];*ban[i+1]=q;

strcpy(c,hao[i]);strcpy(hao[i],hao[i+1]);strcpy(hao[i+1],c);

strcpy(c,ming[i]);strcpy(ming[i],ming[i+1]);strcpy(ming[i+1],c);

for(m=0;m<=3;m++)

{

f=*fen[i][m];*fen[i][m]=*fen[i+1][m];*fen[i+1][m]=f;

}

}

for(i=0;i<=*renshu-1;i++)

{

printf("%s,%d,%s,%4.1f,%4.1f,%4.1f,%5.1f\n",hao[i],*ban[i],ming[i],*fen[i][0],*fen[i][1],*fen[i][2],*fen[i][3]);

}



}

void output(int *ban[MAX],char *ming[MAX],char *hao[MAX],float *fen[MAX][4],int *renshu)

{

int i;

for(i=0;i<=*renshu-1;i++)

{

printf("%s,%d,%s,%4.1f,%4.1f,%4.1f,%5.1f\n",hao[i],*ban[i],ming[i],*fen[i][0],*fen[i][1],*fen[i][2],*fen[i][3]);

}

}

int main()

{

int *banji[MAX],*number,i,num,mingling;

char *xingming[MAX],*xuehao[MAX];

float *chengji[MAX][4];

struct Student

{

char Id[10];

char name[50];

int clas;

float score[4];

} student[MAX];

num=0;

for(i=0;i<=MAX-1;i++)

{

banji[i]=&student[i].clas;

xingming[i]=&student[i].name[0];

xuehao[i]=&student[i].Id[0];

chengji[i][0]=&student[i].score[0];

chengji[i][1]=&student[i].score[1];

chengji[i][2]=&student[i].score[2];

chengji[i][3]=&student[i].score[3];

}

number=#

for(;;)

{

printf("1.input\n2.delete\n3.select\n4.order\n5.output\n6.quit\nplease input your option\n");

scanf("%d",&mingling);

if(mingling==1)

input(banji,xingming,xuehao,chengji,number);

if(mingling==2)

del(banji,xingming,xuehao,chengji,number);

if(mingling==3)

selet(banji,xingming,xuehao,chengji,number);

if(mingling==4)

order(banji,xingming,xuehao,chengji,number);

if(mingling==5)

output(banji,xingming,xuehao,chengji,number);

if(mingling==6)

break;

}

return 0;

}
本站总访问量 您是第位访客