1、Harbin Institute of Technology C语言实验大作业 课程名称: C语言程序设计 报告类型: 程序设计报告 实验题目: 学生成绩管理系统v6。0 实验类型: (综合设计型/创新研究型) 所在院系: 航天学院电子信息类 学生类别: 本科生 指导教师: 郭萍 学生姓名: 王福海 班级和学号: 电子信息五班 1162100527 实验时间: 2017。5.20 成绩评定: 哈尔滨工业大学 1 实验目的 将教材中所包含的内容系统化考察,考察一维、二维数组,函数的调
2、用,排序、查找、统计分析等常用算法,指针,动态数组以及结构体的应用。 2 实验内容和要求 1。实验内容 学生成绩管理系统V6。0。某班有最多不超过30人(具体人数由键盘输入)参加最多不超过六门的考试(具体门数由键盘输入),定义结构体类型,用结构体数组作函数参数,编程实现学生成绩的管理。 2。实验要求 采用自顶向下、逐步求精的模块化设计思想设计小型数据库管理系统,对学生成绩进行管理.要求按系统的需求分析、系统设计(总体设计、各个模块的设计)、系统实现(各个模块的实现)、系统测试等过程组织报告内容,说明采用了什么数据结构和算法,遇到哪些问题,这些问题是如何解决的,本设计的亮点和难点在哪里
3、实验结果如何,有哪些收获和学习体会. 3.系统功能需求分析 本系统主要实现下面的功能: (1)录入每个学生的学号和考试成绩; (2)计算每门课程的总分和平均分; (3)计算每个学生的总分和平均分; (4) 按成绩由高到低排出名次表; (5) 按成绩由低到高排出名次表; (6) 按学号由小到大排出成绩表; (7) 按姓名字典的排序排出成绩表; (8) 按学号查询学生排名及其考试成绩; (9) 按姓名查询学生排名及其考试成绩; (10) 按优秀(90~100)、良好(80~89)、中等(70~79)、及格(60~69)、不及格(0~59)5个类别,统计每个类别的人数以及所
4、占的百分比; (11) 输出每个学生学号姓名各科成绩及每门考试的总分平均分; (12) 将每个学生信息写入文件; (13) 从文件中读取每个学生信息并显示; 4。实验环境 采用win10操作系统,使用软件Dev-c++。 3 系统设计 1. 系统功能模块划分 学生成绩管理系统 按姓名排序 按学号排序 录 入 成 绩 录入文件读取文件 标 准 分 析 排 名 排 序 计算总分平均分 按学生成绩排名 每个学生 每门课 五个档次 2。 主要算法 排序:进行学生成绩的排序从而出现排名表 查找:通过多种方式如学号,姓名查找特定学生
5、的成绩 3.数据结构 输出每个学生学号姓名各科成绩及每门考试的总分平均分 按成绩由高到低排出名次表 计算每个学生的总分和平均分 计算每门课程的总分和平均分 录入每个学生的学号和考试成绩 按成绩由低到高排出名次表 按姓名字典的排序排出成绩表 按学号查询学生排名及其考试成绩 按姓名查询学生排名及其考试成绩 5个类别,统计每个类别的人数以及所占的百分比 按学号由小到大排出成绩表 将每个学生信息写入文件从文件中读取每个学生信息并显示 退出 用户输入指令 4.各模块(函数)的功
6、能和接口设计: 序号 函数名 函数功能 函数参数 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
7、 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 Writet
8、oFile 写入程序 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;
9、 case 3: Aversumofeverycourse(stu ,n,m); break; case 4: Sortbyscore(stu ,n,m,Descending); printf(”\n成绩降序排序\n”); Printscore( stu ,n, m); break; case 5:
10、 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);
11、 break; case 7: Sortbyname( stu , n, m); printf("\n姓名升序排序\n”); Printscore( stu ,n, m); break; case 8: Searchbynum( stu , n, m); break; case 9:
12、 Searchbyname( stu , n, m); break; case 10: StatisticAnlysis( stu , n, m); break; case 11: Printscore( stu ,n, m); break; case 12: Writetofile(stu,n,
13、m);
break;
case 13:
Readfromfile(stu,&n,&m);
break;
case 0:
printf(”End of program!\n”);
exit(0);
2. 程序的全部源代码:
1 #include 14、def 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,i 15、nt 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[ 16、],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 17、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 18、 {
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 19、 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 20、 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 21、 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 22、 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 23、 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:显示菜单并获得用户键盘输入的选项 24、 */
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 25、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。 26、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:输入每个学生每门课的成绩*/
1 27、09 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[ 28、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 29、].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 30、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 % 31、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 32、 {
162 if((*compare)(stu[j]。sum,stu[k].sum))
163 k=j;
164 }
165 if(k!=i)
166 {
167 for(t=0;t 33、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;
34、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 35、 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 }
36、212 /* AsSortbyNum:将学生按照学号顺序排列 */
213 void AsSortbyNum(STU stu[],int n,int m)
214 {
215 int i,j,k,t;
216 for(i=0;i 37、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 38、]。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 39、 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( 40、&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 41、
263 int i,j;
264 printf("Input the number you want to search");
265 scanf(”%ld”,&number);
266 for(i=0;i 42、 {
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 SearchbyNa 43、me(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 44、me);
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 /* Sta 45、tisticAnalysis:统计各分段的学生及其所占百分比 */
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++)
46、
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 47、 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 48、 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 49、 }
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 50、]);
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
©2010-2025 宁波自信网络信息技术有限公司 版权所有
客服电话:4009-655-100 投诉/维权电话:18658249818