漳州师范学院计算机科学与工程系
软件工程课程设计总结报告
注:该表格由学生填写,内容采用小四号宋体。
C++课程设计报告书
题目:学生成绩管理系统
专 业:信息与计算科学
班 级:0208403
学 号:020840306
姓 名:张亚炬
任课老师:文 军
学生成绩管理系统课程设计报告
摘要:
本系统主要用于对学生的成绩进行管理。通过本系统,可以将各个学生的成绩记录输入到系统中,保存到文件,便于查阅和相关管理。此外,该系统还能实现对学生成绩记录的显示,查询以及插入或删除学生的成绩记录等功能。
一、 问题描述
编写一个简单的学生成绩管理系统。学生成绩管理系统有若干学生成绩记录组成,每个记录由学号、姓名、性别和成绩四部分组成,学号不超过11个字符,姓名不超过21个字符,性别为’m’(male)或’f’(female),成绩为double型数据。该系统具有以下功能:
(1) 程序开始执行时显示如下版权信息和主菜单:
*******学生成绩管理系统*************
l *1.添加学生成绩记录
l *2.显示学生成绩记录
l *3.查找学生成绩记录
l * 4.删除学生成绩记录
l * 5.保存学生成绩记录
l * 6.加载学生成绩记录
l * 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。具体如下:
class student
{
public:
char name[21]; //姓名
char number[11]; //学号
char sex; //性别
double chengji; //成绩
student *next; //类指针,用来指向下一个记录
student();
void init(string &Name,string &Number,char Sex,double Chengji); //输入学生成绩记录
virtual ~student();
};
函数init(string &Name,string &Number,char Sex,double Chengji)用于输入学生记录,相当于一个注册。其具体实现如下:
void student::init(string &Name,string &Number,char Sex,double Chengji)
{
int len;
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,该类是学生成绩记录的集合。其成员函数则是问题中要求的添加、显示、查找、删除、保存、导出等各种操作。改类具体如下:
class stuscore
{
student* head;
public:
bool add_record();//添加学生成绩记录
void display_record();//显示学生成绩记录
int length();//学生成绩记录个数
bool delete_record();//删除学生成绩记录
void save_record();//保存学生成绩记录
void load_record();//加载学生成绩记录
bool find_record();//查找学生成绩记录
stuscore();
virtual ~stuscore();
};
现在就要编写各个功能的函数实体了:
① 添加学生成绩记录add_record(),建立一个链表:
bool stuscore::add_record()
{
int i;
int j=1;
string Name;
string Number;
char Sex;
double Chengji;
student *newnode,*current,*previous;
current=previous=head;
cout<<"请输入插入的位置:";
cin>>i;
if(i<=0||i>length()+1)
{
cout<<"输入的位置不正确!";
return false;
}
cout<<"请输入学号:";
cin>>Number;
cout<<"请输入姓名:";
cin>>Name;
cout<<"请输入性别:";
cin>>Sex;
cout<<"请输入成绩:";
cin>>Chengji;
newnode=new student();
newnode->init(Name,Number,Sex,Chengji);
newnode->next=null;
if(!newnode)
{
cout<<"内存已满!";
return false;
}
if(i==1)
{
newnode->next=head;
head=newnode;
return true;
}
else
{
while(current&&j<i)
{
previous=current;
current=current->next;
j++;
}
newnode->next=current;
previous->next=newnode;
return true;
}
}
② 显示学生成绩记录display_record(),具体实现如下:
void stuscore::display_record()
{
student*current;
current=head;
cout<<"表中有"<<length()<<"条记录!\n";
if(length())
{
cout<<setiosflags(ios::left)<<setw(15)<<"学号"<<setw(15)<<"姓名"<<setw(12)<<"性别"<<setw(5)<<"成绩"<<endl;
while(current)
{
cout<<current;
current=current->next;
}
}
}
另外,对<<运算符进行了重载,这样就可以直接用cout输出学生成绩记录,函数重载如下:
ostream&operator<<(ostream&output,const student *addr)
{
output<<setiosflags(ios::left)<<setw(15)<<addr->number<<setw(15)<<addr->name<<setw(12)<<addr->sex<<setw(5)<<addr->chengji<<endl;
return output;
}
③ 查找学生成绩记录find_record(),具体实现如下:
bool stuscore::find_record()
{ student *current,*previous;
string Number;
cout<<"请输入要查找的学生的学号:";
cin>>Number;
current=previous=head;
while(current)
{
if(current->number==Number)
{
cout<<setiosflags(ios::left)<<setw(15)<<"学号"<<setw(15)<<"姓名"<<setw(12)<<"性别"<<setw(5)<<"成绩"<<endl;
cout<<current;
return true;
}
else
{
previous=current;
current=current->next;
}
}
if(!current)
{
cout<<"没有找到该学生!";
return false;
}
return true;
}
④ 删除学生记录delete_record(),具体实现如下:
bool stuscore::delete_record()
{
string s;
student*current,*previous;
current=previous=head;
cout<<"成绩表中有"<<length()<<"个学生成绩记录"<<endl;
if(!length())
{
cout<<"学生成绩表已空!\n";
return false;
}
else{
cout<<"请输入要删除的学生记录的学号:";
cin>>s;
while(current)
{
if(current->number==s)
{
if(current==head)
{
head=head->next;
delete current;
cout<<"删除成功!";
return true;
}
else
{
previous->next=current->next;
delete current;
cout<<"删除成功!";
return true;
}
}
else
{
previous=current;
current=current->next;
}
}
if(!current)
{
cout<<"没有找到该学号所对应的学生记录!";
return false;
}
}
return true;
}
⑤ 保存学生成绩记录save_record(),具体实现如下:
void stuscore::save_record()
{
ofstream file;
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();
}
}
⑥ 加载学生成绩记录load_record(),具体实现如下:
void stuscore::load_record()
{
ifstream file;
char fname[20];
student *n;
n=new student();
cout<<"请输入要打开的文件名(fname.txt):";
cin>>fname;
file.open(fname,ios::in);
if(!file)
{
cout<<"文件打开失败!";
cin.get();
}
else
{
cout<<setiosflags(ios::left)<<setw(21)<<"姓名"<<setw(11)<<"学号"<<setw(5)<<"性别"<<setw(5)<<"成绩"<<endl;
while(file&&file.peek()!=EOF)
{
file.read((char*)n,sizeof(*n));
cout<<n<<endl;
}
file.close();
}
}
⑦ 计算学生成绩记录的个数length(),具体实现如下:
int stuscore::length()
{
int j=0;
student*current;
current=head;
while(current)
{current=current->next;
j++;
}
return j;
}
三、 程序运行结果:
主菜单界面 :
① 添加学生成绩记录:
② 显示学生成绩记录:
③ 按照①所示再添加几个学生成绩记录,显示结果为:
④ 查找学生成绩记录:
⑤ 删除学生成绩记录:
删除记录后再显示学生成绩记录:
⑥ 保存学生成绩记录:
⑦ 加载学生成绩记录:
⑧ 退出学生成绩系统:
四、 课程设计总结
这是一个综合性较强,很实际的一个编程实例。刚学C++时候,感觉类和对象还挺有意思的,刚接触到这个题目时,觉得应该没什么大问题吧,因为,我自认为一些基本知识点都已经掌握了。可是,真的当我动手编程的时候,才发现并没有想象中的那么简单。单个知识点是弄清了,但是,将所有的知识点综合起来运用时,就碰到了各种各样的问题了。有时候,一个错误得找好久,才能发现。
本系统的重点就是要会建立两个类。一个是学生类student,用来存放一个学生的成绩记录,相当于一个结构体的功能吧。另一个类是学生成绩记录系统类stuscore,该类用来存放多个学生的成绩记录。难点就是stuscore类里的各个功能的实现。总的来说,添加,显示,查找,这三个功能比较容易,但是,删除,保存,加载这三个功能就需要花点心思了,可能是平时用的比较少吧,生疏了。可见只有通过平时多加练习,才能有助于自己巩固知识点。
最后想说的是,调试程序真的很关键。调试程序需要较大的耐心。可能调试程序的时间比自己编写整个程序的时间还要长,下的工夫还要深,但这是一个程序员必须了解,也必须接受的事实。有好几次,几个错误让我很是头疼啊,很想删了,重新来过,可是最后发现,还是得有耐心去调试程序。
通过这个实验的练习,我也学到了很多东西,特别是加深了对类和对象理解和应用方面,也很谢谢老师给我的帮助。
参考文献:C++程序设计教程(第二版),罗建军等编著,高等教育出版社
重庆科技学院《市场营销策划》课程设计报告学院:___工商管理学院__专业班级:营销10-2学生姓名:xxxxxxx学号:20xx4…
课程设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对我们的实际工作能力的具体训练和考察…
通过近两周的奋斗,课程设计接近了尾声。经过两周的奋战我的课程设计终于完成了。在没有做课程设计以前觉得课程设计只是对信号与系统这门课…
一引言课程设计是一块试金石是加深对自我能力认识的重要途径大学的学习基本上都是理论的接受而缺少能力的熟练与加强我们缺少的并不是知识的…
漳州师范学院数据库课程设计个人日程管理系统姓名某某学号系别计算机科学与工程专业计算机科学技术专业年级08级指导教师陈志翔王桃发20…
我们所选择的图书管理系统的课程设计对我们是新的挑战和尝试的过程,利用所学习的软件设计知识并制作一个关于图书管理系统,在具体的设计与…
专业:08计本2班姓名:张敬宇学号:20806032039在我们整个软件工程过程中,我体会到了许多,也学到了许多。在项目要进行自由…
为提高企业管理水平优化项目管理结构,做到科学管理项目和全过程的控制,可以有效的降低项目管理成本和提高管理效能。仅对项目立项、工程设…
设计报告一、工程概况及施工条件1、建设单位:福建省某房地产公司2、施工单位:福建省某建筑公司3、工程概况:本工程为一幢5层框架结构…
建筑工程项目管理课程设计总结虽然时间不长但是在这些时间里我学习到不少的东西不仅仅对课本知识更了解了对软件也更熟悉还学会了许多运用软…
一、课程设计名称金属探测器的设计二、课程设计目的1.进一步了解什么是自激振荡、产生正弦波自激振荡的条件、正弦波振荡电路的组成和判断…