资源描述
内蒙古科技大学
本科生课程设计说明书
题 目:C语言课程设计
—— 学生成绩管理系统
学生姓名:郭**
学 号:
专 业:计算机科学和技术
班 级:计科-2
指导老师:刘立新
日 期: 12月25日
内蒙古科技大学课程设计任务书
课程名称
C语言课程设计
设计题目
学生成绩管理系统
指导老师
刘立新
时间
.1.5——.1.9
一、教学要求
1. 巩固和加深学生对C语言课程基础知识了解和掌握
2. 掌握C语言编程和程序调试基础技能
3. 利用C语言进行基础软件设计
4. 掌握书写程序设计说明文档能力
5. 提升利用C语言处理实际问题能力
二、设计资料及参数
每个学生在老师提供课程设计题目中任意选择一题,独立完成,题目选定后不可更换。
某班学生成绩管理,包含以下功效:
v 从键盘输入包含学号、姓名、各门课程成绩(不少于5门),并将其保留在磁盘文件里
v 打开文件后,计算每个人总分和平均分,排序并保留
v 含有单项查询或多项查询功效(即根据给定关键字,如姓名找出满足条件纪录)
v 含有插入、删除和修改功效
v 含有输出文件数据信息功效
三、设计要求及结果
1. 分析课程设计题目标功效需求(可选择数组或链表实现,可多人(最多3人)协作完成一个题目)
2. 写出具体设计说明(最少包含功效实现分析和模块步骤图)
3. 编写程序代码,调试程序使其能正确运行(代码书写要规范,标示符要见名知意,要有必需注释,每人最少500行代码,不包含注释和花括号)
4. 设计完成软件要便于操作和使用
5. 设计完成后提交课程设计汇报(请严格根据模板进行排版)
四、进度安排
第一天 选择课程设计题目,分析课题要求
第二天 编程
第三天 编程及调试
第四天 写课程设计汇报
第五天 提交课程设计汇报(打印稿及电子稿)
五、评分标准
1. 依据平时上机考勤、表现和进度,老师将天天点名和检验
2. 依据课程设计完成情况,必需有可运行软件。
3. 依据课程设计汇报质量,如有雷同,则全部雷同全部些人均判为不及格。
六、提议参考资料
1.《C语言程序设计》,谭浩强,清华大学出版社
2.《C语言程序设计课程设计》,刘振安,机械工业出版社
目 录
内蒙古科技大学课程设计任务书 I
第一章 需求分析 3
1.1 引言 3
1.2 任务概述 3
1.3 数据描述 3
1.4 功效需求 3
1.5 性能需求 3
1.6 运行需求 4
1.7 任务计划 4
第二章 概要设计 4
2.1 总体设计 4
2.2 数据类型设计(或数据结构设计) 5
2.3 接口设计 //函数申明 5
2.4 运行界面设计 6
第三章 具体设计 7
3.1 输入模块设计 7
3.2 输出模块设计 7
3.3 查找模块设计 8
3.4 排序模块设计 8
3.5 保留及读取模块设计 9
第四章 测试分析 10
4.1 测试程序实施情况 10
第五章 课程设计总结 14
附录:程序代码 15
参考文件 32
致谢 32
第一章 需求分析
1.1 引言
因学校中学生信息庞大,复杂,为了方便老师们管理学生信息,特编写了一个学生成绩管理系统。
1.2 任务概述
1. 目标
本学生成绩管理系统关键是为学校里老师提供一个管理学生信息平台。依据系统界面提醒信息对学生信息进行添加、浏览、修改、保留等操作。
2.运行环境
Windows系统
3. 用户特点
知道部分基础电脑操作即可。
4. 条件限制
计算机一台
1.3 数据描述
系统数据类型有:整型int,实型float,字符型char,结构体struct;
自己定义数据类型有:STU;
1.4 功效需求
v 从键盘输入包含学号、姓名、各门课程成绩(不少于5门),并将其保留在磁盘文件里
v 打开文件后,计算每个人总分和平均分,排序并保留
v 含有单项查询或多项查询功效(即根据给定关键字,如姓名找出满足条件纪录)
v 含有插入、删除和修改功效
含有输出文件数据信息功效
1.5 性能需求
无
1.6 运行需求
1. 硬件环境
一般计算机
2. 软件环境
支持操作系统包含windows98/xp及及以上版本
1.7 任务计划
本系统共分为一个主页面模块(主函数部分),五个功效模块(功效函数)分别为增加学生成绩信息、查看学生成绩信息、修改学生成绩信息、对学生信息进行排序、退出。设计时要先写好主函数、定义好全局变量和功效函数,再对五个功效函数进行设计。在每个功效函数和主函数应加入控制条件使用户能够随时退出系统,并在用户输入指令错误时候给提醒和退出选项。
第二章 概要设计
2.1 总体设计
程序运行
退出
排序
修改
浏览
添加
2.2 数据类型设计(或数据结构设计)
typedef struct student//定义结构体
{
long ID;//学生学号
char name[MAX_LEN];//学生姓名
float score[COURSE_NUM];//学生成绩
float sum;//总分
float aver;//平均分
}STU;
对学生信息采取一个结构体变量,使学生信息管理愈加灵活方便
2.3 接口设计
函数名
函数格式 //即函数首部
函数功效
menu
int
主菜单
sum_stu
int
求和
return_ID
int
经过学号返回数组下标
return_name
int
经过姓名返回数组下标
Search_Name
void
按姓名查找
Search_ID
void
按学号查找
scorefence
void
信息栏
writefile
void
写入文件
readfromfile
void
读出文件
modifymenu
void
修改菜单
modifyscore
void
修改成绩
delete_stu
void
删除学生
sortmenu
void
排序菜单
sort_ID
void
按学号排序
sort_score
void
按成绩排序
sort_aver
void
按平均分排序
sort_sum
void
按总分排序
readscore
void
读取信息
printscore
void
输出信息
searchmenu
void
搜索菜单
2.4 运行界面设计
首页
查询界面
第三章 具体设计
3.1 输入模块设计
开始
输入学生个数
输入学生信息
成功
返回菜单
3.2 输出模块设计
开始
输出信息
返回菜单
3.3 查找模块设计
开始
选择查找方法
按姓名查找
按学号查找
学生信息
返回菜单
3.4排序模块设计
开始
选择排序方法
按总分数排序
按成绩排序
按学号排序
学生信息
3.5 保留及读取模块设计
开始程序
使用、修改信息
保留
创建或读取文件
退出程序
第四章 测试分析
4.1 测试程序实施情况
主菜单
添加信息
查看学生信息
修改学生信息
查询犯错
查询结果
排序结果
第五章 课程设计总结
经过此次课程设计,使我愈加扎实掌握了相关C语言方面知识,在设计过程中即使碰到了部分问题,但经过一次又一次思索,一遍又一遍检验最终找出了原因所在,也暴露出了前期我在这方面知识欠缺和经验不足。实践出真知,经过亲自动手编写,使我们掌握知识不再是纸上谈兵。
过而能改,善莫大焉。在课程设计过程中,我们不停发觉错误,不停更正,不停领悟,不停获龋最终检测调试步骤,本身就是在践行“过而能改,善莫大焉”知行观。这次课程设计最终顺利完成了,在设计中碰到了很多问题,最终在老师指导下,最终游逆而解。在以后社会发展和实践过程中,一定要不懈努力,不能碰到问题就想到要退缩,一定要不厌其烦发觉问题所在,然后一一进行处理,只有这么,才能成功做成想做事,才能在以后道路上劈荆斩棘,而不是知难而退,那样永远不可能收获成功,收获喜悦,也永远不可能得到社会及她人对你认可!
附录:程序代码
1. #include <stdio.h>
2. #include <stdlib.h>
3. #include <string.h>
4. #include <windows.h>
5. #define MAX_LEN 10
6. #define STU_NUM 30
7. #define COURSE_NUM 5
8. int num=0;
9. typedef struct student//定义结构体
10. {
11. long ID;
12. char name[MAX_LEN];
13. float score[COURSE_NUM];
14. float sum;
15. float aver;
16. }STU;
17. int menu(void);//主菜单
18. int sum_stu(STU stu[]);// 求和
19. int return_ID(STU stu[],long ID);//经过学号返回数组下标
20. int return_name(STU stu[],char name[]);//经过姓名返回数组下标
21. void Search_Name(STU stu[]);//按姓名查找
22. void Search_ID(STU stu[]);//按学号查找
23. void scorefence();//信息栏
24. void writefile(STU stu[]);//写入文件
25. void readfromfile(STU stu[]);//读出文件
26. void modifymenu(STU stu[],int i);//修改菜单
27. void modifyscore(STU stu[],int i);//修改成绩
28. void delete_stu(STU stu[],int i);//删除学生
29. void sortmenu(STU stu[]);//排序菜单
30. void sort_ID(STU stu[]);//按学号排序
31. void sort_score(STU stu[],int m);//按成绩排序
32. void sort_aver(STU stu[]);//按平均分排序
33. void sort_sum(STU stu[]);//按总分排序
34. void readscore(STU stu[],int n);// 读取信息
35. void printscore(STU stu[],int n);// 输出信息
36. void searchmenu(STU stu[]);// 搜索菜单
37. int main()
38. {
39. int n;
40. char ch;
41. STU stu[STU_NUM];
42. readfromfile(stu);
43. while (1)
44. {
45. ch = menu();
46. switch(ch)
47. {
48. case 1:
49. system("cls");
50. printf("\n --------------添加学生信息----------------\n");
51. printf("输入学生个数:\n");
52. scanf("%d",&n);
53. readscore(stu,n);
54. break;
55. case 2:
56. system("cls");
57. printf("\n --------------查看学生信息----------------\n\n");
58. printscore(stu,num);
59. break;
60. case 3:
61. system("cls");
62. printf("\n--------------------修改学生信息-----------------\n");
63. searchmenu(stu);
64. break;
65. case 4:
66. system("cls");
67. printf("\n----------------------排序-----------------------\n");
68. sortmenu(stu);
69. break;
70. case 5:
71. printf("程序结束!\n");
72. exit(0);
73. default:
74. printf("输入错误!请重新输入\n");
75. Sleep(1000);
76. system("cls");
77. }
78. writefile(stu);
79. }
80. return 0;
81. }
82. int menu()//主菜单
83. {
84. int ch;
85. printf("\n ------------------ 学生成绩管理系统------------------\n");
86. printf(" 1. 增加学生成绩信息\n");
87. printf(" 2. 查看学生成绩信息\n");
88. printf(" 3. 修改学生成绩信息\n");
89. printf(" 4. 对学生信息进行排序\n");
90. printf(" 5. 退出\n");
91. printf("\n -----------------------------------------------------\n");
92. printf("请选择(1-5):");
93. scanf("%d",&ch);
94. return ch;
95. }
96. void readscore(STU stu[],int n)// 读取信息
97. {
98. int j,a;
99. a=num;
100. printf("\n");
101. printf("输入学生学号、姓名、成绩\n");
102. printf("比如: 王小明 99 88 77 44 100\n");
103. printf("\n");
104. while(num<a+n)
105. {
106. scanf("%ld %s",&stu[num].ID,stu[num].name);
107. for(j=0;j<COURSE_NUM;j++)
108. {
109. scanf(" %f",&stu[num].score[j]);
110. }
111. stu[num].sum=sum_stu(stu);
112. stu[num].aver=stu[num].sum/COURSE_NUM;
113. num++;
114. }
115. getchar();
116. if(num!=0)
117. {
118. printf("\n添加完成!\n");
119. }
120. else
121. {
122. printf("\n添加失败!\n");
123. }
124. printf("回车返回主菜单\n");
125. getchar();
126. system("cls");
127. }
128. void printscore(STU stu[],int num)// 输出信息
129. {
130. int i,j;
131. scorefence();
132. for(i=0;i<num;i++)
133. {
134. printf("%5d ",i+1);
135. printf("%10ld%10s",stu[i].ID,stu[i].name);
136. for(j=0;j<COURSE_NUM;j++)
137. {
138. printf("%9.2f",stu[i].score[j]);
139. }
140. printf("%8.2f%8.2f\n",stu[i].aver,stu[i].sum);
141. }
142. getchar();
143. printf("\n回车返回主菜单\n");
144. getchar();
145. system("cls");
146. }
147. int sum_stu(STU stu[])// 求和
148. {
149. int i,sum;
150. for(i=0;i<COURSE_NUM;i++)
151. {
152. sum=sum+stu[num].score[i];
153. }
154. return sum;
155. }
156. void searchmenu(STU stu[])// 搜索菜单
157. {
158. int ch;
159. printf(" 1.按学号查找\n");
160. printf(" 2.按姓名查找\n");
161. printf("请选择\n");
162. scanf("%d",&ch);
163. if(ch==1)
164. {
165. Search_ID(stu);
166. }
167. else if(ch==2)
168. {
169. Search_Name(stu);
170. }
171. getchar();
172. system("cls");
173. }
174. void Search_Name(STU stu[])//按姓名查找
175. {
176. char search_name[MAX_LEN],ch;
177. int i,j,a;
178. while(1)
179. {
180. printf("输入你要查找姓名:\n");
181. scanf("%s",search_name);
182. system("cls");
183. i=return_name(stu,search_name);
184. if(i==-1)
185. {
186. printf("学生不存在!\n");
187. }
188. else
189. {
190. a=i;
191. printf("你要查询学生信息为:\n");
192. scorefence();
193. printf("%5d %10ld%10s",i,stu[i].ID,stu[i].name);
194. for(j=0;j<COURSE_NUM;j++)
195. {
196. printf("%9.2f",stu[i].score[j]);
197. }
198. printf("%8.2f%8.2f\n",stu[i].aver,stu[i].sum);
199. modifymenu(stu,a);
200. }
201. printf("是否继续?(y/n)");
202. scanf(" %c",&ch);
203. if(ch=='n'||ch=='N')
204. {
205. break;
206. }
207. }
208. }
209. void Search_ID(STU stu[])//按学号查找
210. {
211. long search_ID;
212. int i,j,a;
213. char ch;
214. while(1)
215. {
216. printf("输入你要查找学号:\n");
217. scanf("%ld",&search_ID);
218. system("cls");
219. i=return_ID(stu,search_ID);
220. if(i==-1)
221. {
222. printf("学生不存在!\n");
223. }
224. else
225. {
226. a=i;
227. printf("你要查询学生信息为:\n");
228. scorefence();
229. printf("%5d %10ld%10s",i,stu[i].ID,stu[i].name);
230. for(j=0;j<COURSE_NUM;j++)
231. {
232. printf("%9.2f",stu[i].score[j]);
233. }
234. printf("%8.2f%8.2f\n",stu[i].aver,stu[i].sum);
235. modifymenu(stu,a);
236. }
237. printf("是否继续?(y/n)");
238. scanf(" %c",&ch);
239. if(ch=='n'||ch=='N')
240. {
241. break;
242. }
243. }
244. }
245. void scorefence()//信息栏
246. {
247. int i;
248. printf("%6s%10s%10s","序号","学号","姓名");
249. for(i=1;i<=COURSE_NUM;i++)
250. {
251. printf("%8s","成绩");
252. printf("%d",i);
253. }
254. printf("%8s%8s\n","均分","总分");
255. printf("-------------------------------------------------------------------------------------------\n");
256. }
257. void writefile(STU stu[])//写入文件
258. {
259. FILE *fp;
260. int i;
261. if((fp=fopen("student.txt","wb"))==NULL)
262. {
263. printf("不能打开文件!\n");
264. return ;
265. }
266. if (fwrite(&num,sizeof(int),1,fp)!=1)
267. {
268. printf("写入文件错误!\n");
269. }
270. for(i=0;i<num;i++)
271. {
272. if(fwrite(&stu[i],sizeof(STU),1,fp)!=1)
273. {
274. printf("写入文件错误!\n");
275. }
276. }
277. fclose(fp);
278. }
279. void readfromfile(STU stu[])//读出文件
280. {
281. FILE *fp;
282. int i;
283. if ((fp=fopen("student.txt","rb"))==NULL)
284. {
285. printf("不能打开文件!\n");
286. return;
287. }
288. if (fread(&num,sizeof(int),1,fp)!=1)
289. {
290. num=-1;
291. }
292. else
293. {
294. for(i=0;i<num;i++)
295. {
296. fread(&stu[i],sizeof(STU),1,fp);
297. }
298. }
299. fclose(fp);
300. }
301. void modifymenu(STU stu[],int i)//修改菜单
302. {
303. int ch;
304. printf("\n");
305. printf("1.修改学号\n");
306. printf("2.修改姓名\n");
307. printf("3.修改成绩\n");
308. printf("4.删除\n");
309. scanf("%d",&ch);
310. switch(ch)
311. {
312. case 1:
313. printf("输入新学号\n");
314. scanf("%ld",&stu[i].ID);
315. break;
316. case 2:
317. printf("输入新姓名\n");
318. scanf("%s",stu[i].name);
319. break;
320. case 3:
321. printf("输入新成绩\n");
322. modifyscore(stu,i);
323. break;
324. case 4:
325. delete_stu(stu,i);
326. break;
327. default:
328. printf("输入错误!请重新输入\n");
329. Sleep(1000);
330. system("cls");
331. }
332. }
333. void modifyscore(STU stu[],int i)//修改成绩
334. {
335. int j;
336. for(j=0;j<COURSE_NUM;j++)
337. {
338. scanf(" %f",&stu[i].score[j]);
339. }
340. for(j=0,stu[i].sum=0;j<COURSE_NUM;j++)
341. {
342. stu[i].sum=stu[i].sum+stu[i].score[j];
343. }
344. stu[i].aver=stu[i].sum/COURSE_NUM;
345. }
346. void delete_stu(STU stu[],int i)//删除学生
347. {
348. for (i;i<num-1;i++)
349. {
350. stu[i]=stu[i+1];
351. }
352. num--;
353. }
354. void sortmenu(STU stu[])//排序菜单
355. {
356. int ch;
357. printf("选择排序方法\n");
358. printf("1.按学号排序\n");
359. printf("2.按科目1排序\n");
360. printf("3.按科目2排序\n");
361. printf("4.按科目3排序\n");
362. printf("5.按科目4排序\n");
363. printf("6.按科目5排序\n");
364. printf("7.按均分排序\n");
365. printf("8.按总分排序\n");
366. printf("请选择:\n");
367. scanf("%d",&ch);
368. switch(ch)
369. {
370. case 1:
371. sort_ID(stu);
372. system("cls");
373. printscore(stu,num);
374. break;
375. case 2:
376. sort_score(stu,0);
377. system("cls");
378. printscore(stu,num);
379. break;
380. case 3:
381. sort_score(stu,1);
382. system("cls");
383. printscore(stu,num);
384. break;
385. case 4:
386. sort_score(stu,2);
387. system("cls");
388. printscore(stu,num);
389. break;
390. case 5:
391. sort_score(stu,3);
392.
展开阅读全文