成绩管理系统V60.docx
《成绩管理系统V60.docx》由会员分享,可在线阅读,更多相关《成绩管理系统V60.docx(25页珍藏版)》请在冰豆网上搜索。
成绩管理系统V60
HarbinInstituteofTechnology
C语言实验大作业
课程名称:
C语言程序设计
报告类型:
程序设计报告
实验题目:
学生成绩管理系统v6.0
实验类型:
(综合设计型/创新研究型)
所在院系:
航天学院电子信息类
学生类别:
本科生
指导教师:
郭萍
学生姓名:
王福海
班级和学号:
电子信息五班1162100527
实验时间:
2017.5.20
成绩评定:
哈尔滨工业大学
1实验目的
将教材中所包含的内容系统化考察,考察一维、二维数组,函数的调用,排序、查找、统计分析等常用算法,指针,动态数组以及结构体的应用。
2实验内容和要求
1.实验内容
学生成绩管理系统V6.0。
某班有最多不超过30人(具体人数由键盘输入)参加最多不超过六门的考试(具体门数由键盘输入),定义结构体类型,用结构体数组作函数参数,编程实现学生成绩的管理。
2.实验要求
采用自顶向下、逐步求精的模块化设计思想设计小型数据库管理系统,对学生成绩进行管理。
要求按系统的需求分析、系统设计(总体设计、各个模块的设计)、系统实现(各个模块的实现)、系统测试等过程组织报告内容,说明采用了什么数据结构和算法,遇到哪些问题,这些问题是如何解决的,本设计的亮点和难点在哪里,实验结果如何,有哪些收获和学习体会。
3.系统功能需求分析
本系统主要实现下面的功能:
(1)录入每个学生的学号和考试成绩;
(2)计算每门课程的总分和平均分;
(3)计算每个学生的总分和平均分;
(4)按成绩由高到低排出名次表;
(5)按成绩由低到高排出名次表;
(6)按学号由小到大排出成绩表;
(7)按姓名字典的排序排出成绩表;
(8)按学号查询学生排名及其考试成绩;
(9)按姓名查询学生排名及其考试成绩;
(10)按优秀(90~100)、良好(80~89)、中等(70~79)、及格(60~69)、不及格(0~59)5个类别,统计每个类别的人数以及所占的百分比;
(11)输出每个学生学号姓名各科成绩及每门考试的总分平均分;
(12)将每个学生信息写入文件;
(13)从文件中读取每个学生信息并显示;
4.实验环境
采用win10操作系统,使用软件Dev-c++。
3系统设计
1.系统功能模块划分
2.主要算法
排序:
进行学生成绩的排序从而出现排名表
查找:
通过多种方式如学号,姓名查找特定学生的成绩
3.数据结构
退出
用户输入指令
4.各模块(函数)的功能和接口设计:
序号
函数名
函数功能
函数参数
1
Menu
显示菜单获得输入的选项
无
2
Readscore
录入学生信息
STUstu[],m,n
3
Aversumofeverystudent
计算每个学生总成绩平均值
STUstu[],m,n
4
Aversumofeverycourse
计算每门课程总成绩平均成绩
STUstu[],m,n
5
Sortbyscore
按成绩排序
STUstu[],m,n
6
Ascending
升序
floata,b
7
Descending
降序
floata,b
8
Assortbynum
按学号排序
STUstu[],m,n
9
Sortbyname
按姓名排序
STUstu[],m,n
10
Searchbynum
按学号查询学生信息
STUstu[],m,n
11
Searchbyname
按姓名查询学生信息
STUstu[],m,n
12
StatisticAnlysis(STUstu[],intn,intm)
分析学生成绩五个分数段所占百分比
STUstu[],m,n
13
PrintScore
打印输出学生成绩
STUstu[],m,n
14
WritetoFile
写入程序D盘student.txt
STUstu[],m,n
15
ReadfromFile
读取文件
STUstu[],m,n
4系统实现
1.系统的总流程图:
显示菜单——>输入用户的选择——>根据用户的输入选择不同的操作
case1:
Readscore(stu,n,m);
break;
case2:
Aversumofeverystudent(stu,n,m);
break;
case3:
Aversumofeverycourse(stu,n,m);
break;
case4:
Sortbyscore(stu,n,m,Descending);
printf("\n成绩降序排序\n");
Printscore(stu,n,m);
break;
case5:
Sortbyscore(stu,n,m,Ascending);
printf("\n成绩升序排序\n");
Printscore(stu,n,m);
break;
case6:
Assortbynum(stu,n,m);
printf("\n学号升序排序\n");
Printscore(stu,n,m);
break;
case7:
Sortbyname(stu,n,m);
printf("\n姓名升序排序\n");
Printscore(stu,n,m);
break;
case8:
Searchbynum(stu,n,m);
break;
case9:
Searchbyname(stu,n,m);
break;
case10:
StatisticAnlysis(stu,n,m);
break;
case11:
Printscore(stu,n,m);
break;
case12:
Writetofile(stu,n,m);
break;
case13:
Readfromfile(stu,&n,&m);
break;
case0:
printf("Endofprogram!
\n");
exit(0);
2.程序的全部源代码:
1#include
2#include
3#include
4typedefstructstudent
5{
6longnum;
7charname[10];
8floatscore[6];
9floatsum;
10floataver;
11}STU;
12intMenu(void);
13voidReadScore(STUstu[],intn,intm);
14voidAverSumofEveryStudent(STUstu[],intn,intm);
15voidAverSumofEveryCourse(STUstu[],intn,intm);
16voidSortbyScore(STUstu[],intn,intm,int(*compare)(floata,floatb));
17intAscending(floata,floatb);
18intDescending(floata,floatb);
19voidSwapFloat(float*x,float*y);
20voidSwapLong(long*x,long*y);
21voidSwapChar(charx[],chary[]);
22voidAsSortbyNum(STUstu[],intn,intm);
23voidSortbyName(STUstu[],intn,intm);
24voidSearchbyNum(STUstu[],intn,intm);
25voidSearchbyName(STUstu[],intn,intm);
26voidStatisticAnalysis(STUstu[],intn,intm);
27voidPrintScore(STUstu[],intn,intm);
28voidWritetoFile(STUstu[],intn,intm);
29voidReadfromFile(STUstu[],int*n,int*m);
30intmain()
31{
32charch;
33intn=0,m=0;
34
35STUstu[30];
36
37printf("Inputstudentnumber:
(lessthan30)\n");
38scanf("%d",&n);
39
40printf("Inputcoursenumber:
(lessthan6)\n");
41scanf("%d",&m);
42
43while
(1)
44{
45ch=Menu();
46switch(ch)
47{
48case1:
ReadScore(stu,n,m);
49break;
50case2:
AverSumofEveryCourse(stu,n,m);
51break;
52case3:
AverSumofEveryStudent(stu,n,m);
53break;
54case4:
SortbyScore(stu,n,m,Descending);
55printf("\nSortindescendingorderbyscore:
\n");
56PrintScore(stu,n,m);
57break;
58case5:
SortbyScore(stu,n,m,Ascending);
59printf("\nSortinascendingorderbyscore:
\n");
60PrintScore(stu,n,m);
61break;
62case6:
AsSortbyNum(stu,n,m);
63printf("\nSortinascendingorderbynumber:
\n");
64PrintScore(stu,n,m);
65break;
66case7:
SortbyName(stu,n,m);
67printf("\nSortindictionaryorderbyname:
\n");
68PrintScore(stu,n,m);
69break;
70case8:
SearchbyNum(stu,n,m);
71break;
72case9:
SearchbyName(stu,n,m);
73break;
74case10:
StatisticAnalysis(stu,n,m);
75break;
76case11:
PrintScore(stu,n,m);
77break;
78case12:
WritetoFile(stu,n,m);
79break;
80case13:
ReadfromFile(stu,&n,&m);
81break;
82case0:
printf("Endofprogram!
\n");
83exit(0);
84
85default:
printf("Inputerror!
\n");
86}
87}
88return0;
89}
90/*Menu:
显示菜单并获得用户键盘输入的选项*/
91intMenu(void)
92{
93inta;
94
95printf("ManagementforStudents'scores\n");
96printf("1.Inputrecord\n");
97printf("2.Caculatetotalandaveragescoreofeverycourse\n");
98printf("3.Caculatetotalandaveragescoreofeverystudent\n");
99printf("4.Sortindescendingorderbyscore\n");
100printf("5.Sortinascendingorderbyscore\n");
101printf("6.Sortinascendingorderbynumber\n");
102printf("7.Sortindictionaryorderbyname\n");
103printf("8.Searchbynumber\n");
104printf("9.Searchbyname\n");
105printf("10.Statisticanalysis\n");
106printf("11.Listrecord\n");
107printf("12.Writetoafile\n");
108printf("13.Readfromafile\n");
109printf("0.Exit\n");
110printf("PleaseInputyourchoice:
");
111
112scanf("%d",&a);
113
114returna;
115
116}
117/*input:
输入每个学生每门课的成绩*/
118voidReadScore(STUstu[],intn,intm)
119{
120inti,j,k;
121
122printf("Inputstudent'sID,nameandscore:
\n");
123
124for(i=0;i125{
126
127scanf("%ld%s",&stu[i].num,stu[i].name);
128
129for(j=0;j130{
131scanf("%f",&stu[i].score[j]);
132}
133
134}
135}
136/*AverSumofEveryStudent:
计算每个学生每门课的总分和平均分*/
137voidAverSumofEveryStudent(STUstu[],intn,intm)
138{
139inti,j;
140
141for(i=0;i142{
143stu[i].sum=0;
144
145for(j=0;j146{
147stu[i].sum=stu[i].sum+stu[i].score[j];
148}
149
150stu[i].aver=m>0?
stu[i].sum/m:
-1;
151
152printf("student%d:
sum=%.0f,aver=%.0f\n",i+1,stu[i].sum,stu[i].aver);
153}
154}
155/*AverSumofEveryCourse:
计算每门课程的总分和平均分*/
156voidAverSumofEveryCourse(STUstu[],intn,intm)
157{
158inti,j;
159floatsum[6],aver[6];
160
161for(j=0;j162{
163sum[j]=0;
164
165for(i=0;i166{
167sum[j]=sum[j]+stu[i].score[j];
168}
169
170aver[j]=n>0?
sum[j]/n:
-1;
171
172printf("course%d:
sum=%.0f,aver=%.0f\n",j+1,sum[j],aver[j]);
173}
174}
175/*SortbyScore:
将每个学生按总成绩排序*/
176voidSortbyScore(STUstu[],intn,intm,int(*compare)(floata,floatb))
177{
178inti,j,k,t;
179
180for(i=0;i181{
182k=i;
183
184for(j=i+1;j185{
186if((*compare)(stu[j].sum,stu[k].sum))
187k=j;
188}
189
190if(k!
=i)
191{
192for(t=0;t193{
194SwapFloat(&stu[k].score[t],&stu[i].score[t]);
195}
196
197SwapFloat(&stu[k].sum,&stu[i].sum);
198SwapFloat(&stu[k].aver,&stu[i].aver);
199SwapLong(&stu[k].num,&stu[i].num);
200SwapChar(stu[k].name,stu[i].name);
201}
202}
203}
204/*Ascending:
按照升序*/
205intAscending(floata,floatb)
206{
207returna
208}
209/*Descending:
按照降序*/
210intDescending(floata,floatb)
211{
212returna>b;
213}
214/*SwapFloat:
交换单精度浮点型数据*/
215voidSwapFloat(float*x,float*y)
216{
217floattemp;
218
219temp=*x;
220*x=*y;
221*y=temp;
222}
223/*SwapLong交换长整形数据*/
224voidSwapLong(long*x,long*y)
225{
226longtemp;
227
228temp=*x;
229*x=*y;
230*y=temp;
231}
232/*SwapChar交换字符型数据*/
233voidSwapChar(charx[],chary[])
234{
235chartemp[10];
236
237strcpy(temp,x);
238strcpy(x,y);
239strcpy(y,temp);
240}
241/*AsSortbyNum:
将学生按照学号顺序排列*/
242voidAsSortbyNum(STUstu[],intn,intm)
243{
244inti,j,k,t;
245
246for(i=0;i247{
248k=i;
249for(j=i+1;j250{
251if(stu[j].num252k=j;
253}
254if(k!
=i)
255{
256for(t=0;t257{
258SwapFloat(&stu[k].sum,&stu[i].sum);
259}
260
261SwapFloat(&stu[k].sum,&stu[i].sum);
262SwapFloat(&stu[k].aver,&stu[i].aver);
263SwapLong(&stu[k].num,&stu[i].num);
264SwapChar(stu[k].name,stu[i].name);
265}
266}
267}
268/*SortbyName:
将学生按照字典顺序排列*/
269voidSortbyName(STUstu[],intn,intm)
270{
271inti,j,t;
272
273for(i=0;i274{
275for(j=i+1;j276{
277if(strcmp(stu[j].name,stu[i].name)<0)
278{
279for(t=0;t280{
281SwapFloat(&stu[i].score[t],&stu[j].score[t]);
282}
283
284SwapFloat(&stu[i].sum,&stu[j].sum);
285SwapFloat(&stu[i].aver,&stu[j].aver);
286SwapLong(&stu[i].num,&stu[j].num);
287SwapChar(stu[i].name,stu[j].name);
288}
289}
290}
291}
292/*SearchbyNum:
按学号查找并打印学生成绩*/
293voidSearchbyNum(STUstu[],intn,intm)
294{
295longnumber;
296inti,j;
297
298printf("Inputthenumberyouwanttosearch");
299scanf("%ld",&number);
300
301for(i=0;i302{
303if(stu[i].num==number)
304{
305printf("%ld\t%s\t",stu[i].num,stu[i].name);
306
307for(j=0;j308{
3