资源描述
Harbin Institute of Technology
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.数据结构
输出每个学生学号姓名各科成绩及每门考试的总分平均分
按成绩由高到低排出名次表
计算每个学生的总分和平均分
计算每门课程的总分和平均分
录入每个学生的学号和考试成绩
按成绩由低到高排出名次表
按姓名字典的排序排出成绩表
按学号查询学生排名及其考试成绩
按姓名查询学生排名及其考试成绩
5个类别,统计每个类别的人数以及所占的百分比
按学号由小到大排出成绩表
将每个学生信息写入文件从文件中读取每个学生信息并显示
退出
用户输入指令
4.各模块(函数)的功能和接口设计:
序号
函数名
函数功能
函数参数
1
Menu
显示菜单获得输入的选项
无
2
Readscore
录入学生信息
STU stu[], m,n
3
Aversumofeverystudent
计算每个学生总成绩平均值
STU stu[], m,n
4
Aversumofeverycourse
计算每门课程总成绩平均成绩
STU stu[], m,n
5
Sortbyscore
按成绩排序
STU stu[], m,n
6
Ascending
升序
floata,b
7
Descending
降序
floata,b
8
Assortbynum
按学号排序
STU stu[], m,n
9
Sortbyname
按姓名排序
STU stu[], m,n
10
Searchbynum
按学号查询学生信息
STU stu[], m,n
11
Searchbyname
按姓名查询学生信息
STU stu[], m,n
12
StatisticAnlysis(STU stu[], int n, int m)
分析学生成绩五个分数段所占百分比
STU stu[], m,n
13
PrintScore
打印输出学生成绩
STU stu[], m,n
14
WritetoFile
写入程序 D盘student.txt
STU stu[], m,n
15
ReadfromFile
读取文件
STU stu[], m,n
4 系统实现
1.系统的总流程图:
显示菜单—-〉输入用户的选择--〉根据用户的输入选择不同的操作
case 1:
Readscore(stu,n,m);
break;
case 2:
Aversumofeverystudent(stu ,n,m);
break;
case 3:
Aversumofeverycourse(stu ,n,m);
break;
case 4:
Sortbyscore(stu ,n,m,Descending);
printf(”\n成绩降序排序\n”);
Printscore( stu ,n, m);
break;
case 5:
Sortbyscore(stu ,n,m,Ascending);
printf("\n成绩升序排序\n");
Printscore( stu ,n, m);
break;
case 6:
Assortbynum( stu , n, m);
printf(”\n学号升序排序\n”);
Printscore( stu ,n, m);
break;
case 7:
Sortbyname( stu , n, m);
printf("\n姓名升序排序\n”);
Printscore( stu ,n, m);
break;
case 8:
Searchbynum( stu , n, m);
break;
case 9:
Searchbyname( stu , n, m);
break;
case 10:
StatisticAnlysis( stu , n, m);
break;
case 11:
Printscore( stu ,n, m);
break;
case 12:
Writetofile(stu,n,m);
break;
case 13:
Readfromfile(stu,&n,&m);
break;
case 0:
printf(”End of program!\n”);
exit(0);
2. 程序的全部源代码:
1 #include <stdio.h〉
2 #include 〈stdlib。h〉
3 #include 〈string。h〉
4 typedef struct student
5 {
6 long num;
7 char name[10];
8 float score[6];
9 float sum;
10 float aver;
11 }STU;
12 int Menu(void);
13 void ReadScore(STU stu[],int n, int m);
14 void AverSumofEveryStudent(STU stu[],int n,int m);
15 void AverSumofEveryCourse(STU stu[],int n,int m);
16 void SortbyScore(STU stu[],int n,int m,int (*compare)(float a,float b));
17 int Ascending(float a,float b);
18 int Descending(float a,float b);
19 void SwapFloat(float *x,float *y);
20 void SwapLong(long *x,long *y);
21 void SwapChar (char x[],char y[]);
22 void AsSortbyNum(STU stu[],int n,int m);
23 void SortbyName(STU stu[],int n,int m);
24 void SearchbyNum(STU stu[],int n,int m);
25 void SearchbyName(STU stu[],int n,int m);
26 void StatisticAnalysis(STU stu[],int n,int m);
27 void PrintScore(STU stu[],int n,int m);
28 void WritetoFile(STU stu[],int n,int m);
29 void ReadfromFile(STU stu[],int *n,int *m);
30 int main()
31 {
32 char ch;
33 int n=0,m=0;
34 STU stu[30];
35 printf(”Input student number:(less than 30)\n");
36 scanf(”%d”,&n);
37 printf("Input course number:(less than 6)\n”);
38 scanf("%d",&m);
39 while(1)
40 {
41 ch = Menu();
42 switch(ch)
43 {
44 case 1: ReadScore(stu,n,m);
45 break;
46 case 2: AverSumofEveryCourse(stu,n,m);
47 break;
48 case 3: AverSumofEveryStudent(stu,n,m);
49 break;
50 case 4: SortbyScore(stu,n,m,Descending);
51 printf(”\nSort in descending order by score:\n");
52 PrintScore(stu,n,m);
53 break;
54 case 5: SortbyScore(stu,n,m,Ascending);
55 printf("\nSort in ascending order by score:\n”);
56 PrintScore(stu,n,m);
57 break;
58 case 6: AsSortbyNum(stu,n,m);
59 printf(”\nSort in ascending order by number:\n”);
60 PrintScore(stu,n,m);
61 break;
62 case 7: SortbyName(stu,n,m);
63 printf("\nSort in dictionary order by name:\n");
64 PrintScore(stu,n,m);
65 break;
66 case 8: SearchbyNum(stu,n,m);
67 break;
68 case 9: SearchbyName(stu,n,m);
69 break;
70 case 10:StatisticAnalysis(stu,n,m);
71 break;
72 case 11:PrintScore(stu,n,m);
73 break;
74 case 12:WritetoFile(stu,n,m);
75 break;
76 case 13:ReadfromFile(stu,&n,&m);
77 break;
78 case 0: printf(”End of program!\n");
79 exit(0);
80 default:printf(”Input error!\n”);
81 }
82 }
83 return 0;
84 }
85 /*Menu:显示菜单并获得用户键盘输入的选项 */
86 int Menu(void)
87 {
88 int a;
89 printf("Management for Students’scores\n");
90 printf(”1.Input record\n”);
91 printf(”2。Caculate total and average score of every course\n");
92 printf(”3。Caculate total and average score of every student\n");
93 printf(”4.Sort in descending order by score\n”);
94 printf(”5。Sort in ascending order by score\n”);
95 printf("6.Sort in ascending order by number\n”);
96 printf(”7。Sort in dictionary order by name\n");
97 printf(”8.Search by number\n”);
98 printf("9。Search by name\n");
99 printf("10。Statistic analysis\n”);
100 printf(”11.List record\n");
101 printf(”12。Write to a file\n”);
102 printf(”13.Read from a file\n");
103 printf(”0.Exit\n”);
104 printf(”Please Input your choice:");
105 scanf(”%d”,&a);
106 return a;
107 }
108 /*input:输入每个学生每门课的成绩*/
109 void ReadScore(STU stu[],int n,int m)
110 {
111 int i,j,k;
112 printf("Input student's ID,name and score:\n”);
113 for(i=0;i〈n;i++)
114 {
115 scanf(”%ld %s”,&stu[i]。num,stu[i]。name);
116 for(j=0;j〈m;j++)
117 {
118 scanf("%f”,&stu[i]。score[j]);
119 }
120 }
121 }
122 /* AverSumofEveryStudent:计算每个学生每门课的总分和平均分*/
123 void AverSumofEveryStudent(STU stu[],int n,int m)
124 {
125 int i,j;
126 for(i=0;i〈n;i++)
127 {
128 stu[i].sum = 0;
129 for(j=0;j〈m;j++)
130 {
131 stu[i].sum = stu[i].sum + stu[i].score[j];
132 }
133 stu[i]。aver = m>0 ? stu[i]。sum/m:—1;
134 printf(”student %d: sum=%.0f,aver=%。0f\n”,i+1,stu[i].sum,stu[i]。aver);
135 }
136 }
137 /*AverSumofEveryCourse:计算每门课程的总分和平均分*/
138 void AverSumofEveryCourse(STU stu[],int n,int m)
139 {
140 int i,j;
141 float sum[6],aver[6];
142 for(j=0;j〈m;j++)
143 {
144 sum[j] = 0;
145 for(i=0;i〈n;i++)
146 {
147 sum[j]=sum[j]+stu[i]。score[j];
148 }
149 aver[j] = n〉0?sum[j]/n : -1;
150 printf("course %d:sum=%。0f,aver=%.0f\n”,j+1,sum[j],aver[j]);
151 }
152 }
153 /* SortbyScore:将每个学生按总成绩排序*/
154 void SortbyScore(STU stu[],int n, int m,int(*compare)(float a,float b))
155 {
156 int i,j,k,t;
157 for(i=0;i〈n-1;i++)
158 {
159 k=i;
160 for(j=i+1;j〈n;j++)
161 {
162 if((*compare)(stu[j]。sum,stu[k].sum))
163 k=j;
164 }
165 if(k!=i)
166 {
167 for(t=0;t<m;t++)
168 {
169 SwapFloat(&stu[k]。score[t],&stu[i].score[t]);
170 }
171 SwapFloat(&stu[k]。sum,&stu[i].sum);
172 SwapFloat(&stu[k]。aver,&stu[i].aver);
173 SwapLong(&stu[k]。num,&stu[i]。num);
174 SwapChar(stu[k]。name,stu[i]。name);
175 }
176 }
177 }
178 /* Ascending:按照升序*/
179 int Ascending(float a,float b)
180 {
181 return a〈b;
182 }
183 /* Descending:按照降序 */
184 int Descending(float a,float b)
185 {
186 return a〉b;
187 }
188 /* SwapFloat:交换单精度浮点型数据 */
189 void SwapFloat(float *x,float *y)
190 {
191 float temp;
192 temp = *x;
193 *x = *y;
194 *y = temp;
195 }
196 /* SwapLong交换长整形数据 */
197 void SwapLong(long *x,long *y)
198 {
199 long temp;
200 temp = *x;
201 *x = *y;
202 *y = temp;
203 }
204 /* SwapChar交换字符型数据 */
205 void SwapChar(char x[],char y[])
206 {
207 char temp[10];
208 strcpy(temp,x);
209 strcpy(x,y);
210 strcpy(y,temp);
211 }
212 /* AsSortbyNum:将学生按照学号顺序排列 */
213 void AsSortbyNum(STU stu[],int n,int m)
214 {
215 int i,j,k,t;
216 for(i=0;i<n—1;i++)
217 {
218 k=i;
219 for(j=i+1;j<n;j++)
220 {
221 if(stu[j]。num<stu[k].num)
222 k=j;
223 }
224 if(k!=i)
225 {
226 for(t=0;t〈m;t++)
227 {
228 SwapFloat(&stu[k]。sum,&stu[i].sum);
229 }
230 SwapFloat(&stu[k].sum,&stu[i]。sum);
231 SwapFloat(&stu[k]。aver,&stu[i]。aver);
232 SwapLong(&stu[k].num,&stu[i]。num);
233 SwapChar(stu[k].name,stu[i].name);
234 }
235 }
236 }
237 /* SortbyName:将学生按照字典顺序排列 */
238 void SortbyName(STU stu[],int n,int m)
239 {
240 int i,j,t;
241 for(i=0;i<n—1;i++)
242 {
243 for(j=i+1;j〈n;j++)
244 {
245 if(strcmp(stu[j]。name,stu[i].name)<0)
246 {
247 for(t=0;t〈m;t++)
248 {
249 SwapFloat(&stu[i].score[t],&stu[j]。score[t]);
250 }
251 SwapFloat(&stu[i]。sum,&stu[j].sum);
252 SwapFloat(&stu[i]。aver,&stu[j]。aver);
253 SwapLong(&stu[i]。num,&stu[j]。num);
254 SwapChar(stu[i].name,stu[j].name);
255 }
256 }
257 }
258 }
259 /* SearchbyNum:按学号查找并打印学生成绩 */
260 void SearchbyNum(STU stu[],int n,int m)
261 {
262 long number;
263 int i,j;
264 printf("Input the number you want to search");
265 scanf(”%ld”,&number);
266 for(i=0;i<n;i++)
267 {
268 if(stu[i].num == number)
269 {
270 printf("%ld\t%s\t",stu[i]。num,stu[i]。name);
271 for(j=0;j〈m;j++)
272 {
273 printf("%。0f\t”,stu[i].score[j]);
274 }
275 printf(”%。0f\t%.0f\n”,stu[i]。sum,stu[i].aver);
276 return;
277 }
278 }
279 printf(”\nNot found! \n");
280 }
281 /* SearchbyName:按名字查找并打印学生成绩 */
282 void SearchbyName(STU stu[],int n,int m)
283 {
284 char x[10];
285 int i,j;
286 printf(”Input the name you want to search”);
287 scanf("%s",x);
288 for(i=0;i<n;i++)
289 {
290 if(strcmp(stu[i]。name,x)==0)
291 {
292 printf("%ld\t%s\t”,stu[i].num,stu[i]。name);
293 for(j=0;j〈m;j++)
294 {
295 printf(”%.0f\t",stu[i]。score[j]);
296 }
297 printf("%。0f\t%.0f\n”,stu[i].sum,stu[i].aver);
298 return;
299 }
300 }
301 printf(”\nNot found!\n”);
302 }
303 /* StatisticAnalysis:统计各分段的学生及其所占百分比 */
304 void StatisticAnalysis(STU stu[],int n,int m)
305 {
306 int i,j,total,t[6];
307 for(j=0;j〈m;j++)
308 {
309 printf(”For course %d:\n”,j+1);
310 memset(t,0,sizeof(t)); /*将数组t的元素全部初始化为0*/
311 for(i=0;i〈n;i++)
312 {
313 if(stu[i].score[j]〉=0&&stu[i]。score[j]<60) t[0]++;
314 else if(stu[i]。score[j]<70) t[1]++;
315 else if(stu[i]。score[j]〈80) t[2]++;
316 else if(stu[i].score[j]〈90) t[3]++;
317 else if(stu[i].score[j]<100) t[4]++;
318 else if(stu[i].score[j]==100) t[5]++;
319 }
320 for(total=0,i=0;i〈=5;i++)
321 {
322 total=total+t[i];
323 }
324 for(i=0;i〈=5;i++)
325 {
326 if(i==0)
327 printf(”<60\t%d\t%.2f%%\n”,t[i],(float)t[i]/n*100);
328 else if(i==5)
329 printf("%d\t%d\t%。2f%%\n", (i+5)*10,t[i],(float)t[i]/n*100);
330 else
331 printf("%d-%d\t%d\t%。2f%%\n”,(i+5)*10,(i+5)*10+9,t[i],(float)t[i]/n*100);
332 }
333 }
334 }
335 /* PrintScore:打印输出学生成绩 */
336 void PrintScore(STU stu[],int n,int m)
337 {
338 int i,j;
339 for(i=0;i〈n;i++)
340 {
341 printf("%ld\t%s\t”,stu[i]。num,stu[i]。name);
342 for(j=0;j<m;j++)
343 {
344 printf("%。0f\t",stu[i]。score[j]);
345 }
346 printf("%。0f\t%。0f\n”,stu[i]。sum,stu[i]。aver);
347 }
348 }
349 /* WritetoFile:写入程序 student.txt */
350 void WritetoFile(STU stu[],int n,int m)
351 {
352 FILE *fp;
353 int i,j;
354 if((fp=fopen(”student.txt”,"w”)) == NULL)
355 {
356
展开阅读全文