C++学生成绩管理系统课程设计报告.docx
《C++学生成绩管理系统课程设计报告.docx》由会员分享,可在线阅读,更多相关《C++学生成绩管理系统课程设计报告.docx(15页珍藏版)》请在冰豆网上搜索。
C++学生成绩管理系统课程设计报告
C++课程设计报告书
题目:
学生成绩管理系统
专业:
信息与计算科学
班级:
0208403
学号:
*********
******
任课老师:
文军
学生成绩管理系统课程设计报告
摘要:
本系统主要用于对学生的成绩进行管理。
通过本系统,可以将各个学生的成绩记录输入到系统中,保存到文件,便于查阅和相关管理。
此外,该系统还能实现对学生成绩记录的显示,查询以及插入或删除学生的成绩记录等功能。
一、问题描述
编写一个简单的学生成绩管理系统。
学生成绩管理系统有若干学生成绩记录组成,每个记录由学号、姓名、性别和成绩四部分组成,学号不超过11个字符,姓名不超过21个字符,性别为’m’(male)或’f’(female),成绩为double型数据。
该系统具有以下功能:
(1)程序开始执行时显示如下版权信息和主菜单:
*******学生成绩管理系统*************
●*1.添加学生成绩记录
●*2.显示学生成绩记录
●*3.查找学生成绩记录
●*4.删除学生成绩记录
●*5.保存学生成绩记录
●*6.加载学生成绩记录
●*7.退出学生成绩管理系统
************************************
请输入(1~7):
(2)通过键盘输入数字1~7后,程序能够执行相应的功能,执行完后回到上述主菜单继续等待用户输入,输入数字7后退出程序。
(3)选择“添加学生成绩记录”后,输入要插入记录的位置。
按程序提示依次输入学号,姓名,性别,成绩,插入记录成功。
(4)选择“显示学生成绩记录”,显示学生成绩表中已有的学生记录的个数,并显示出各个学生记录的相关信息。
(5)选择“查找学生成绩记录”,按提示输入要查找的学生的学号,输入学号,若该学号存在,则输出相应的学生记录,如该学号不存在,则按任意键返回主菜单。
(6)选择“删除学生成绩记录”,按提示输入要删除的学生的学号,输入学号,若改学号存在,则删除相应的学生记录,如果该学号不存在,则按任意键返回主菜单。
(7)选择“保存学生成绩记录”,系统会将已有的学生记录保存在默认的文件名为fname.txt的文件中。
(8)选择“加载学生成绩记录”,系统会提示输入文件名,输入默认的文件名为fname.txt,则可将文件中的相关信息导出。
(9)选择“退出学生成绩管理系统”,按任意键退出系统。
二、解决方案
这是一个很实际的编程实例。
编程要求很详细,内容也比较多,有一定难度。
首先,学生成绩记录是一个复杂的数据结构,至少应包括学号,姓名,性别和成绩。
所以,必须建立一个类student,用来记录学号,姓名,性别和成绩。
此外还得建立一个类stuscore,用来记录多个学生的成绩记录。
1、建立类学生类student,它至少包括学号number,姓名name,性别sex,成绩chengji。
具体如下:
classstudent
{
public:
charname[21];//姓名
charnumber[11];//学号
charsex;//性别
doublechengji;//成绩
student*next;//类指针,用来指向下一个记录
student();
voidinit(string&Name,string&Number,charSex,doubleChengji);//输入学生成绩记录
virtual~student();
};
函数init(string&Name,string&Number,charSex,doubleChengji)用于输入学生记录,相当于一个注册。
其具体实现如下:
voidstudent:
:
init(string&Name,string&Number,charSex,doubleChengji)
{
intlen;
len=Name.length();
if(len>20)len=20;
Name.copy(name,len,0);
name[len]=0;
len=Number.length();
if(len>10)len=10;
Number.copy(number,len,0);
number[len]=0;
sex=((sex=='m')?
'm':
'f');
chengji=Chengji;
}
2、建立学生成绩记录类stuscore,该类是学生成绩记录的集合。
其成员函数则是问题中要求的添加、显示、查找、删除、保存、导出等各种操作。
改类具体如下:
classstuscore
{
student*head;
public:
booladd_record();//添加学生成绩记录
voiddisplay_record();//显示学生成绩记录
intlength();//学生成绩记录个数
booldelete_record();//删除学生成绩记录
voidsave_record();//保存学生成绩记录
voidload_record();//加载学生成绩记录
boolfind_record();//查找学生成绩记录
stuscore();
virtual~stuscore();
};
现在就要编写各个功能的函数实体了:
1添加学生成绩记录add_record(),建立一个链表:
boolstuscore:
:
add_record()
{
inti;
intj=1;
stringName;
stringNumber;
charSex;
doubleChengji;
student*newnode,*current,*previous;
current=previous=head;
cout<<"请输入插入的位置:
";
cin>>i;
if(i<=0||i>length()+1)
{
cout<<"输入的位置不正确!
";
returnfalse;
}
cout<<"请输入学号:
";
cin>>Number;
cout<<"请输入姓名:
";
cin>>Name;
cout<<"请输入性别:
";
cin>>Sex;
cout<<"请输入成绩:
";
cin>>Chengji;
newnode=newstudent();
newnode->init(Name,Number,Sex,Chengji);
newnode->next=null;
if(!
newnode)
{
cout<<"内存已满!
";
returnfalse;
}
if(i==1)
{
newnode->next=head;
head=newnode;
returntrue;
}
else
{
while(current&&j
{
previous=current;
current=current->next;
j++;
}
newnode->next=current;
previous->next=newnode;
returntrue;
}
}
2显示学生成绩记录display_record(),具体实现如下:
voidstuscore:
:
display_record()
{
student*current;
current=head;
cout<<"表中有"<\n";
if(length())
{
cout<:
left)<while(current)
{
cout<current=current->next;
}
}
}
另外,对<<运算符进行了重载,这样就可以直接用cout输出学生成绩记录,函数重载如下:
ostream&operator<<(ostream&output,conststudent*addr)
{
output<:
left)<number<name<sex<chengji<returnoutput;
}
3查找学生成绩记录find_record(),具体实现如下:
boolstuscore:
:
find_record()
{student*current,*previous;
stringNumber;
cout<<"请输入要查找的学生的学号:
";
cin>>Number;
current=previous=head;
while(current)
{
if(current->number==Number)
{
cout<:
left)<cout<returntrue;
}
else
{
previous=current;
current=current->next;
}
}
if(!
current)
{
cout<<"没有找到该学生!
";
returnfalse;
}
returntrue;
}
4删除学生记录delete_record(),具体实现如下:
boolstuscore:
:
delete_record()
{
strings;
student*current,*previous;
current=previous=head;
cout<<"成绩表中有"<if(!
length())
{
cout<<"学生成绩表已空!
\n";
returnfalse;
}
else{
cout<<"请输入要删除的学生记录的学号:
";
cin>>s;
while(current)
{
if(current->number==s)
{
if(current==head)
{
head=head->next;
deletecurrent;
cout<<"删除成功!
";
returntrue;
}
else
{
previous->next=current->next;
deletecurrent;
cout<<"删除成功!
";
returntrue;
}
}
else
{
previous=current;
current=current->next;
}
}
if(!
current)
{
cout<<"没有找到该学号所对应的学生记录!
";
returnfalse;
}
}
returntrue;
}
5保存学生成绩记录save_record(),具体实现如下:
voidstuscore:
:
save_record()
{
ofstreamfile;
student*current=head;
file.open("./fname.txt",ios:
:
out);
if(!
file)
{
cout<<"打开文件失败!
";
cin.get();
}
else
{
while(current)
{
if(file&&!
file.eof())
file.write((char*)current,sizeof(*current));
current=current->next;
}
cout<<"保存完成!
";
file.close();
}
}
6加载学生成绩记录load_record(),具体实现如下:
voidstuscore:
:
load_record()
{
ifstreamfile;
charfname[20];
student*n;
n=newstudent();
cout<<"请输入要打开的文件名(fname.txt):
";
cin>>fname;
file.open(fname,ios:
:
in);
if(!
file)
{
cout<<"文件打开失败!
";
cin.get();
}
else
{
cout<:
left)<while(file&&file.peek()!
=EOF)
{
file.read((char*)n,sizeof(*n));
cout<}
file.close();
}
}
7计算学生成绩记录的个数length(),具体实现如下:
intstuscore:
:
length()
{
intj=0;
student*current;
current=head;
while(current)
{current=current->next;
j++;
}
returnj;
}
三、程序运行结果:
主菜单界面:
1添加学生成绩记录:
2显示学生成绩记录:
3按照①所示再添加几个学生成绩记录,显示结果为:
4查找学生成绩记录:
5删除学生成绩记录:
删除记录后再显示学生成绩记录:
6保存学生成绩记录:
7加载学生成绩记录:
8退出学生成绩系统:
四、课程设计总结
这是一个综合性较强,很实际的一个编程实例。
刚学C++时候,感觉类和对象还挺有意思的,刚接触到这个题目时,觉得应该没什么大问题吧,因为,我自认为一些基本知识点都已经掌握了。
可是,真的当我动手编程的时候,才发现并没有想象中的那么简单。
单个知识点是弄清了,但是,将所有的知识点综合起来运用时,就碰到了各种各样的问题了。
有时候,一个错误得找好久,才能发现。
本系统的重点就是要会建立两个类。
一个是学生类student,用来存放一个学生的成绩记录,相当于一个结构体的功能吧。
另一个类是学生成绩记录系统类stuscore,该类用来存放多个学生的成绩记录。
难点就是stuscore类里的各个功能的实现。
总的来说,添加,显示,查找,这三个功能比较容易,但是,删除,保存,加载这三个功能就需要花点心思了,可能是平时用的比较少吧,生疏了。
可见只有通过平时多加练习,才能有助于自己巩固知识点。
最后想说的是,调试程序真的很关键。
调试程序需要较大的耐心。
可能调试程序的时间比自己编写整个程序的时间还要长,下的工夫还要深,但这是一个程序员必须了解,也必须接受的事实。
有好几次,几个错误让我很是头疼啊,很想删了,重新来过,可是最后发现,还是得有耐心去调试程序。
通过这个实验的练习,我也学到了很多东西,特别是加深了对类和对象理解和应用方面,也很谢谢老师给我的帮助。
参考文献:
C++程序设计教程(第二版),罗建军等编著,高等教育出版社