C 课程设计 学生成绩管理系统.docx
《C 课程设计 学生成绩管理系统.docx》由会员分享,可在线阅读,更多相关《C 课程设计 学生成绩管理系统.docx(25页珍藏版)》请在冰豆网上搜索。
![C 课程设计 学生成绩管理系统.docx](https://file1.bdocx.com/fileroot1/2023-2/26/6b685169-ab29-4c40-b414-1bbc5d4f3737/6b685169-ab29-4c40-b414-1bbc5d4f37371.gif)
C课程设计学生成绩管理系统
中南大学
二○一二~二○一三学年第二学期
信息科学与工程学院
C++程序设计语言
课程设计报告
课程名称:
C++程序设计语言
班级:
电气信息类1206班
姓名:
邬继阳
指导教师:
王磊
二0一三年零七月
1.课程设计目的
使学生进一步理解和掌握课堂上所学各种基本抽象数据类型的逻辑结构、存储结构和操作实现算法,以及它们在程序中的使用方法。
使学生掌握软件设计的基本内容和设计方法,并培养学生进行规范化软件设计的能力。
使学生掌握使用各种计算机资料和有关参考资料,提高学生进行程序设计的基本能力。
2.系统描述(需求分析)
需要处理的基础数据
学生基本信息:
如班级、学号、姓名、性别、年龄、宿舍号码、电话号码等。
学生选修课程的基本信息:
课程编号、课程名称、考试成绩、平时成绩、综合成绩、学分、
重修否等。
系统的基本功能
数据的录入:
如录入学生的基本信息,以及该学生选修课程的基本信息;
数据的修改:
如修改指定学号、或者指定姓名的学生信息,或者修改其选修课程信息;
数据的插入:
插入某个学生信息
数据的查询:
如按学号查询、按姓名查询等;
数据的删除:
如删除指定学号、或者指定姓名的学生及其选修课的信息;
平均成绩的计算:
计算每个学生各门功课的平均成绩,并按平均成绩从高到低的次序输出
学生信息;
列出不及格学生清单(学号、姓名、不及格的课程和成绩)。
考虑用文件把数据保存起来(可选)。
可行性分析
2.3.1如上所示,该系统要求处理一些学生成绩的基本数据,包括两个方面:
学生身份信息和学生成绩信息。
具体可以考虑创建两个类,一个学生基本信息类,一个学科基本信息类。
这样既可以保持二者的独立性,也可以使之相关联。
2.3.2该系统不仅要求能录入一些基本数据外,还要能对这些数据进行处理,比如修改,删除,插入,查询等。
对这些操作的实现可以暂时放开面向对象,而采用面向过程的方法。
另外,因为对数据库了解不多,可以考虑用文件保存的形式将数据保存起来,最后在查找的时候采用文件读取。
3.功能模块设计
类的分析与设计
由上面的需求分析可以知道,在本程序中,需要处理两大类数据:
一个是学生的身份基本信息,另一个是该同学的课程基本信息。
而且要求二者既要相互联系,又不能太相互制约。
于是可以考虑创建两个类:
Stu类(学生信息类)和Course类(课程信息类)。
为了使二者相互关联,可以让Course的一个类对象作为Stu对象的一个基本数据成员。
具体如下:
3.1.1Course类
由于学生只需要一些课程信息,故在该类中只有一些基本的成员数据,不涉及成员函数之类的对数据进行操作的函数。
把对学生信息进行处理的函数放在Stu类中。
成员
成员属性
访问类型
course_num
数据成员
public
course_name
数据成员
public
regular_score
数据成员
public
Final_score
数据成员
public
average_score
数据成员
public
study_score
数据成员
public
rebulid
数据成员
public
由于这些数据信息是作为Stu类的一个信息的,为了使stu类中的函数可以访问这些成员数据,故要将访问类型定义为public型。
3.1.2Stu类
正如上面所述,Course类的一个对象作为Stu类的一个数据成员,但是正常情况下,一个同学是不只一门科目的,所以要定义一个Course类的数组来存放同一学生的不同科目信息Coursecourse[20]。
为了其信息的隐蔽性,我们把所有的数据成员都声明为private。
接下来,要处理的就是函数了。
有两种处理方式,但到底是采用成员函数还是采用友元函数呢在本例中,我采用的是友元函数。
原因如下:
(1)采用友元函数,可以使类的结构变得更加简单,有助于整个设计过程的思考。
(2)使用友元函数,将函数独立于类的结构之外而采用类对象传参的方式,可以使该函数的独立性大大提高,有助于在其他地方的使用。
具体如下:
成员
成员属性
访问类型
Class_num
数据成员
private
num
数据成员
private
name
数据成员
private
sex
数据成员
private
age
数据成员
private
room
数据成员
private
tel
数据成员
private
average
数据成员
private
Num_of_course
数据成员
private
order
数据成员
private
Course[20]
数据成员
private
友元函数:
Input(Stustud[])
输入学生信息
Statistic(Stustud[])
学生信息输出
Lookup(Stustud[])
查找学生信息
Modify(Stustud[])
修改学生信息
Delete(Stustud[])
删除学生信息
Output(Stustud[])
输出全部信息
Sort(Stustud[])
对学生进行排序
Insert(Stustud[])
插入学生信息
Showfail(Stustud[])
查找不及格学生
Write(Stustud[])
文件写入函数
Read(Stustud[])
文件读取函数
voidmenu()
菜单函数,以供选择
整体流程
上面已经主要分开介绍了两个独立的类及其内部成员,现在来介绍整个学生系统功能实现的流程。
4.主要模块的算法说明
信息的保存和读取
在本次课程设计中,因为还没有接触到数据库的有关知识,故采用文件流来写入和读取信息。
主要涉及到fstream类。
在系统运行过程中,会利用该类将学生的基本身份信息和基本课程信息全部存到自定义的一个文件中,当需要使用这些数据时,例如查询,修改,显示等,再将需要的读取出来进行相关的操作。
对信息的处理
4.2.1数据的录入和插入
数据的录入和插入基本一样,这里只介绍录入。
当在主菜单里选择信息录入时,会跳出录入页面,只需依次输入提示的信息即可。
在整个大体框架上,采用一个while语句判断是否继续录入。
注意在录入学生成绩信息时。
需要输入要登记的课程数目。
其中成绩信息的各科综合成绩和是否重修不需要手动录入,它会在登记完平时成绩和末考成绩后自动生成。
当所有信息录入完成后,该生所有科目的平均成绩average也会自动计算。
4.2.2数据的查询
所谓数据的查询,就是把存放在文档中的学生数据读取出来并加以输出。
当只针对某个人的查询时,需要输入学号或姓名,再调用read()函数将相关的数据读取出来,至于需要输出哪些,可以自己控制。
当要输出所有学生的数据是时,首先调用read()函数返回数据的个数count,即学生的个数。
最后采用for循环控制依次输出每一个学生的信息。
4.2.3数据的修改
当修改数据时,只需输入需要修改学生的学号即可。
首先会将该生的相关信息输出出来。
然后再提示重新输入信息。
执行到这里时基本就和前面的数据录入,插入一样了。
4.2.4数据的删除
本例中,对数据的删除比较简单。
只需输入学号或姓名,当查找到该生的相关信息后。
将后面一个学生的信息赋值给他,相当于该生的信息被覆盖,也就是删除。
4.2.5数据的排序
在需求分析中,有一项功能,按学生成绩平均分降序排列。
此功能还是比较好实现的。
在输入学生数据时,当所有课程分数输入完毕,会自动生成一个平均分,该数值就是学生类Stu中的average数据成员。
然后采用冒泡法比较大小,把这些学生的数据重新排列,最后再依次输出。
5.程序运行结果
菜单欢迎界面
信息的录入
如上所示,依次输入需要填写的信息,其中“该门课的综合成绩”和“是否重修”是不需要输入,系统自动执行的。
最后还会提示是否继续填写(Y\N)。
信息的显示
在这个功能里面主要显示全部同学的身份信息和平均分:
信息的查询
信息的查询分两种方式:
当你选择1时,表示按学号查询,
当你选择2时,表示按姓名查询。
下面介绍的是按学号查询。
。
。
如上所示,当输入需要查询的同学的学号时,会输出该同学的身份信息以及每一门课的综合成绩,还有这些课的平均成绩。
信息的修改
当输入需要修改的学生学号时,会首先输出该同学现在的已经存在的信息:
然后提示重新输入:
输入完成后,会提示是否保存:
信息的删除
信息的删除也分两种类型:
选择不同的方式,进入不同的界面
按姓名删除
按学号删除
按平均分降序排列
会输出学生的一些基本信息和平均分与名次。
查看全部信息
由于一个同学的全部信息较多,于是分成两部分输出:
身份信息和成绩信息
在身份信息中,主要包括班级,学号,姓名,年龄,性别,宿舍,电话等。
在成绩信息中,包括该同学的各科成绩,是否重修,获得的学分,以及所有科目的平均分。
输出不及格学生信息
当选择该功能时,首先会输出该同学的学号,姓名和班级,然后再输出他的不及格科目以及分数,如下所示。
退出系统
6.课程设计总结
(1)回顾此次课程设计,感慨良多,从刚拿到题目时的一脸茫然,到最后能成功解决,觉得此次课程设计我又学到了好多知识。
首先在这里要感谢一下王磊指导老师,经过他的细心讲解,我才有了一个完整的设计思路。
(2)在这次课程设计的过程中,最大的感觉就是对知识的不熟悉,一些C++基础知识似懂非懂,结果总要去查书才能写出不出错误的代码,结构就是耗费了大量的时间,事倍功半。
经历这次教训,我想会对我以后的计算机语言学习起到一定的帮助。
(3)在这次的课程设计过程中,通过查书的学习,对C++的了解又加深了不少,包括类的结构,以及怎样在类外访问类类的私有成员等,我想下次再写基于对象的程序时,一定会得心应手。
(4)还有比较重要的收获就是类的相互嵌套使用,就拿本例来说,在一个类中设置一个数据成员,而该数据成员确是另一个类的对象。
这对理解数据类型起到了不少的作用。
(5)总的来说,这次程序设计让我获益匪浅,对C++语言也有了进一步的认识:
语言功能高、表达能力强、使用灵活方便、目标程序效率高等等。
C++语言是在国内外广泛使用的一种计算机语言,相信除了以上优点,还有许多我们还未发现,希望能在以后的学习中有更深入的认识。
7.参考文献
(1)C++程序设计(第二版)谭浩强编着
(2)visualC++从入门到精通明日科技编着
(3)C++编程思想(美)埃克尔编着刘宗田译
8.附录(源代码)
#include
#include
#include<>lass_num<<""<<for(intj=0;j{
myFile<<<""<<<""<}
}
();
}
intRead(Stustud[])lass_num>>stud[i].num>>stud[i].name>>stud[i].age>>stud[i].sex>>stud[i].room>>stud[i].tel>>stud[i].num_of_course>>stud[i].average;
for(intj=0;j{
myFile>>stud[i].course[j].course_num>>stud[i].course[j].course_name>>stud[i].course[j].regular_score>>
stud[i].course[j].final_score>>stud[i].course[j].average_score>>stud[i].course[j].study_score>>stud[i].course[j].rebulid;
}
}
();
returncount;lass_num;
loop:
um;
intc=0;
while(c
{
c++;
if(stud[i].num==stud[i-c].num)
{
cout<<"你输入的学号已经存在!
请重新输入。
"<gotoloop;
}
}
cout<<"姓名:
";
cin>>stud[i].name;
cout<<"年龄:
";
cin>>stud[i].age;
cout<<"性别:
";
cin>>stud[i].sex;
cout<<"宿舍:
";
cin>>stud[i].room;
cout<<"电话:
";
cin>>stud[i].tel;
cout<<"请输入需要登记的学科数目:
";
cin>>stud[i].num_of_course;
intj;
floatsum=0;
for(j=0;j{
cout<<"请登记第"<"<cout<<"课程编号:
";
cin>>stud[i].course[j].course_num;
cout<<"课程名称:
";
cin>>stud[i].course[j].course_name;
cout<<"平时成绩:
";
cin>>stud[i].course[j].regular_score;
cout<<"末考成绩:
";
cin>>stud[i].course[j].final_score;
cout<<"学分:
";
cin>>stud[i].course[j].study_score;
stud[i].course[j].average_score=stud[i].course[j].regular_score*+stud[i].course[j].final_score*;
cout<<"该门课的综合成绩是:
"<if(stud[i].course[j].average_score<60)
stud[i].course[j].rebulid="是";
else
stud[i].course[j].rebulid="否";
cout<<"是否重修:
"<sum=sum+stud[i].course[j].average_score;
}
stud[i].average=sum/stud[i].num_of_course;
cout<<"该学生这几门课的平均分为:
"<cout<<"====>提示:
是否继续写入学生成绩(Y/N)";
cin>>sign;
i++;
}
Write(stud,i);lass_num<<"\t"<system("pause");
}
voidLookup(Stustud[])um-s1)!
=0&&iif(i==n)
{
cout<<"=====>提示:
对不起,无法找到该学生的信息!
"<}
else
{
cout<<"---------------------------"<cout<<"班级:
"<cout<<"学号:
"<cout<<"姓名:
"<cout<<"年龄:
"<cout<<"性别:
"<cout<<"宿舍:
"<cout<<"电话:
"<for(intj=0;j{
cout<";
cout<}
cout<<"平均分:
"<}
break;
case2:
system("cls");
cout<>查找学生成绩<<===="<cout<<"请输入需要查找学生的姓名:
"<cin>>s2;
intflag=0;
for(i=0;i{
if(stud[i].name==s2)
{
cout<<"---------------------------"<cout<<"班级:
"<cout<<"学号:
"<cout<<"姓名:
"<cout<<"年龄:
"<cout<<"性别:
"<cout<<"宿舍:
"<cout<<"电话:
"<for(intj=0;j{
cout<";
cout<}
cout<<"平均分:
"<flag=1;
break;
}
}
if(flag==0)
cout<<"=====>提示:
对不起,无法找到该学生的信息!
"<}
}
voidModify(Stustud[])um-s)!
=0&&iif(i==n)
{
cout<<"=====>提示:
对不起,无该学生的成绩……"<}
else
{
cout<<"----------该学生的信息----------"<cout<<"班级"<<"\t"<<"学号"<<"\t"<<"姓名"<<"\t"<<"年龄"<<"\t"<<"性别"<<"\t"<<"宿舍"<<"\t"<<"电话"<cout<<"---------------------------------"<cout<for(intj=0;j{
cout<";
cout<}
cout<<"平均分:
"<cout<<"请重新输入该学生的信息"<cout<<"班级:
"<cin>>stud[i].class_num;
cout<<"学号:
"<cin>>stud[i].num;
cout<<"姓名:
"<cin>>stud[i].name;
cout<<"年龄:
"<cin>>stud[i].age;
cout<<"性别:
"<cin>>stud[i].sex;
cout<<"宿舍:
"<cin>>stud[i].room;
cout<<"电话:
"<cin>>stud[i].tel;
cout<<"请输入需要登记的学科数目:
";
cin>>stud[i].num_of_course;
intj;
floatsum=0;
for(j=0;j{
cout<<"请登记第"<"<cout<<"课程编号:
";
cin>>stud[i].course[j].course_num;
cout<<"课程名称:
";
cin>>stud[i].course[j].course_name;
cout<<"平时成绩:
";
cin>>stud[i].course[j].regular_score;
cout<<"末考成绩:
";
cin>>stud[i].course[j].final_score;
cout<<"学分:
";
cin>>stud[i].course[j].study_score;
stud[i].course[j].average_score=stud[i].course[j].regular_score*+stud[i].course[j].final_score*;
cout<<"该门课的综合成绩是:
"<