实验1.docx
《实验1.docx》由会员分享,可在线阅读,更多相关《实验1.docx(42页珍藏版)》请在冰豆网上搜索。
实验1
《C++面向对象程序设计》
课程设计报告
(2013—2014学年第3学期)
题目:
学校人员信息管理系统
专业:
计算机科学与技术
班级:
计算机科学与技术
姓名学号:
1307012141王晓蕾
指导教师:
施华
成绩:
计算机科学与技术系
2014
年
06
月
18
日
一、设计目的
课程设计是学习C++程序设计的一个重要环节。
通过课程设计的综合训练,可以使学生在学习理论知识并在实验中进行了一系列基本训练的基础上,进一步加强学生对实际问题分析、编程和动手能力的提高,强化综合应用能力,扩充知识,开阔视野。
学生在熟练运用VisualC++6.0以后,通过使用VisualC++6.0的训练,扩展程序设计的知识面,提高综合应用C++知识能力的要求。
二、设计内容
设计一个学校人员信息管理系统,可以实现对学校人事的信息管理。
基本功能要求如下:
(1)建立人员信息数据。
包括学号(教工号)、姓名、性别、专业(工作系别部门)、出生时间、年龄。
其中,
1)对学生,还包括3门课的成绩(Chinese,English,Mathematics)。
三门课的成绩为int型数据。
2)对教师,还包括职称(如教授/副教授/讲师),工资(如1432.50)。
工资为double型数据。
(2)使用继承的方法构造3个类,对相应的对象放置10个学生(教师)信息。
ØPeople类——虚基类
ØStudent类——派生类
ØTeacher类——派生类
(3)数据基本功能:
Ø增加数据:
AddData()函数。
Ø删除数据:
DeleteData()函数。
根据学号(教工号),删除该人员的记录。
Ø修改数据:
UpdateData()函数。
对学生,根据学号,能够修改3门课的成绩;对教师,根据教工号,能够修改“职称”和“工资”。
Ø查找功能:
1)SearchData()函数。
要求能够根据“学号(教工号)”、“姓名”、“性别”三项实现查询,并能在屏幕上显示满足条件的数据记录。
2)FindMaxData()函数。
对学生,查找“English”课程成绩最高的学生记录并打印;对教师,查找“工资”最高的教师记录并打印。
要求:
采用函数模板实现。
Ø显示功能:
DisplayData()函数。
在屏幕上打印所有的数据记录;打印时,先打印学生的记录,后打印教师的记录。
并且按学生(教工号)升序打印。
(4)重载功能:
Ø要求对“<<”和“>>”运算符进行重载。
考虑到输人学生(教工)姓名时,名字中可能引入空格,所以重载“>>”运算符时,需要满足这个要求。
(5)异常处理功能:
Ø设置异常处理,对教师工资为负数的情况给出提示。
(6)文件的输入输出功能:
Ø能够从文件中读入数据。
外部文件为Student_ext.dat,Teacher_ext.dat。
Ø能够将数据保存到相应目录的文件中。
保存数据时,分两个文件分别保存Student.dat,Teacher.dat。
(7)参考系统界面如示:
Ø1-增加一位人员(教师、学生)记录
Ø2-删除一个人员记录
Ø3-修改一个人员记录
Ø4-根据“学号(教工号)”、“姓名”、“性别”查找记录
Ø5-根据人员类别(学生、教师)查找“English”课程成绩最高的学生,或最高工资的教师
Ø6-显示全部人员记录
Ø7-从外部文件追加数据
Ø8-将所有数据保存到磁盘文件
Ø9-退出系统。
三、总体设计
1、系统类的层次关系
1)People类-----虚基类
2)Student类----派生类
3)Teacher类----派生类
2、类的主要框架描述
1)People类-----虚基类
#ifndef_PEOPLE_H
#define_PEOPLE_H
#include
#include
usingnamespacestd;
#include
template//查找函数模板
ATmax(ATx,ATy)
{
return(x>y)?
x:
y;
}
usingnamespacestd;
constintStu_num=10;
constintTea_num=10;
classPeople
{
protected:
charsex;
stringname;
intage;
longdate;
intnumber;
stringdepartment;//工作系别或者专业
public:
People();
stringgetname()
{returnname;}
intgetnumber()
{returnnumber;}
intgetage()
{returnage;}
longgetdate()
{returndate;}
chargetsex()
{returnsex;}
stringgetdepartment()
{returndepartment;}
charflag;
voidUpdateData(People&p);
voidAddData(People&p);
voidDeleteData();
voidDisplayData();
voidSaveFile(ofstream&fout);
voidReadFile(ifstream&fin);
};
#endif
2)Student类----派生类
#include
classStudent:
virtualpublicPeople
{
protected:
intchinese;
intenglish;
intmath;
public:
voidAddData(Student*stu);
voidDeleteData();
voidUpdateData(Student*stu);
voidDisplayData();
voidSearchData(Student&stu);
voidFindMaxData(Student*stu);
voidSaveFile(ofstream&fout);
voidReadFile(ifstream&fin);
friendistream&operator>>(istream&in,Student&stu);
friendostream&operator<<(ostream&out,Student&stu);
};
3)Teacher类----派生类
#include
classTeacher:
virtualpublicPeople
{
protected:
doublesalary;
stringposition;
public:
Teacher();
doublegetsalary()
{returnsalary;}
stringgetposition()
{returnposition;}
voidDisplayData();
voidUpdateData(Teacher*tea);
voidAddData(Teacher*tea);
voidDeleteData();
voidFindMaxData(Teacher*tea);
voidSaveFile(ofstream&fout);
voidReadFile(ifstream&fin);
friendistream&operator>>(istream&in,Teacher&stu);
friendostream&operator<<(ostream&out,Teacher&stu);
};
四、系统测试用例
1、删除数据:
DeleteData()函数。
根据学号(教工号),删除该人员的记录
1)只删除学生
2)只删除教师:
3)删除number相同的教师跟学生:
2、UpdateData()函数。
对学生,根据学号,能够修改3门课的成绩;对教师,根据教工号,能够修改“职称”和“工资”。
1)修改学生的三门成绩:
2)修改教师的职称跟工资:
3、SearchData()函数。
要求能够根据“学号(教工号)”、“姓名”、“性别”三项实现查询,并能在屏幕上显示满足条件的数据记录。
4、FindMaxData()函数。
对学生,查找“English”课程成绩最高的学生记录并打印;对教师,查找“工资”最高的教师记录并打印。
要求:
采用函数模板实现。
1)查询English最大值:
2)查询salary最大值:
五、错误记录及原因分析
1、函数的定义跟声明形式不一样,调用不了函数。
2、主函数switch中某一分支break漏写,导致函数不能跳出.
3、文件头添加错误,将文件头添加在主函数,导致People类跟的派生类Student跟Teacher调用不了
4、细节错误:
括号的成对使用等细节问题。
5、教师类读出数据打印出来时,有全为零的一组数据,原因是在Teacher_ext.dat中数据结尾有空格。
六、源程序
Main:
#include
usingnamespacestd;
constintSTU_NUM=10;
constintTEA_NUM=10
#include
#include
Studentstu[STU_NUM];
Teachertea[TEA_NUM];
voidDisplayData();
/*************************************************增加数据********************************************************/
voidAddData()
{
charadd;
cout<<"pleaseinputpeopletype(s/t):
"<cin>>add;
if(add=='s')
{
stu[0].AddData(stu);
}
elseif(add=='t')
{
tea[0].AddData(tea);
}
else
{
cout<<"AddData():
ERROR!
!
!
"<}
}
/************************************************删除数据**********************************************************/
voidDeleteData()
{
intnum;
cout<<"pleaseinputthenumberyouwanttodelete:
"<cin>>num;
for(inti=0;i{
if(stu[i].getnumber()==num)
{
stu[i].flag=0;
break;
}
}
for(intj=0;j{
if(tea[j].getnumber()==num)
{
tea[j].flag=0;
break;
}
}
}
/**************************************************修改函数****************************************************************/
voidUpdateData()
{
charup;
cout<<"pleaseinputpeopletype(s/t)"<cin>>up;
if(up=='s')
{
stu[0].UpdateData(stu);
}
elseif(up=='t')
{
tea[0].UpdateData(tea);
}
}
/*******************************根据"学号(教工号)"、"姓名"、"性别"三项实现查询************************************************/
voidSearchData()//4、查找数据函数
{
chartype;
inti=0;
intnumber;
stringname;
charsex;
cout<<"pleaseenterthesearchtype(number
(1)、name
(2)、sex(3)):
"<cin>>type;
switch(type)
{
case'1':
cout<<"pleaseinputthenumberyousearch:
"<cin>>number;
for(i=0;i{
if(stu[i].getnumber()==number)
{
stu[i].DisplayData();
break;
}
}
for(i=0;i{
if(tea[i].getnumber()==number)
{
tea[i].DisplayData();
break;
}
}
break;
case'2':
cout<<"pleaseinputname:
"<cin>>name;
for(i=0;i{
if(stu[i].getname()==name)
{
stu[i].DisplayData();
break;
}
}
for(i=0;i{
if(tea[i].getname()==name)
{
tea[i].DisplayData();
break;
}
}
break;
case'3':
cout<<"pleaseinputthesex:
"<cin>>sex;
for(i=0;i{
if(stu[i].getsex()==sex)
{
stu[i].DisplayData();
}
}
for(i=0;i{
if(tea[i].getsex()==sex)
{
tea[i].DisplayData();
break;
}
}
break;
default:
cout<<"SearchData():
ERROR!
!
!
"<}
}
/****************************************************Findmax函数*********************************************************/
voidFindMaxData()
{
charFind;
cout<<"pleaseinputthepeopletype:
"<cin>>Find;
if(Find=='s')
{
stu[0].FindMaxData(stu);
}
elseif(Find=='t')
{
tea[0].FindMaxData(tea);
}
else
cout<<"FindMaxData():
ERROR!
!
";
}
/************************************************DisplayData()函数******************************************************************/
voidDisplayData()
{
charob;
cout<<"pleaseinputthetypeofpeople(sort):
"<cin>>ob;
if(ob=='s')
{
cout<<"--------------------------------------------------------------------------------"</*cout<<"name"<<"\t";
cout<<"sex"<<"\t";
cout<<"number"<<"\t";
cout<<"date"<<"\t";
cout<<"age"<<"\t";
cout<<"department"<<"\t";
cout<<"chinese"<<"\t";
cout<<"english"<<"\t";
cout<<"math"<for(inti=0;i{
if(stu[i].flag==1)
{
stu[i].DisplayData();
}
}
cout<<"------------------------------------------------------------------------------"<}
elseif(ob=='t')
{
cout<<"-------------------------------------------------------------------------------"<cout<<"name"<<"\t";
cout<<"sex"<<"\t";
cout<<"number"<<"\t";
cout<<"date"<<"\t";
cout<<"age"<<"\t";
cout<<"department"<<"\t";
cout<<"position"<<"\t";
cout<<"salary"<<"\t";
for(intk=0;k{
if(tea[k].flag==1)
{
tea[k].DisplayData();
}
}
cout<<"-------------------------------------------------------------------------------"<}
else
cout<<"DisplayData():
ERROR!
"<}
/************************************************************************************************************/
intReadFile()//7
{
charread;
cout<<"pleaseinputthepeopletype1:
"<cin>>read;
if(read=='s')
{
ifstreamfin("Student_ext.dat",ios:
:
in);
if(!
fin)
{
cout<<"Cannotopeninputfile\n";
return1;
}
for(inti=0;i{
if(stu[i].flag==0&&fin.eof()==0)
{
stu[i].ReadFile(fin);
stu[i].flag=1;
}
}
fin.close();
}
elseif(read=='t')
{
ifstreamfin("Teacher_ext.dat",ios:
:
in);
if(!
fin)
{
cout<<"Cannotopeninputfile\n";
return1;
}
for(intk=0;k{
if(stu[k].flag==0&&fin.eof()==0)
{
tea[k].ReadFile(fin);
tea[k].flag=1;
}
}
fin.close();
}
return0;
}
/*********************************************************************************************************/
intSaveFile()//8
{
charsave;
cout<<"pleaseinputthepeopletype2:
"<cin>>save;
if(save=='s')
{
ofstreamfout("Student.dat",ios:
:
out);
if(!
fout)
{
cout<<"Cannotopenoutputfile\n";
return1;
}
fout<<"--------------------------------------------------------------------------------------------------------------"<fout<<"name"<<"\t"<<"sex"<<"\t"<<"number"<<"\t"<<"date"<<"\t"<<"age"<<"\t"<<"department"<<"\t"<<"chinese"<<"\t"<<"math"<<"\t"<<"english"<for(inti=0;i