1、课 程 设 计 报 告课程名称 C语言课程设计 课题名称 学生成绩管理系统 专 业 机械设计制造及其自动化 班 级 0783班 学 号 200713090301 姓 名 施逸楠 指导教师 王 颖 2008年 07月 11日湖南工程学院课 程 设 计 任 务 书课程名称 C语言课程设计 课 题 学生成绩管理系统 专业班级 机械设计及其自动化0783班 学生姓名 施逸楠 学 号 200713090301 指导老师 王 颖 审 批 王 颖 任务书下达日期 2008 年 06 月 20 日任务完成日期 2008 年 07 月 11 日C程序课程设计任务书一 课程设计性质与目的: C 语言程序设计是一门
2、实践性很强的课程。 C程序课程设计是学习C语言程序设计的非常重要的实践环节,通过本课程设计使学生进一步巩固课堂所学,全面熟悉、掌握C语言程序设计的基本方法和技巧,进一步提高编写程序、阅读分析程序及上机操作、调试程序的能力,让学生加深理解书本上所学的知识,提高动手操作的能力以及分析问题和解决问题的能力。加深对C语言课程所学知识的理解,进一步巩固C语言语法规则。学会编制结构清晰、风格良好、数据结构适当的语言程序,从而具备解决综合性实际问题的能力。二 课程设计包含知识点: 1,掌握并熟练运用C语言的基本数据类型与各种表达式,程序的流程控制语句。 2,掌握数组的基本概念。熟练掌握一维数组和二维数组的使
3、用,掌握字符数组与字符串的关系以及字符串的简单处理,会分析、编写利用数组进行数据存储和处理的简单程序。 3,熟练掌握指针、地址、指针类型、void指针类型、空指针等概念,熟练掌握指针变量的定义和初始化、指针的间接访问、指针的加减运算和指针表达式,掌握指针与数组、函数、字符串、自由空间等的联系,了解引用变量、值传送、引用传送的概念,掌握引用参数的使用。 4,掌握函数的定义,函数的返回值,函数的调用,函数的形式参数和实际参数之间的关系;掌握变量的作用域与生存期,了解函数的作用域。 5,掌握结构的概念,结构类型的定义,结构变量的定义和初始化,结构成员的表示,结构的赋值含义,结构与指针、函数的关系。三
4、 课程设计要求: 1,学生从以下八个题目中任意选择并完成一个题目。要求每个学生能独立思考认真并按时完成本课程设计所包含的所有内容。2,要求学生必须按照课程设计报告的完整格式说明设计内容,设计任务分析过程和算法,给出程序流程图和全部源程序,并做出总结。3设计报告的完整格式应包括以下部分的内容:l 设计总体思路l 主程序及各个模块说明l 总体模块框图l 各个程序模块说明l 程序流程图l 程序清单l 总结与体会四 时间安排:7月7日到7月11日上午(8:0012:00)下午(14:0018:00)晚上(6:30-10:30)7月7日7月8 日上机编程与调试7月9 日上机编程与调试7月10 日7月11
5、 日上机调试与课题答辩五 课程设计考核办法: 根据学生所完成课程设计报告的完整性,准确性,和算法实现质量,分为优,良,中, 及格,和不及格 五个等级。六 课程设计指导老师:王颕七 课程设计题目:学生成绩管理系统一、设计内容与设计要求1设计内容:课题名称:学生成绩管理系统1、问题描述:对一个有N个学生的班级,每个学生有M门课程。该系统实现对班级成绩的录入、显示、修改、排序等操作的管理。2、功能要求:本程序利用数组和指针完成对学生成绩的动态管理,其基本功能模块图如图所示:主程序初始化录入显示保存查找修改计算排序退出基本功能模块1)采用一个结构体数组,每个数据的结构应当包括:学号、姓名、M门课程名称
6、。2)本系统显示这样的菜单:请选择系统功能项:a、 成绩录入b、 成绩显示c、 成绩保存d、 成绩查找(要求先输入密码)e、 成绩修改f、 成绩计算g、 成绩排序h、 退出系统3)执行一个具体的功能之后,程序将重新显示菜单。3、算法提示:1)数据结构:结构体类型数组。2)数据库结构:该系统的基本数据库如下姓名学号课程名称1课程名称2 总分名次CharCharfloatFloat4、测试数据:学生人数N=10、课程门数M=4、课程名:数学、语文、英语、计算机对该系统有兴趣的同学可以在实现上述基本功能后,完善系统的其它功能。2设计要求:1,学生从四个题目中选择并完成一个题目。通过本次课程设计,掌握
7、结构化程序设计的主体思想,以自顶向下逐步求精的方法编制程序解决一些实际的问题,为将来编写软件积累一些典型的案例处理经验。要求每个学生能独立思考认真并按时完成本课程设计所包含的所有内容。2,要求学生必须按照课程设计报告的完整格式说明设计内容,设计任务分析过程和算法,给出程序流程图和全部源程序,并做出总结。3按本任务书的要求,编写课程设计报告(Word文档格式)。并用A4的复印纸打印并装订;设计报告的完整格式应包括以下部分的内容:l 设计总体思路l 主程序及各个模块说明l 总体模块框图l 各个程序模块说明l 程序流程图l 程序清单l 总结与体会 42008年7月5日之前,请各班学习委员收齐课程设计
8、报告交余新宇老师。二、进度安排第 十七周 星期一 14:3018:30 星期三14:3018:30 星期五14:3018:30 目 录1、 课题的主要功能62、 需求分析73、 概要设计8 3、1 程序的抽象数据类型的定义 3、2 程序的模块组成以及各个模块的功能8 3、3 课题的总体数据结构和数据库结构94、 详细设计10 4、1 采用C语言定义相关的数据类型104、2 各模块的类C码算法105、 函数的调用关系图166、 程序调试176、1 创建文件菜单176、2 程序主菜单176、3 成绩输入调试图及流程图187、 总结228、 附件229、 评分表35一、 课题的主要功能:对一个有学生
9、的班级学生的成绩进行计算机管 理,通过该系统实现对该班级学生成绩的基本功能的管理。二、 需求分析l 输入输出的要求系统显示这样的菜单:请选择系统功能项:1. Add2. Delete3. Question4. Modify5. Save0Escape三、 概要设计a) 程序的抽象数据类型的定义课程数据结构:课程 英语;数学;C语言;b) 程序的模块组成以及各个模块的功能程序的模块组成: 主函数 void main(); 学生成绩输入函数:Add(); 学生成绩显示函数:Disp();删除学生资料函数:Del(); 查询学生资料函数:Qur(); 修改学生资料函数:Modify(); 保存学生资
10、料函数:Save(); 统计学生成绩函数:Tongji(); 学生成绩排序函数:Sort();各函数的主要功能描述如下: 成绩输入函数Add(): 用于输入本班级学生的各门成绩,要求对应学生学号,学生的相应课程名称。学生成绩显示函数Disp ():用于实现对本班级学生的各门成绩及平均成绩、总成绩的输出显示。学生学号、学生姓名、性别、学生相应课程的成绩相对应。删除学生资料函数Del():用于实现对本班级学生的成绩资料的删除。资料包括学生学号、学生姓名、性别、学生相应课程的成绩及平均成绩、总成绩。 查询学生资料函数Qur(): 用于实现对本班级学生的成绩资料的查询。资料包括学生学号、学生姓名、性别
11、、学生相应课程的成绩及平均成绩、总成绩。 修改学生资料函数Modify():用于实现对本班级学生的成绩资料的修改。资料包括学生学号、学生姓名、性别、学生相应课程的成绩及平均成绩、总成绩。保存学生资料函数Save():用于实现对本班级学生的成绩资料的保存。资料包括学生学号、学生姓名、性别、学生相应课程的成绩及平均成绩、总成绩。统计学生成绩函数Tongji():用于实现对本班级学生的成绩资料的统计。主要统计学生成绩总分、平均分及各科成绩最高分。学生成绩排序函数Sort(): 用于实现对本班级学生的成绩进行排序。c) 课题的总体数据结构和数据库结构由于是班级数据,数据多、数据结构相似的特点,很自然的
12、会用数组实现数据的存储。该课题操纵的总体数据结构是文件类型的数据,文件的记录为结构体数据,数据库结构用文件来实现。需要存储的数据有:输入的成绩,各科成绩最高分,每位同学的总分和平均分。四、 详细设计a) 采用C语言定义相关的数据类型学生数据结构:Struct student Char num10; Char name20; Char sex4; int cgrade; int mgrade; int egrade; int totle; int ave; Char neartime10; 链接结构: Typedef struct node struct student data; struct
13、 node*next; Node,*Link;b) 各模块的类C码算法定位函数:Node*LocateNode*Locate()定义定位指针r;if(与学号一致)指针指向链表下以 内容;While(指针没有指到链表尾)if(与要查询的号码一致)返回指针r; R链接到r链表的下一内容; Else if(与姓名一致) 指针指向链表下以 内容; While(指针没有指到链表尾) if(与要查询的姓名一致)返回指针r; r指向r链表的下一内容; 返回0; 成绩输入函数:Add():void Add()定义3个定位指针p、r、s;定义字符型数组num; r=l; 将l指向链表的下个内容赋值给s; Whi
14、le(指针没有指到链表尾) 将指针置于最末尾; While(1) Printf(“输入学号(以0返回上一级菜单:)”); 给字符型变量num赋值; If(输入为0) 结束; While(s)If(输入的号码与已存在的号码比较结果为0) printf(=提示:学号为%s的学生已经存在,若要修改请你选择4 修改!n,num); 调用函数printstart(); printc(); printe(s); printstart(); printf(n); 返回; S链接到s 链表的下一内容; 将(Node *)malloc(sizeof(Node)赋值给p; 使p链接到data的num,并将num的
15、值赋值给p; 输入姓名;输入性别;输入c语言成绩;输入数学成绩;输入英语成绩;使p链接到data的totle,将c语言成绩、数学成绩、英语成绩累加并赋值给totle,使p连接到data的totle;使p链接到data的ave,将totle除以3得到的值赋值给ave;使p链接到链表尾;使r链接到p;r=p;shoudsave=1; 成绩查询函数:Qur(): void Qur() 定义整型变量 Sel;定义字符型数组Findmess;定义定位指针p;If(l不指向下一内容) printf(n=提示:没有资料可以查询!n); 返回; printf(n=1按学号查找n=2按姓名查找n); 给变量Se
16、l赋值; If(按学号查找) printf(请你输入要查找的学号:);给变量Findmess赋值;将Locate(l,findmess,num)赋值给p;If(p)printf(tttt查找结果n);调用函数printstart(); printc(); printe(p); printstart();else Nofind(); else if(按姓名查找) printf(请你输入要查找的姓名:); 给变量Findmess赋值;将Locate(l,findmess,num)赋值给p;If(p)printf(tttt查找结果n);调用函数printstart(); printc(); prin
17、te(p); printstart();else Nofind(); else Wrong(); 成绩删除函数:Del (): void Del() 定义整型变量 Sel;定义字符型数组Findmess;定义定位指针p、r;If(l不指向下一内容) printf(n=提示:没有资料可以删除!n);返回; printf(n=1按学号删除n=2按姓名删除n);给变量Sel赋值; If(按学号删除) printf(请你输入要删除的学号:);给变量Findmess赋值;将Locate(l,findmess,num)赋值给p;If(p)r=l;while(r链接到下一个内容不为p)r链接到r链表的下一内
18、容;将p链接到的下一内容赋值给r链接到的下一内容;free(p); printf(n=提示:该学生已经成功删除!n); shoudsave=1; else Nofind(); else if(按姓名删除) printf(请你输入要删除的姓名:); 给变量Findmess赋值;将Locate(l,findmess,num)赋值给p;If(p)r=l;while(r链接到下一个内容不为p)r链接到r链表的下一内容;将p链接到的下一内容赋值给r链接到的下一内容;free(p); printf(n=提示:该学生已经成功删除!n); shoudsave=1; else Nofind(); else Wr
19、ong(); 成绩修改函数:Modify ():定义定位指针p;定义字符型数组Findmess;If(l不指向下一内容)printf(n=提示:没有资料可以修改!n);返回;printf(请你输入要修改的学生学号:);给变量Findmess赋值;将Locate(l,findmess,num)赋值给p;If(p)printf(请你输入新学号(原来是%s):,p链接到data的num);给p链接到data的num赋值;printf(请你输入新姓名(原来是%s):,p链接到data的name);给p链接到data的name赋值;从键盘输入;printf(请你输入新性别(原来是%s):,p链接到dat
20、a的sex);给p链接到data的sex赋值;printf(请你输入新的c语言成绩(原来是%d分):, p链接到data的cgrade);给p链接到data的cgrade赋值;从键盘输入;printf(请你输入新的数学成绩(原来是%d分):, p链接到data的mgrade); 给p链接到data的mgrade赋值; 从键盘输入; printf(请你输入新的英语成绩(原来是%d分):, p链接到data的egrade); 给p链接到data的egrade赋值; 使p链接到data的totle,将c语言成绩、数学成绩、英语成绩累加并赋值给totle,使p连接到data的totle;使p链接到da
21、ta的ave,将totle除以3得到的值赋值给ave;printf(n=提示:资料修改成功!n); shoudsave=1; else Nofind(); 成绩显示函数:Disp ():定义字符型count并赋初值为0;定义定位指针p;将l链接到的下一内容赋值给p;if(!p) printf(n=提示:没有资料可以显示!n);返回;printf(tttt显示结果n);调用函数printstart(); printc(); printf(n); while(p) printe(p);将p链接到的下一内容赋值给p;调用函数printstart(); printf(n);五、函数的调用关系图main
22、函数的下属子功能函数及其调用示意图:Void main()Add()Disp ()Del ()Qur()Save()Modify()Modify()六、 程序调试 1、创建文件菜单 2、程序主菜单3、成绩输入调试图及流程图NN开始输入s0=nn+1=n输入tS=1?S=2?S=3?studentsn.chinese=tstudentsn.math=tstudentsn.english=t结束YNYY七、总结 通过此次课程设计,让我的知识水平从理论上升到实践上,而且理论也更加系统化、规范化.同时,我也从中深刻体会到C语言功能的强大,以及它的结构化、模块化等特点.就此次我选择的题目学生成绩管理系统
23、来讲,我的感想主要有以下几个方面:1. 充分认识到结构类型在实际中重要性通常,我们在书本上解决一些小问题,运用基本数据类型就足够了,但在实际中,例如日常生活一些需要填写的表格,这些表格集合了各种标准的数据类型,无法用任一种基本数据类型完全描述.此时,我们便需要引用结构数据类型,它将我们需要的各种数据类型集于一体.正如在这个学生成绩管理系统中,巧妙的构造了多种结构体,从而将实际遇到的各个数据类型准确、有序的表示出来,而对这些数据进行初始化、引用时只需灵活使用成员运算符即可,十分方便、快捷!2. 深刻体会到使用循环以及循环嵌套的必要性 在程序设计时,我们经常会遇到一些复杂但有规律的重复运算,这时运
24、用各种循环和循环嵌套就显得很有必要.像此程序的统计函数中,就使用了if语句限制执行语句的条件;又如在各个输入语句中,用while或do-while语句做外部循环,而执行语句中使用if-else嵌套控制输入条件.这些都是十分经典的循环控制结构,都使我深刻感受到循环的奇妙无穷.3. 进一步领会到函数在整个程序中的基础地位C语言具有模块化的特点,而这一特点正是通过函数的调用来实现的。在此程序中,先自定义了学生成绩输入学生成绩显示删除学生资料查询学生资料修改学生资料保存学生资料统计学生成绩学生成绩排序等函数,再通过主函数一一调用连接成一个整体。总之,我认为合理设计一个程序,须经过以下步骤:1.详细阅读
25、设计内容和要求。2.根据实际需要定义结构变量和结构数组。3.将整个设计内容分割成几个有机的模块,每个模块通过自定义函数或库函数实现。4.通过主函数的调用将其统一成一个完整的程序。5.仔细审查每个模块乃至语句,修正并使其最优化。6.上机调试并运行成功。自己对C语言掌握的并不很理想,在进行课程设计的时候,对于用户的需求分析不足,程序在初步调试的时候出了很多问题,还有就是我对一些基本知识理解的不足,后通过老师的指点和同学们的帮助,在规定的时间内我这个程序达到了老师要求实现的功能。但由于时间匆忙,加上我对编程的基本知识和技巧不熟练,本程序还有一些细节上的问题有待改进。以上,是我此次课程设计的一些感想和
26、认识,如有不当之出,请批评指正!八、 附录 1参考书目 2源程序清单 学生成绩管理源代码*Peng G.* #include stdio.h #include stdlib.h #include string.h int shoudsave=0; struct student char num10; char name20; char sex4; int cgrade; int mgrade; int egrade; int totle; int ave; char neartime10; ; typedef struct node struct student data; struct no
27、de *next; Node,*Link; void menu() printf(*); printf(t1Addttttt2Deleten); printf(t3Visitttttt4Modifyn); printf(t5Savettttt0Escapen); printf(*n); void printstart() printf(-n); void Wrong() printf(n=Cue:Wrong!n); void Nofind() printf(n=Cue:Cannt find the student!n); void printc() printf( numbert name s
28、ex egrade mgrade cgrade Totle Averagen); void printe(Node *p) printf(%-12s%st%st%dt%dt%dt %dt %dn,p-data.num,p-data.name,p-data.sex,p-data.egrade,p-data.mgrade,p-data.cgrade,p-data.totle,p-data.ave); Node* Locate(Link l,char findmess,char nameornum) Node *r; if(strcmp(nameornum,num)=0) r=l-next; whi
29、le(r!=NULL) if(strcmp(r-data.num,findmess)=0) return r; r=r-next; else if(strcmp(nameornum,name)=0) r=l-next; while(r!=NULL) if(strcmp(r-data.name,findmess)=0) return r; r=r-next; return 0; void Add(Link l) Node *p,*r,*s; char num10; r=l; s=l-next; while(r-next!=NULL) r=r-next; while(1) printf(Pleas
30、e input the number ( input0 back the menu:); scanf(%s,num); if(strcmp(num,0)=0) break; while(s) if(strcmp(s-data.num,num)=0) printf(=Cue:The number of %sis exist,if you want to modify it ,please choose4 Modify!n,num); printstart(); printc(); printe(s); printstart(); printf(n); return; s=s-next; p=(N
31、ode *)malloc(sizeof(Node); strcpy(p-data.num,num); printf(Please input the name:); scanf(%s,p-data.name); getchar(); printf(Please input the sex:); scanf(%s,p-data.sex); getchar(); printf(Please input the cgrade:); scanf(%d,&p-data.cgrade); getchar(); printf(Please input the mgrade:); scanf(%d,&p-da
32、ta.mgrade); getchar(); printf(Please input the egrade:); scanf(%d,&p-data.egrade); getchar(); p-data.totle=p-data.egrade+p-data.cgrade+p-data.mgrade; p-data.ave=p-data.totle / 3; p-next=NULL; r-next=p; r=p; shoudsave=1; void Qur(Link l) int sel; char findmess20; Node *p; if(!l-next) printf(n=Cue:The
33、re is no imformation!n); return; printf(n=1By numbern=2By namen); scanf(%d,&sel); if(sel=1) printf(Please input the number:); scanf(%s,findmess); p=Locate(l,findmess,num); if(p) printf(ttttResultn); printstart(); printc(); printe(p); printstart(); else Nofind(); else if(sel=2) printf(Please input th
34、e name:); scanf(%s,findmess); p=Locate(l,findmess,name); if(p) printf(ttttResultn); printstart(); printc(); printe(p); printstart(); else Nofind(); else Wrong(); void Del(Link l) int sel; Node *p,*r; char findmess20; if(!l-next) printf(n=Cue:There is no imformation to delete!n); return; printf(n=1By
35、 numbern=2By namen); scanf(%d,&sel); if(sel=1) printf(Please input the number:); scanf(%s,findmess); p=Locate(l,findmess,num); if(p) r=l; while(r-next!=p) r=r-next; r-next=p-next; free(p); printf(n=Cue:The student is deletde!n); shoudsave=1; else Nofind(); else if(sel=2) printf(Please input the name:); scanf(%s,findmess); p=Locate(l,findmess,name); if(p) r=l; while(r-next!=p) r=r-next; r-next=p-next; free(p); printf(n= Cue:The student is deletde!n); shoudsave=1; else Nofind(); else Wrong(); void Modify(Link l) Node *p; char findmess20; if(!l-