}
输出person类中的Sex数据成员的内容;
②接下来就是person基类的派生类student类的内部设计如下:
classstudent:
publicperson
{
public:
voidSetStudentInformation(char*NameFromMain,char*StudentAddressFromMain,char*StudentSexFromMain,char*StudentNumberFromMain,int*score);
voidShowStudentInformation();
friendvoidFindStudentNumber(student*data);
friendvoidFindStudentName(student*data);
private:
intMathResult,EnglishResult,CResult,CompilationLanguageResult,DigitalLogicResult,MarksismResult;
charStudentNumber[25];
charName[25];
floatAverage;
inttotal;
};
当设计student派生类的时候,最主要的特点就是利用了“类”的一个特点继承。
所以说派生出来的student类也具有基类person的一些特点。
在继承的方式上本人使用了共有继承方式(public),下面来给大家介绍student类的内部构造:
1成员函数共有设置(输入)学生信息、输出学生信息等两个。
还有一个非成员函数的一个函数,它为该student类的友元函数,其功能是实现查找。
除此之外还有从基类person类继承下来的一些成员函数;
2数据成员分别为整形变量的学生成绩(包括数学成绩、英语成绩、C++成绩、汇编语言成绩、数字逻辑成绩、马克思哲学成绩等),字符数组的学生学号和学生姓名以及整型变量的学生的总分和单精度变量的平均分;
下面介绍student派生类中的各个成员函数的定义部分:
设置(输入)学生信息的成员函数:
Voidstudent:
:
SetStudentInformation(char*NameFromMain,char*StudentAddressFromMain,char*StudentSexFromMain,char*StudentNumberFromMain,int*score)
{
strcpy(Name,NameFromMain);
SetPersonAddress(StudentAddressFromMain);
SetPersonSex(StudentSexFromMain);
strcpy(StudentNumber,StudentNumberFromMain);
for(inti=0;i<6;i++)
{
switch(i)
{
case0:
MathResult=score[0];
case1:
EnglishResult=score[1];
case2:
CResult=score[2];
case3:
CompilationLanguageResult=score[3];
case4:
DigitalLogicResult=score[4];
case5:
MarksismResult=score[5];
}
}
total=MathResult+EnglishResult+CResult+CompilationLanguageResult+DigitalLogicResult+MarksismResult;
Average=total/6.0;
}
可以看到在设计student类的输入成员函数时其内部同时调用了从基类继承下来的一些成员函数,这就是继承的特点。
下面将会详细地介绍该成员函数的功能:
首先是student类的两个字符数组变量学生姓名和学生学号的赋值通过strcpy来直接实现,也就是可通过该类的成员函数来给数据成员赋值。
还有两个数据成员是不能够被继承下来的基类的两个字符数组学生性别和家庭地址,它们是通过student派生类的成员函数中调用从基类person中继承下来的成员函数,从而改变对不能被继承下来的基类的数据成员赋值。
接着就是对student类中自己的数据成员学生成绩的赋值,它们是通过一个简单的switchcase语句来实现的。
输出学生信息的成员函数:
voidstudent:
:
ShowStudentInformation()
{
cout<cout<<"学生的基本信息如下:
"<cout<<"学生的姓名:
"<cout<<"学生的学号为:
"<cout<<"学生的家庭地址为:
";
ShowPersonAddress();
cout<cout<<"学生的性别为:
";
ShowPersonSex();
cout<cout<<"学生的考试课程成绩如下:
"<cout<<"学生的离散数学课程成绩为:
"<cout<<"学生的英语课程成绩为:
"<cout<<"学生的C++课程成绩为:
"<cout<<"学生的汇编语言课程成绩为:
"<cout<<"学生的数字逻辑课程成绩为:
"<cout<<"学生的马克思主义哲学课程成绩为:
"<cout<<"学生的总分为:
"<cout<<"学生的平均分为:
"<}
输出学生信息的成员函数的定义中不难发现输出时不仅会输出student派生类自己的数据成员的值还会同时输出不能被继承下来的基类person中的数据成员的值。
这显然只能通过继承下来的成员函数来实现(如ShowPersonAddress()和ShowPersonSex())。
下面来介绍三个非成员函数,其中两个为student类的友元函数。
它就是实现查找功能的(分别用学生学号和学生姓名来进行查找),另一个是一个单独的普通函数。
其功能是当程序运行时保持一个用户界面的功能。
Student类共有两个友元函数,分别是friendvoidFindStudentNumber(student*data)和friendvoidFindStudentName(student*data),它们两个都有查找功能,只是一个用学生的学号另一个用学生的姓名进行查找。
下面详细介绍student类的两个友元函数中的用学号查找的函数是如何的定义:
voidFindStudentNumber(student*data)
{
charfindnum[25];
cout<<"请输入学号:
";
cin>>findnum;
inti=0;
for(i;i{
if(strcmp(data[i].StudentNumber,findnum)==0)
{
cout<<"在第"<
"<data[i].ShowStudentInformation();
}
if((strcmp(data[i].StudentNumber,findnum)<0)||(strcmp(data[i].StudentNumber,findnum)>0))
cout<<"在编号"<
!
!
"<}
}
下面详细介绍student类的两个友元函数中的用姓名查找的函数是如何的定义:
voidFindStudentName(student*data)
{
charfindname[25];
cout<<"请输入姓名:
";
cin>>findname;
inti=0;
for(i;i{
if(strcmp(data[i].Name,findname)==0)
{
cout<<"在第"<
"<data[i].ShowStudentInformation();
}
if((strcmp(data[i].Name,findname)<0)||(strcmp(data[i].Name,findname)>0))
cout<<"在编号"<
!
!
"<}
}
可以看出student类的两个友元函数即查找(分别用学号和姓名)函数的定义都很相似,主要是算法是一致。
因为在student类中数据成员学生姓名和学生学号都是用字符数组来定义的,所以上面的两个分别用学号和姓名来查找的函数的算法是基本一致的,只是一个是用student类的一个对象中里面的name(姓名)去查找,另一个是用student类的一个对象中里面的StudentNumber(学生姓名)去查找。
在整个查找函数先是在函数的参数表中声明student类的对象指针,在主函数main中当调用查找函数时把main函数中定义的student类的数组的首地址传送给查找函数。
在查找函数中先定义一个字符数组,再提示用户输入要查找的学生的姓名或学号,当姓名或学号在相应的学生编号里的相应的name(姓名)和StudentNumber(学生学号)相等时查找便成功并提示用户该学号或姓名为基本信息的学生信息输出在屏幕上,当不相等时查找不成功并提示用户没有找到学生的记录。
下面介绍非成员函数即普通函数(程序运行时保持一个用户界面功能的函数):
voidpaint()
{
inti;
cout<<"学生信息管理系统"<for(i=0;i<80;i++)
putchar('%');
cout<cout<<"
(1)输入学生的信息(3)用学号查找学生基本信息"<cout<cout<<"
(2)输出学生信息(4)用姓名查找学生基本信息"<cout<cout<<"(0)退出程序"<cout<<"备注:
如果您还没有输入任何信息,请先输入信息再输出!
"<cout<for(i=0;i<80;i++)
putchar('%');
cout<}
上面的普通函数只是一个简单的函数,其功能只是在屏幕上保持如下一个画面:
学生信息管理系统
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
(1)输入学生的信息(3)用学号查找学生基本信息
(2)输出学生信息(4)用姓名查找学生基本信息
(0)退出程序
备注:
如果您还没有输入任何信息,请先输入信息再输出!
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
接着给大家介绍主函数main的定义部分:
voidmain()
{
charStuSex[2],StuName[25],StuAddress[25],StuNumber[25];
intStuScore[6],ctrl;
inti=0,j;
studentstu[StuNum];
paint();
cout<<"请选择一个序号"<cin>>ctrl;
while(ctrl!
=0)
{
switch(ctrl)
{
case1:
for(i;i{
system("cls");
cout<<"请输入第"<
"<cout<<"请输入学生的姓名:
";
cin>>StuName;
cout<cout<<"请输入学生的性别:
";
cin>>StuSex;
cout<cout<<"请输入学生的学号:
";
cin>>StuNumber;
cout<cout<<"请输入学生的家庭地址:
";
cin>>StuAddress;
cout<cout<<"请按顺序输入学生的考试成绩"<cout<cout<<"离散数学课程成绩:
";
cin>>StuScore[0];
cout<cout<<"英语课程成绩:
";
cin>>StuScore[1];
cout<cout<<"C++课程成绩:
";
cin>>StuScore[2];
cout<cout<<"汇编语言课程成绩:
";
cin>>StuScore[3];
cout<cout<<"数字逻辑课程成绩:
";
cin>>StuScore[4];
cout<cout<<"马克思主义哲学课程成绩:
";
cin>>StuScore[5];
cout<stu[i].SetStudentInformation(StuName,StuAddress,StuSex,StuNumber,StuScore);
}
break;
case2:
cout<system("cls");
for(j=0;jstu[j].ShowStudentInformation();
system("pause");
break;
case3:
cout<system("cls");
FindStudentNumber(stu);
system("pause");
break;
case4:
cout<system("cls");
FindStudentName(stu);
system("pause");
break;
}
if(ctrl!
='\n')
system("cls");
paint();
cout<<"请选择一个序号"<cin>>ctrl;
}
}
main主函数的实现比较长,主要是因为在main函数中不仅仅定义了普通变量(基本变量)用来暂时存放从键盘输入的学生基本信息,还定义了student类的对象数组,且使用了while循环和switchcase语句来不停地进行选择,case的每一个分句分别实现不同的功能,case1主要实现输入,用for循环来把student对象数组的每一个对象本别进行赋值;case2主要实现输出功能,输出时用for循环调用每一个student数组对象的ShowStudentInformation()函数(输出学生信息的成员函数);case3和case4主要就是实现查找功能,只是因为查找函数不是student类的成员函数,所以可以直接调用函数,在实参表里写了student对象数组的首地址,把student对象数组的首地址传递给查找函数;
程序源代码:
#include
#include
usingnamespacestd;
constintStuNum=1;
classperson
{
public:
voidSetPersonAddress(char*AddressFromMain);
voidSetPersonSex(char*SexFromMain);
voidShowPersonSex();
voidShowPersonAddress();
private:
charAddress[25];
charSex[2];
};
voidperson:
:
SetPersonAddress(char*AddressFromMain)
{
strcpy(Address,AddressFromMain);
}
voidperson:
:
SetPersonSex(char*SexFromMain)
{
strcpy(Sex,SexFromMain);
}
voidperson:
:
ShowPersonAddress()
{
cout<
}
voidperson:
:
ShowPersonSex()
{
cout<}
classstudent:
publicperson
{
public:
voidSetStudentInformation(char*NameFromMain,char*StudentAddressFromMain,char*StudentSexFromMain,char*StudentNumberFromMain,int*score);
voidShowStudentInformation();
friendvoidFindStudentNumber(student*data);
friendvoidFindStudentName(student*data);
private:
intMathResult,EnglishResult,CResult,CompilationLanguageResult,DigitalLogicResult,MarksismResult;
charStudentNumber[25];
charName[25];
floatAverage;
inttotal;
};
voidstudent:
:
SetStudentInformation(char*NameFromMain,char*StudentAddressFromMain,char*StudentSexFrom