目录
一 设计目的 1
二 课程设计的内容 1
三 需求分析 1
四 总体设计 2
五 详细设计 2
5.1各函数的功能和实现 2
六 调试分析 4
6.1源程序 4
6.2调试与测试 11
七 实验总结 12
一 设计目的
进一步加深、巩固所学专业课程(《C语言程序设计》)的基本理论知识,理论联系实际,进一步培养自己综合分析问题和解决问题的能力。掌握运用C语言独立地编写、调试应用程序和进行其它相关设计的技能。
二 课程设计的内容
对学生信息(包括学号、语文、数学、英语、平均分)进行管理,包括学生成绩的信息输入、输出、查询、删除、排序、统计、退出.将学生的成绩信息进行记录,信息内容包含:(1)学生的学号(2)学生的姓名(3)学生的成绩。假设,现收集到了一个班学生的所有成绩信息,要求用C语言编写一个简单的成绩管理系统,可进行录入、查询、修改和浏览等功能。学习相关开发工具和应用软件,熟悉系统建设过程。
三 需求分析
1、用C语言实现系统;
2、对学生信息(包括学号、姓名、语文、数学、英语、平均分)进行管理,包括学生成绩的信息输入、输出、查询、删除、排序、统计、退出.
3、学生信息包括:其内容较多,为了简化讨论,要求设计的管理系统能够完成以下功能:
(1) 每一条记录包括一个学生的学号、姓名、3门课成绩
(2)成绩信息录入功能:(成绩信息用文件保存,可以一次完成若干条记录的输入。)
(3)成绩信息显示浏览功能:完成全部学生记录的显示。
(4)查询功能:完成按姓名查找学生记录,并显示。
(5)成绩信息的删除:按学号进行删除某学生的成绩.
(6)排序功能:按学生平均成绩进行排序。
(7)应提供一个界面来调用各个功能,调用界面和各个功能的操作界面应尽可能清晰美观!
四 总体设计
根据系统需求,可将系统分为以下几个模块:
1、成绩录入功能模块
2、成绩输出功能模块
3、成绩查询功能模块
4、删除模块
5、排序功能模块
6、统计功能模块
7、退出系统
五 详细设计
5.1各函数的功能和实现
1、输入初始的学生信息:输入信息包括学生的姓名、学号以及学生的成绩等相关信息;可用函数void input(student *s)来实现此操作。
2、成绩输出模块:输出学生的信息以及成绩void output(student *s)通过学生的姓名来查看学生的相关成绩,同时也可以分别通过double avaragemath(student *s) 、double avarageenglish(student *s) 、double avarageclang(student *s) 和void Maxmath(student *s) void Maxenglish(student *s) void Maxclang(student *s) void Maxavarage(student *s)来输出成绩的平均分数、最高和最低分数。
3、成绩查询模块:可用void find(student *s) 来实现。找到就输出此学生全部信息。
4、成绩修改:用函数void alter(student *s)来实现
5、排序模块:用函数void sort(student *s)来实现
6、统计功能:用函数void count(student *s) 来实现
7、退出系统:可用一个函数exit()来实现,首先将信息保存到文件中,释放动态创建的内存空间,再退出此程序。
六 调试分析
6.1源程序
student.h
- #ifndef _STUDENT_H_
- #define _STUDENT_H_
- typedef struct StudentInfo
- {
- char no[8];
- char name[10];
- double math;
- double english;
- double clang;
- double score;
- double avarge;
- }student;
- #endif
``
main.cpp
``
```1. #include<stdio.h>
2. #include"student.h"
3. #define NUM 3
4. extern void menu(student *s);
5. int main()
6. {
7. student s[NUM];
8. menu(s);
9. return 0;
10. }
``
menu.cpp
1. #include<stdio.h>
2. #include<stdlib.h>
3. #include<string.h>
4. #include"student.h"
5. #define NUM 3
6. void select(char choice);//选择界面
7. void input(student *s);//成绩输入
8. void output(student *s);//成绩输出
9. void sort(student *s);//成绩排序
10. void find(student *s);//成绩查询
11. void alter(student *s);//成绩修改
12. void Maxmath(student *s);//高数成绩从高到低排序
13. void Maxenglish(student *s);//英语成绩从高到低排序
14. void Maxavarage(student *s);//平均分从高到低排序
15. void Maxclang(student *s);//C语言成绩从高到低排序
16. double avaragemath(student *s);//高数平均分
17. double avarageenglish(student *s);//英语平均分
18. double avarageclang(student *s);//C语言平均分
19. int countmath(student *s);//超过高数平均分人数
20. int countenglish(student *s);//超过英语平均分人数
21. int countclang(student *s);//超过C语言平均分人数
22. void count(student *s);//成绩统计
23. void menu(student *s)
24. {
25. while(1)
26. {
27. printf("\t\t------学生信息管理系统-----\n");
28. printf("\t\t\ta、成绩录入\n");
29. printf("\t\t\tb、成绩显示\n");
30. printf("\t\t\tc、成绩排序\n");
31. printf("\t\t\td、成绩修改\n");
32. printf("\t\t\te、成绩查询\n");
33. printf("\t\t\tf、成绩统计\n");
34. printf("\t\t\t0、结束程序\n");
35. printf("\t\t---------------------------\n");
36. char choice;
37. printf("\t\t请输入您的选择:\n");
38. scanf("%c",&choice);
39. getchar();
40. system("cls");
41. switch(choice)
42. {
43. case 'a':printf("\t\t\t成绩录入\n");
44. input(s);
45. break;
46. case 'b':printf("\t\t\t成绩显示\n");
47. output(s);
48. break;
49. case 'c':printf("\t\t\t成绩排序\n");
50. sort(s);
51. output(s);
52. break;
53. case 'd':printf("\t\t\t成绩修改\n");
54. alter(s);
55. break;
56. case 'e':printf("\t\t\t成绩查询\n");
57. find(s);
58. break;
59. case 'f':printf("\t\t\t成绩统计\n");
60. count(s);
61. break;
62. case '0':printf("\t\t欢迎您再次使用,再见!!\n");
63. exit(0);
64. break;
65. default :printf("\n对不起,您的选择有错误,请重新输入!!\n");
66. menu(s);
67. }//选择
68. }
69.
70. }
71. void input(student *s)
72. {
73. int i;
74. for(i=0;i<NUM;i++)
75. {
76. printf("输入学号:");
77. gets(s[i].no);
78. printf("输入姓名:");
79. gets(s[i].name);
80. printf("高数成绩:");
81. scanf("%lf",&s[i].math);
82. getchar();
83. printf("英语成绩:");
84. scanf("%lf",&s[i].english);
85. getchar();
86. printf("C语言成绩:");
87. scanf("%lf",&s[i].clang);
88. getchar();
89. printf("学分:");
90. scanf("%lf",&s[i].score);
91. getchar();
92. s[i].avarge=(s[i].math+s[i].english+s[i].clang)/3.0;
93. system("cls");
94. }
95. }
96. void output(student *s)
97. {
98. int i;
99. printf("\t学号\t姓名\t高数\t英语\tC语言\t学分\t平均分\n");
100. for(i=0;i<NUM;i++)
101. {
102. printf(" %8s ",s[i].no);
103. printf("%8s",s[i].name);
104. printf("\t%.0lf ",s[i].math);
105. printf("\t%.0lf ",s[i].english);
106. printf("\t%.0lf ",s[i].clang);
107. printf("\t%.0lf ",s[i].score);
108. printf("\t%.0lf ",s[i].avarge);
109. printf("\n");
110. }
111. }
112. void sort(student *s)
113. {
114. printf("\t\t1.按高数排序\n");
115. printf("\t\t2.按英语排序\n");
116. printf("\t\t3.按C语言排序\n");
117. printf("\t\t4.按平均分排序\n");
118. printf("\t请您输入您的选择\n");
119. char data;
120. scanf("%c",&data);
121. getchar();
122. system("cls");
123. switch(data)
124. {
125. case '1':Maxmath(s);
126. break;
127. case '2':Maxenglish(s);
128. break;
129. case '3':Maxclang(s);
130. break;
131. case '4':Maxavarage(s);
132. break;
133. }
134. }
135. void alter(student *s)
136. {
137. printf("\t\t请您输入您的密码:\n");
138. int i,flag=1;
139. char password[8];
140. gets(password);
141. getchar();
142. for (i = 0; i < NUM; i++)
143. {
144. flag = strcmp(password, s[i].no);
145. if (flag == 0)
146. {
147. printf("\t学号\t姓名\t高数\t英语\tC语言\t学分\t平均分\n");
148. printf(" %8s %8s", s[i].no, s[i].name);
149. printf("\t%.0lf\t%.0lf", s[i].math, s[i].english);
150. printf("\t%.0lf\t%.0lf", s[i].clang, s[i].score);
151. printf("\t%.0lf\n", s[i].avarge);
152. printf("\t请输入您想要改的课程\n");
153. printf("\t\t1.高数\n");
154. printf("\t\t2.英语\n");
155. printf("\t\t3.C语言\n");
156. char data;
157. scanf("%c", &data);
158. getchar();
159. switch (data)
160. {
161. case '1':printf("请输入成绩:");
162. scanf("%lf", &s[i].math);
163. getchar();
164. system("cls");
165. break;
166. case '2':printf("请输入成绩:");
167. scanf("%lf", &s[i].english);
168. getchar();
169. system("cls");
170. break;
171. case '3':printf("请输入成绩:");
172. scanf("%lf", &s[i].clang);
173. getchar();
174. system("cls");
175. break;
176. }
177. s[i].avarge = (s[i].math + s[i].english + s[i].clang) / 3.0;
178. printf("\t\t学号\t姓名\t高数\t英语\tC语言\t学分\t平均分\n");
179. printf("更改后: %8s %8s\t%.0lf", s[i].no, s[i].name, s[i].math);
180. printf("\t%.0lf\t%.0lf", s[i].english, s[i].clang);
181. printf("\t%.0lf\t%.0lf\n", s[i].score, s[i].avarge);
182. }
183. }
184. if (flag == 1)
185. printf("密码错误!!!");
186. }
187. void find(student *s)
188. {
189. printf("\t\t查询方式\n");
190. printf("\t1.按学号查询学生记录\n");
191. printf("\t2.查询不及格学生记录\n");
192. char data;
193. scanf("%c",&data);
194. getchar();
195. int i;
196. switch(data)
197. {
198. case '1':printf("请输入您的学号:");
199. int flag;
200. char password[8];
201. gets(password);
202. for(i=0;i<50;i++)
203. {
204. flag=strcmp(password,s[i].no);
205. if (flag == 0)
206. {
207. printf("\t学号\t姓名\t高数\t英语\tC语言\t学分\t平均分\n");
208. printf(" %8s %8s", s[i].no, s[i].name);
209. printf("\t%.0lf\t%.0lf", s[i].math, s[i].english);
210. printf("\t%.0lf\t%.0lf", s[i].clang, s[i].score);
211. printf("\t%.0lf\n", s[i].avarge);
212. }
213. }
214. break;
215. case '2':
216. for(i=0;i<NUM;i++)
217. {
218. if(s[i].math<60||s[i].english<60||s[i].clang<60)
219. {
220. printf("\t学号\t姓名\t高数\t英语\tC语言\t学分\t平均分\n");
221. printf(" %8s %8s", s[i].no, s[i].name);
222. printf("\t%.0lf\t%.0lf", s[i].math, s[i].english);
223. printf("\t%.0lf\t%.0lf", s[i].clang, s[i].score);
224. printf("\t%.0lf\n", s[i].avarge);
225. }
226. }
227. break;
228. }
229. }
230. void count(student *s)
231. {
232. printf("\t\t1.成绩最高学生信息\n");
233. printf("\t\t2.每门课程平均成绩\n");
234. printf("\t\t3.超过平均成绩的学生人数\n");
235. char data;
236. scanf("%c",&data);
237. getchar();
238. switch(data)
239. {
240. case '1':printf("\t\t学号\t姓名\t高数\t英语\tC语言\t学分\t平均分\n");
241. Maxmath(s);
242. printf("高数最高: %8s %8s\t%.0lf",s[0].no,s[0].name,s[0].math);
243. printf("\t%.0lf\t%.0lf", s[0].english,s[0].clang);
244. printf("\t%.0lf\t%.0lf\n",s[0].score,s[0].avarge);
245. Maxenglish(s);
246. printf("英语最高: %8s %8s\t%.0lf",s[0].no,s[0].name,s[0].math);
247. printf("\t%.0lf\t%.0lf", s[0].english, s[0].clang);
248. printf("\t%.0lf\t%.0lf\n",s[0].score,s[0].avarge);
249. Maxclang(s);
250. printf("c语言最高: %8s %8s\t%.0lf",s[0].no,s[0].name,s[0].math);
251. printf("\t%.0lf\t%.0lf", s[0].english, s[0].clang);
252. printf("\t%.0lf\t%.0lf\n",s[0].score,s[0].avarge);
253. break;
254. case '2':printf("高数平均分: %.0lf\n",avaragemath(s));
255. printf("英语平均分: %.0lf\n",avarageenglish(s));
256. printf("C语言平均分:%.0lf\n",avarageclang(s));
257. break;
258. case '3':printf("超过高数平均分人数:%d\n",countmath(s));
259. printf("超过英语平均分人数:%d\n",countenglish(s));
260. printf("超过C语言平均人数:%d\n",countclang(s));
261. break;
262. }
263. }
264. void Maxmath(student *s)
265. {
266. char c[8];
267. double t,r;
268. int i,j;
269. for(i=1;i<NUM;i++)
270. for(j=0;j<NUM-i;j++)
271. if(s[j].math<s[j+1].math)
272. {
273. strcpy(c,s[j].no);
274. strcpy(s[j].no,s[j+1].no);
275. strcpy(s[j+1].no,c);
276. strcpy(c,s[j].name);
277. strcpy(s[j].name,s[j+1].name);
278. strcpy(s[j+1].name,c);
279. r=s[j].math;
280. s[j].math=s[j+1].math;
281. s[j+1].math=r;
282. r=s[j].clang;
283. s[j].clang=s[j+1].clang;
284. s[j+1].clang=r;
285. r=s[j].english;
286. s[j].english=s[j+1].english;
287. s[j+1].english=r;
288. t=s[j].score;
289. s[j].score=s[j+1].score;
290. s[j+1].score=t;
291. t=s[j].avarge;
292. s[j].avarge=s[j+1].avarge;
293. s[j+1].avarge=t;
294. }
295. }
296. void Maxenglish(student *s)
297. {
298. char c[8];
299. double t, r;
300. int i, j;
301. for (i = 1; i<NUM; i++)
302. for (j = 0; j<NUM - i; j++)
303. if (s[j].english<s[j + 1].english)
304. {
305. strcpy(c, s[j].no);
306. strcpy(s[j].no, s[j + 1].no);
307. strcpy(s[j + 1].no, c);
308. strcpy(c, s[j].name);
309. strcpy(s[j].name, s[j + 1].name);
310. strcpy(s[j + 1].name, c);
311. r = s[j].math;
312. s[j].math = s[j + 1].math;
313. s[j + 1].math = r;
314. r = s[j].clang;
315. s[j].clang = s[j + 1].clang;
316. s[j + 1].clang = r;
317. r = s[j].english;
318. s[j].english = s[j + 1].english;
319. s[j + 1].english = r;
320. t = s[j].score;
321. s[j].score = s[j + 1].score;
322. s[j + 1].score = t;
323. t = s[j].avarge;
324. s[j].avarge = s[j + 1].avarge;
325. s[j + 1].avarge = t;
326. }
327. }
328. void Maxclang(student *s)
329. {
330. char c[8];
331. double t,r;
332. int i,j;
333. for(i=1;i<NUM;i++)
334. for(j=0;j<NUM-i;j++)
335. if(s[j].clang<s[j+1].clang)
336. {
337. strcpy(c,s[j].no);
338. strcpy(s[j].no,s[j+1].no);
339. strcpy(s[j+1].no,c);
340. strcpy(c,s[j].name);
341. strcpy(s[j].name,s[j+1].name);
342. strcpy(s[j+1].name,c);
343. r=s[j].math;
344. s[j].math=s[j+1].math;
345. s[j+1].math=r;
346. r=s[j].clang;
347. s[j].clang=s[j+1].clang;
348. s[j+1].clang=r;
349. r=s[j].english;
350. s[j].english=s[j+1].english;
351. s[j+1].english=r;
352. t=s[j].score;
353. s[j].score=s[j+1].score;
354. s[j+1].score=t;
355. t=s[j].avarge;
356. s[j].avarge=s[j+1].avarge;
357. s[j+1].avarge=t;
358. }
359. }
360. void Maxavarage(student *s)
361. {
362. char c[8];
363. double t,r;
364. int i,j;
365. for(i=1;i<NUM;i++)
366. for(j=0;j<NUM-i;j++)
367. if(s[j].avarge<s[j+1].avarge)
368. {
369. strcpy(c,s[j].no);
370. strcpy(s[j].no,s[j+1].no);
371. strcpy(s[j+1].no,c);
372. strcpy(c,s[j].name);
373. strcpy(s[j].name,s[j+1].name);
374. strcpy(s[j+1].name,c);
375. r=s[j].math;
376. s[j].math=s[j+1].math;
377. s[j+1].math=r;
378. r=s[j].clang;
379. s[j].clang=s[j+1].clang;
380. s[j+1].clang=r;
381. r=s[j].english;
382. s[j].english=s[j+1].english;
383. s[j+1].english=r;
384. t=s[j].score;
385. s[j].score=s[j+1].score;
386. s[j+1].score=t;
387. t=s[j].avarge;
388. s[j].avarge=s[j+1].avarge;
389. s[j+1].avarge=t;
390. }
391. }
392. double avaragemath(student *s)
393. {
394. int i;
395. double avarage=0;
396. for(i=0;i<NUM;i++)
397. avarage+=s[i].math;
398. return avarage/NUM;
399. }
400. double avarageenglish(student *s)
401. {
402. int i;
403. double avarage=0;
404. for(i=0;i<NUM;i++)
405. avarage+=s[i].english;
406. return avarage/NUM;
407. }
408. double avarageclang(student *s)
409. {
410. int i;
411. double avarage=0;
412. for(i=0;i<NUM;i++)
413. avarage+=s[i].clang;
414. return avarage/NUM;
415. }
416. int countmath(student *s)
417. {
418. int i, count = 0;
419. for(i=0;i<NUM;i++)
420. if(s[i].math>avaragemath(s))
421. count++;
422. return count;
423. }
424. int countenglish(student *s)
425. {
426. int i, count = 0;
427. for(i=0;i<NUM;i++)
428. if(s[i].english>avarageenglish(s))
429. count++;
430. return count;
431. }
432. int countclang(student *s)
433. {
434. int i, count = 0;
435. for(i=0;i<NUM;i++)
436. if(s[i].clang>avarageclang(s))
437. count++;
438. return count;
439. }