文档库

最新最全的文档下载
当前位置:文档库 > c++期末大作业

c++期末大作业

C++语言是面向对象的语言,它可以相当方便并且十分有效地帮你达到目的。与C相比,C++定义了类这种对象的组织形式,提供了程序在不同部分之间更好的共享数据及进行函数控制的方法。封装不仅提供了更大范围的控制,而且使得在源代码中公有/私有区别更加清晰。多态完成了分散化控制,重载(函数重载、运算符重载)实现了使用同一运算符实现不同功能,使得程序更简便。

以下列程序的实现为例具体说明。

学校人员信息管理程序,管理学生和教师的基本信息。程序完成功能:

(1) 分类浏览 (2) 增加(3) 查询 (4)输出到文件(5)其他

要求:

1、定义一个学生类Student。需要存储每个学生的姓名、学号、性别等信息。定义教师类Teacher,存储每个教师的编号、姓名、性别、职称等信息。定义抽象类Person,保存人员的基本信息,如姓名、性别等。定义一个班级类Class,每个学生在一个班级中学习,每个教师负责多个班级的教学辅导。

2、定义各类的成员函数:分别实现获取、修改信息等相关操作。

3、通过在基类Person建立纯虚函数,实现按姓名输出教师或学生的信息。

4、重载流提取运算符,使能对Student类的对象进行输出操作。

5、根据需要,适当添加其他必要的数据成员和成员函数,如构造函数、拷贝构造函数、析构函数、运算符重载,按学号或姓名排序等。

分析:

学校人员包括学生和教师,学生和教师都应该储存姓名、性别、年龄、身份证号码等基本信息,初步可以建立三个类,可建立抽象类Person,用于实现姓名、性别、身份证号码、电话等基本信息的储存。学生与教师的区别在于学生有学号,只有一个所在班级,而教师有职称,编号,每个教师会负责多个班级。定义学生类Student,继承Person类的功能,增加学生的学号、所在班级、宿舍号;定义教师类Teacher,继承Person类的基本功能,增加教师的编号、职称。另外需定义一个班级类Class,每个学生属于一个班级,可用一个成员函数X实现,一个教师负责多个班级的教学辅导,可用成员函数Y来实现。学生类Student继承班级类Class,访问其成员函数Y,教师类Teacher继承班级类Class,访问其成员函数Y。

学校人员信息管理不仅包括各种信息的储存,还要做到每个人的信息都可以输出,可以根据姓名或者学号、编号查找到他的其它各种信息。学校成员会变动,学生增加,教师增加,所以各种信息也相应增加。人员的信息也会存在变动,比

如学生转专业,班级变动;教师负责的班级变动。整体需设计四个模块,模块一用于将储存的信息输出,模块二用于查找人员信息,模块三用于增加新成员的信息,模块四用于修改人员信息。

类的实现

下面是Person ,Class ,Student ,Teacher,三个类的声明

//定义一个表示人的类Person

class Person

{

public: //外部接口

Person(); //Person类的构造函数

//下面的display为虚函数,用于多态

virtual void display(void); //此函数用于显示类中的成员

void SetAge(int); //用于设置人的年龄

void SetName(char *); //用于设置人的姓名

void SetSex(bool); //用于设置人的性别

protected:

int m_age; //此成员变量用于保存人的年龄

char m_name[32]; //保存人的姓名

bool m_sex; //保存人的性别,true为男,false为女};

//定义一个表示班级的类Class

class Class

{

public:

Class();

Void SetClass(int); //用于设置学生的班级

Void SetClasses(int); //用于设置教师负责的班级

protected:

char m_name[32];

}

//定义一个Student类,该类是从Person类继承过来的

class Student:public Person,public Class

{

public: //外部接口

Student(); //Student 的构造函数

virtual void display(void); //用于显示类中的成员

void SetStdNO(char *); //设置学号

void SetClass(int); //继承Class类,设置班级

private:

char m_stdNO[32]; //保存学号

};

//定义一个teacher类,该类也是从person类继承过来的

class Teacher:public Person

{

public: //外部接口

Teacher(); //Teacher 的构造函数

virtual void display(void); //用于显示类中的成员

void SetTTP(char *); //设置职称

void SetClasses(int); //继承Class类,设置负责班级private:

char m_TTP[32]; //保存职称

};

下面是Person ,Student ,Teacher三个类定义的实现

Person类定义的实现

//定义Person类的构造函数,在这里对成员变量进行初始化Person::Person()

{

*m_name = 0;

m_sex = true;

m_age = 0;

};

//定义Person类的打印函数,用于打印Person类的的成员信息

void Person::display()

{

cout<<"从类person中打印出来的......"<

cout<<"姓名\t"<<"性别\t"<<"年龄"<

cout<<"------------------------"<

cout<

//定义Person类的设置年龄的接口函数

void Person::SetAge(int iAge)

{

m_age = iAge;

};

//定义Person类的设置姓名的接口函数

void Person::SetName(char * pName)

{

strcpy(m_name,pName);

};

//定义Person类的设置姓名的接口函数

void Person::SetSex(bool blSex)

{

m_sex = blSex;

};

Class类定义的实现

//定义Class类的构造函数,在这里对成员变量进行初始化Class::Class()

{

*m_name=0

};

//定义Class类的设置学生所在班级的接口函数

void Class::SetClass(int classnumber)

{

m_class=classnumber;

}

Student类定义的实现

//定义Student类的构造函数,用于初始化Student的成员变量Student::Student():Person()

{

m_stdNO[0]= 0;

m_math = m_english = m_physics = m_chem = 0;

};

//定义Student类的设置学号接口函数

void Student::SetStdNO(char * strStdNo)

{

strcpy(m_stdNO,strStdNo);

};

//定义Student类的打印函数,用于打印Student类的成员信息

void Student::display()

{

cout<<"从类Student中打印出来的......"<

cout<<"姓名\t"<

cout<

};

Teacher类定义的实现

//定义Teacher类的构造函数,在这里对成员变量进行初始化

Teacher::Teacher():Person()

{

*m_TTP = 0;

};

//定义Teacher类的设置职称的接口函数

void Teacher::SetTTP(char * ttp)

{

strcpy(m_TTP,ttp);

};

//定义Teacher类的打印函数,用于打印Teacher类的成员信息

void Teacher::display()

{

cout<<"从类teacher中打印出来的......"<

cout<<"姓名\t"<<"性别\t"<<"年龄\t"<<"职称"<

cout<

三、程序调试

在main函数前先定义如下三个display函数(display1、display2、display3)和三个function函数(function1、function2、function3)。display函数:

void display1()

{cout<<"请输入操作对象...\n"<<"(1): 老师\n"<<"(2): 学生\n"<<"(3)退出程序"<

void display2()

{cout<<"(1)浏览信息(显示老师信息)\n"<<"(2)增加信息\n"<<"(3)查询(按姓名)\n"<<"(4)退出对老师的操作"<

void display3()

{cout<<"(1)浏览信息(显示学生信息)\n"<<"(2)增加信息\n"<<"(3)查询(按姓名)\n"<<"(4)退出对学生的操作"<

这三个display函数可以对相应操作进行提示。

function函数:

void function1(char who) //用于浏览信息{ char line[51]; //将信息读入到这个数组中进行处理if(who=='t')

{ ifstream tfile("teacher.txt",ios_base::in); //以读入方式打开teacher文件while( tfile.good() )

{ tfile.getline(line,50); cout<

// 将文件中的信息按行读到line数组中,最多可读入50个字符tfile.close(); }

else { ifstream tfile("student.txt",ios_base::in); while( tfile.good() )

{ tfile.getline(line,50); cout<

//将文件中的信息按行读到line数组中,最多可读入50个字符,然后将其输出tfile.close(); }

}

void function2(char who) //用以增加信息

{ string name,sex,bianhao,zhicheng,xuehao; char choice;

if(who=='t')

{ ofstream tfile("teacher.txt",ios_base::app);//追加

do

{ teacher *t=new teacher;

cout<<"请输入这位老师的姓名: ";cin>>name; t->setname(name);

cout<<"请输入这位老师的性别: ";cin>>sex; t->setsex(sex);

cout<<"请输入这位老师的编号: ";cin>>bianhao; t->setbianhao(bianhao);

cout<<"请输入这位老师的职称: ";cin>>zhiye; t->setzhicheng(zhicheng);

tfile<getname()<<''<getsex()<<''<getbianhao()<<' '<getzhiye()<

delete t;

cout<<"继续添加吗?(N/Y) ";cin>>choice;}while(choice=='Y'||choice=='y');

tfile.close();

}

else { ofstream tfile("student.txt",ios_base::app); //追加信息

do{ student *s=new student;

cout<<"请输入这位学生的姓名: ";cin>>name; s->setname(name);

cout<<"请输入这位学生的性别: ";cin>>sex; s->setsex(sex);

cout<<"请输入这位学生的学号: ";cin>>xuehao; s->setxuehao(xuehao);

tfile<getname()<<' '<getsex()<<' '<getxuehao()<

delete s;

cout<<"继续添加吗?(N/Y) ";cin>>choice; }while(choice=='Y'||choice=='y');

}

}

void function3(char who) //用以查询信息{ string name1; string n,s,x; char line[51]; char *p=NULL;

char name2[10],sex[5]; int i=0;

if(who=='t') { ifstream tfile("teacher.txt",ios_base::in);同上cout<<"请输入要查找的老师的姓名: "; cin>>name1;

while( tfile.good() )

{ tfile.getline(line,50); 同上

i=0; p=line;

while(*p!=' ') {name2[i++]=*p; p++; }

name2[i]='\0';

if(name1==name2)

{cout<

if( ! tfile.good() )cout<<"...........无此人..........,"<

cout<<"请输入要查找的学生的姓名: ";cin>>name1;

while( tfile.good() )

{ tfile.getline(line,50); i=0; p=line;

while(*p!=' ') {name2[i++]=*p; p++; }

name2[i]='\0';

if(name1==name2)

{ n=name2; p++; i=0;

while(*p!=' ') //测试重载流提取运算符

{ sex[i++]=*p; p++;}

sex[i]='\0'; s=sex; p++;

x=p; //将学号赋给x

student stu;

stu.setname(n); stu.setsex(s); stu.setxuehao(x);

stu.operator<<(stu); //测试重载流提取运算符

cout<

if( ! tfile.good() )cout<<"..........无此人.........."<

}

在main函数中,首先由display1输出操作提示信息,选择操作对象。根据用户输入操作对象的不同,由switch语句进行老师,学生,教授的分类浏览。其次,若用户选择操作对象为老师(学生),则由display2(display3)输出“浏览”、“增加”、“查询”或“退出程序”的操作提示信息,根据用户选择操作方法的不同,分别由function1、function2、function3进行浏览、添加和查询的操作。