《面向对象程序设计》课程设计-学生成绩管理系统Word文档格式.doc
《《面向对象程序设计》课程设计-学生成绩管理系统Word文档格式.doc》由会员分享,可在线阅读,更多相关《《面向对象程序设计》课程设计-学生成绩管理系统Word文档格式.doc(18页珍藏版)》请在冰点文库上搜索。
charName[10];
//姓名
public:
virtualbooloperator<
(Person&
)=0;
//>
运算符重载
virtualbooloperator>
=(Person&
//<
=运算符重载
2)定义派生数据类student,基类为person类。
Private:
intScore[4];
//成绩
voidSwapData(Student*);
//交换数据
Student(int=0,char*=NULL,int*=NULL);
//构造函数
booloperator<
);
//>
booloperator>
//<
friendofstream&
operator<
<
(ofstream&
Student*);
//<
运算符重载输出到文件
friendifstream&
operator>
>
(ifstream&
//>
运算符重载从文件输入
friendostream_withassign&
(ostream_withassign&
//<
运
算符重载输出到显示器
friendistream_withassign&
(istream_withassign&
//>
运算
符重载从键盘输入
friendclassList;
//List为友元类
3)定义设计结点类Node
private:
Student*Stup;
//指向学生对象指针
Node*Prev,*Next;
//指向前后结点指针
Node();
//构造函数
Node(Student*);
//构造函数
Node(Node&
//复制构造函数
~Node();
//析构函数
//List为友元类
4)定义带有头结点链表类List,私有数据成员为Node*Head,*Tail分别,指向链表头尾:
voidInitList();
//初始化函数
List();
//构造函数
~List();
voidClearList();
//清空链表
Node*FindID(int&
//根据学号寻找学生所在结点
voidInsert(Node*);
//插入一个学生
Node*CreateNode(Student*);
//建立一个学生结点
voidAdd();
//增加一个学生
voidUpdate();
//修改学生成绩
voidDelete();
//删除一个学生
voidQuery();
//查找一个学生
voidSortID();
//按学号排序
voidSortScore();
//按学生总成绩排序
voidSaveBin();
//以二进制形式保存数据
voidPrintList();
//显示链表
voidPrintTitle();
//显示标题
voidPrintOne(Student*);
//显示一个学生数据
2.student类的实现:
student.cpp
3.node类的实现:
node.cpp
4.list类的实现:
list.cpp
5.主函数:
main.cpp
(二)各模块(函数)的功能
1.实现类和函数声明;
2.实现派生类student的各函数;
3.实现结点类Node的各函数;
4.实现结点类List的各函数。
程序结束运行前,调用SaveBin()函数以二进制形式保存学生数据到文件student.dat中;
5.设计主函数。
主函数中显示功能菜单,通过菜单调用类的成员函数实现系统各项功能。
(三)采用自定义的数据类型
自定义的数据类型:
#ifndefSTUDATA_H
#defineSTUDATA_H
#include<
fstream.h>
intGetID();
classList;
classPerson{//抽象类
};
classStudent:
publicPerson{
intScore[4];
friendostream_withassign&
classNode{
Student*Stup;
classList{
Node*Head,*Tail;
voidInitList();
#endif
三.程序运行流程图
开始
输入选项
输入选项!
=END
保存数据SaveBin()
增加学生、修改成绩、删除学生、查询数据、显示数据、按学号排序、按总成绩排序
注:
在主函数中,输入选项,判断是否等于END,如等于END则保存数据;
如不等于则实行switch中增加学生、修改成绩、删除学生、查询数据、显示数据、按学号排序、按总成绩排序。
增加学生
学号是否相同
抛出异常
显示链表
保存数据
结束
增加学生,判断学号是否有相同,有相同是抛出异常,无相同则继续增加,并显示链表、保存数据。
修改数据
是否存在
修改并显示列表
是否删除最后一个结点
nodep->
Next->
Prev=nodep->
Prev;
Prev->
Next=nodep->
Next;
Tail=nodep->
Prev
删除结点并显示剩余链表
删除学生
查询学生
显示列表
按学号排序
按总成绩排序
运行程序,先实现链表数据,再按执行。
修改成绩:
输入学号,判断是否存在,存在则对该学生的成绩进行修改;
不存在则抛出异常。
删除学生:
输入学号,判断是否存在,存在则继续判断要求删除的学生的结点所在位置,根据学生的结点所在位置不同,做不同的操作;
查询数据:
输入学号,判断是否存在,存在则显示该学生信息;
显示数据:
显示链表中所有的数据。
按学号排序:
比较学号大小,学号小的在前,大的在后。
按总成绩排序:
比较总成绩大小,总成绩大的在前,总成绩小的在后。
四.程序设计过程、调试过程中所用的测试用例、测试方法,程序运行的结果
(一)程序设计过程
1.student.cpp中所要设计的程序:
boolStudent:
:
operator<
per){
returnScore[3]<
((Student&
)per).Score[3];
//学生设计
}
operator>
returnScore[3]>
=((Student&
//学生设计
voidStudent:
SwapData(Student*stup){//学生数据交换(学生设计)
Studentt=*this;
*this=*stup;
*stup=t;
ofstream&
(ofstream&
out,Student*stup)//<
运算符重载输出至文件
out.write((char*)stup,sizeof(Student));
returnout;
ostream_withassign&
out,Student*stup){//<
运算符重载输出至标准文件
inti;
//学生设计
out<
stup->
ID<
"
\t"
Name<
;
for(i=0;
i<
4;
i++)
out<
Score[i]<
out<
endl;
returnout;
2.node.cpp中要求设计的程序:
Node:
Node(Student*stup){
Stup=stup;
//学生设计
Prev=Next=NULL;
Node(Node&
node){
//*Stup=*Prev=*Next;
//学生设计
~Node(){
deleteStup;
//学生设计
3.list.cpp中要求设计的程序:
voidList:
Update(){//修改学生成绩
// Student*stup;
//学生设计
Node*nodep;
intid=GetID();
inti;
if((nodep=FindID(id))==NULL)
throw
(1);
nodep->
Stup->
Score[3]=0;
3;
{
cout<
Score"
i;
cin>
Score[i];
nodep->
Score[3]+=nodep->
}
PrintTitle();
PrintOne(nodep->
Stup);
Delete(){//删除一个学生
//学生设计
Node*nodep;
if((nodep=FindID(id))==NULL)
if(Tail!
=nodep){
//删除中间的结点
else
//删除最后一个结点
Tail=nodep->
deletenodep;
PrintList();
Query(){//查询学生数据
Insert(Node*nodep){//在链表尾插入一个学生
Tail->
Next=nodep;
//学生设计
nodep->
Prev=Tail;
Tail=nodep;
SortScore(){//按总成绩排序
Node*nodef,*nodel=Tail;
//学生设计
if(Head!
=Tail){
while(Head->
Next!
=nodel){
nodef=Head->
while(nodef!
if(*(nodef->
Stup)<
*(nodef->
Stup))
nodef->
SwapData(nodef->
nodef=nodef->
}
nodel=nodel->
}
PrintList();
SaveBin(){//链表数据保存在二进制文件
Node*nodep=Head->
//学生设计
ofstreamoutStudent;
outStudent.open("
Student.dat"
ios:
binary);
while(nodep){
outStudent<
Stup;
nodep=nodep->
outStudent.close();
PrintList(){//显示链表中数据
Node*nodep=Head->
if(Head!
PrintTitle();
//学生设计
while(nodep!
=NULL){
PrintOne(nodep->
nodep=nodep->
}
}
else
cout<
Nostudent"
}
4.main.cpp中要设计的程序:
caseUPDATE:
//修改学生成绩
try{//学生设计
ls.Update();
}
catch(int){
cout<
Wrong!
ThisScoreisNULL"
break;
caseDELETE:
//删除一个学生
try{//学生设计
ls.Delete();
ThisStudentisNULL"
caseQUERY:
//查询一个学生数据
ls.Query();
ThisDataisNULL"
caseSORTSCORE:
//根据总成绩排序
ls.SortScore();
(二)调试过程中所用的测试用例
1.自动生成测试函数:
无须手