
面
向
对
象
程
序
设
计
大
作
业
姓名:叶尔凯西
学院(系):计科系
班级:计科系07-1班
学号:***********
设计本程序的目的:
关于一些并不太复杂的集体来说,一般需要管理集体中的每个人的基本信息的,本程序专门为一些在校学生的基本信息的管理而设计的,主要目的是通过本程序来实现简单的记录和查找学生的基本信息;
程序功能简介:
本程序是通过面向对象的最重要的特点“类”来设计出来的,其功能是实现简单的学生基本信息管理。包括一些要求用户从键盘输入(记录)学生的基本信息、输出学生的基本信息和用学生的学号来查找学生信息表中的某个学生的基本信息等功能;
程序功能的详细介绍:
本人设计程序时考虑到的很所内容,其中输入输出学生的基本信息是最基本的功能。下面来给大家介绍程序的核心类的构建:
1在程序建立了两种类,分别是person类和student类。person作为student类的基类,其内部是如下设计的:
class person
{
public:
void SetPersonAddress(char *AddressFromMain);
void SetPersonSex(char *SexFromMain);
void ShowPersonSex();
void ShowPersonAddress();
private:
char Address[25];
char Sex[2];
};
可以看到,在上面分别声明了四个成员函数和两个数据成员。四个成员函数的作用是对私有数据成员进行访问(包括输入和输出)。所以当建立了一个person类之后就可以通过它的对象来访问该类的数据成员。
下面分别说明每一个成员函数的具体定义:
(1)设置(输入)人地址的成员函数:
void person::SetPersonAddress(char *AddressFromMain)
{
strcpy(Address,AddressFromMain);
}
通过strcpy把字符指针的内容送入person类中的数据成员Address。
(2)设置(输入)人性别的成员函数:
void person::SetPersonSex(char *SexFromMain)
{
strcpy(Sex,SexFromMain);
}
通过strcpy把字符指针SexFromMain的内容作为地址的存储单元中的内容送入person类中Sex数据成员。
(3)输出地址成员函数:
void person::ShowPersonAddress()
{
cout<
}输出person类中的Address数据成员的内容;
(4)输出性别的成员函数:
void person::ShowPersonSex()
{
cout< 输出person类中的Sex数据成员的内容; ②接下来就是person基类的派生类student类的内部设计如下: class student: public person { public: void SetStudentInformation(char*NameFromMain,char *StudentAddressFromMain,char *StudentSexFromMain,char *StudentNumberFromMain, int *score); void ShowStudentInformation(); friend void FindStudentNumber(student *data); friend void FindStudentName(student *data); private: int MathResult,EnglishResult,CResult,CompilationLanguageResult,DigitalLogicResult,MarksismResult; char StudentNumber[25]; char Name[25]; float Average; int total; }; 当设计student派生类的时候,最主要的特点就是利用了“类”的一个特点继承。 所以说派生出来的student类也具有基类person的一些特点。在继承的方式上本人使用了共有继承方式(public),下面来给大家介绍student类的内部构造: 1成员函数共有设置(输入)学生信息、输出学生信息等两个。还有一个非成员函数的一个函数,它为该student类的友元函数,其功能是实现查找。 除此之外还有从基类person类继承下来的一些成员函数; 2数据成员分别为整形变量的学生成绩(包括数学成绩、英语成绩、C++成绩、汇编语言成绩、数字逻辑成绩、马克思哲学成绩等),字符数组的学生学号和学生姓名以及整型变量的学生的总分和单精度变量的平均分; 下面介绍student派生类中的各个成员函数的定义部分: 设置(输入)学生信息的成员函数: Void student::SetStudentInformation(char*NameFromMain,char*StudentAddressFromMain,char* StudentSexFromMain,char *StudentNumberFromMain, int *score) { strcpy(Name,NameFromMain); SetPersonAddress(StudentAddressFromMain); SetPersonSex(StudentSexFromMain); strcpy(StudentNumber ,StudentNumberFromMain); for(int i=0; i<6; i++) { switch(i) { case 0: MathResult=score[0]; case 1: EnglishResult=score[1]; case 2: CResult=score[2]; case 3: CompilationLanguageResult=score[3]; case 4: DigitalLogicResult=score[4]; case 5: MarksismResult=score[5]; } } total=MathResult+EnglishResult+CResult+CompilationLanguageResult+DigitalLogicResult+MarksismResult; Average=total/6.0; } 可以看到在设计student类的输入成员函数时其内部同时调用了从基类继承下来的一些成员函数,这就是继承的特点。下面将会详细地介绍该成员函数的功能: 首先是student类的两个字符数组变量学生姓名和学生学号的赋值通过strcpy来直接实现,也就是可通过该类的成员函数来给数据成员赋值。还有两个数据成员是不能够被继承下来的基类的两个字符数组学生性别和家庭地址,它们是通过student派生类的成员函数中调用从基类person中继承下来的成员函数,从而改变对不能被继承下来的基类的数据成员赋值。接着就是对student类中自己的数据成员学生成绩的赋值,它们是通过一个简单的switch case语句来实现的。 输出学生信息的成员函数: void student::ShowStudentInformation() { cout< cout<<"学生的家庭地址为: "; ShowPersonAddress(); cout< cout<<"学生的性别为: "; ShowPersonSex(); cout< cout<<"学生的考试课程成绩如下: "< cout<<"学生的离散数学课程成绩为: "< cout<<"学生的英语课程成绩为: "< cout<<"学生的C++课程成绩为: "< cout<<"学生的汇编语言课程成绩为: "< cout<<"学生的数字逻辑课程成绩为: "< cout<<"学生的马克思主义哲学课程成绩为: "< cout<<"学生的总分为:"< 输出学生信息的成员函数的定义中不难发现输出时不仅会输出student派生类自己的数据成员的值还会同时输出不能被继承下来的基类person中的数据成员的值。这显然只能通过继承下来的成员函数来实现(如ShowPersonAddress()和ShowPersonSex())。 下面来介绍三个非成员函数,其中两个为student类的友元函数。它就是实现查找功能的(分别用学生学号和学生姓名来进行查找),另一个是一个单独的普通函数。其功能是当程序运行时保持一个用户界面的功能。 Student类共有两个友元函数,分别是friend void FindStudentNumber(student *data)和friend void FindStudentName(student *data),它们两个都有查找功能,只是一个用学生的学号另一个用学生的姓名进行查找。 下面详细介绍student类的两个友元函数中的用学号查找的函数是如何的定义: void FindStudentNumber(student *data) { char findnum[25]; cout<<"请输入学号:"; cin>>findnum; int i=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类的两个友元函数中的用姓名查找的函数是如何的定义: void FindStudentName(student *data) { char findname[25]; cout<<"请输入姓名:"; cin>>findname; int i=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(学生学号)相等时查找便成功并提示用户该学号或姓名为基本信息的学生信息输出在屏幕上,当不相等时查找不成功并提示用户没有找到学生的记录。 下面介绍非成员函数即普通函数(程序运行时保持一个用户界面功能的函数): void paint() { int i; cout<<" 学生信息管理系统"< putchar('%'); cout< putchar('%'); cout< 上面的普通函数只是一个简单的函数,其功能只是在屏幕上保持如下一个画面: 学生信息管理系统 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% (1) 输入学生的信息 (3)用学号查找学生基本信息 (2) 输出学生信息 (4)用姓名查找学生基本信息 (0) 退出程序 备注:如果您还没有输入任何信息,请先输入信息再输出! %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 接着给大家介绍主函数main的定义部分: void main() { char StuSex[2],StuName[25] ,StuAddress[25],StuNumber[25]; int StuScore[6],ctrl; int i=0,j; student stu[StuNum]; paint(); cout<<"请选择一个序号 "< while (ctrl != 0) { switch(ctrl) { case 1: for(i; i system("cls"); cout<<"请输入第"< cout<<"请输入学生的姓名:"; cin>>StuName; cout< cin>>StuSex; cout< cin>>StuNumber; cout< cin>>StuAddress; cout< cout<<"请按顺序输入学生的考试成绩"< cin>>StuScore[0]; cout< cin>>StuScore[1]; cout< cin>>StuScore[2]; cout< cin>>StuScore[3]; cout< cin>>StuScore[4]; cout< cin>>StuScore[5]; cout< stu[i].SetStudentInformation(StuName,StuAddress,StuSex,StuNumber,StuScore); } break; case 2: cout< for(j=0; j system("pause"); break; case 3: cout< FindStudentNumber(stu); system("pause"); break; case 4: cout< FindStudentName(stu); system("pause"); break; } if (ctrl != '\\n') system("cls"); paint(); cout<<"请选择一个序号"< } } main主函数的实现比较长,主要是因为在main函数中不仅仅定义了普通变量(基本变量)用来暂时存放从键盘输入的学生基本信息,还定义了student类的对象数组,且使用了while循环和switch case语句来不停地进行选择,case的每一个分句分别实现不同的功能,case 1主要实现输入,用for循环来把student对象数组的每一个对象本别进行赋值;case 2主要实现输出功能,输出时用for循环调用每一个student数组对象的ShowStudentInformation()函数(输出学生信息的成员函数);case 3和case 4主要就是实现查找功能,只是因为查找函数不是student类的成员函数,所以可以直接调用函数,在实参表里写了student对象数组的首地址,把student对象数组的首地址传递给查找函数; 程序源代码: #include #include using namespace std; const int StuNum=1; class person { public: void SetPersonAddress(char *AddressFromMain); void SetPersonSex(char *SexFromMain); void ShowPersonSex(); void ShowPersonAddress(); private: char Address[25]; char Sex[2]; }; void person::SetPersonAddress(char *AddressFromMain) { strcpy(Address,AddressFromMain); } void person::SetPersonSex(char *SexFromMain) { strcpy(Sex,SexFromMain); } void person::ShowPersonAddress() { cout< void person::ShowPersonSex() { cout< class student: public person { public: void SetStudentInformation(char *NameFromMain,char *StudentAddressFromMain,char *StudentSexFromMain,char *StudentNumberFromMain, int *score); void ShowStudentInformation(); friend void FindStudentNumber(student *data); friend void FindStudentName(student *data); private: int MathResult,EnglishResult,CResult,CompilationLanguageResult,DigitalLogicResult,MarksismResult; char StudentNumber[25]; char Name[25]; float Average; int total; }; void student::SetStudentInformation(char *NameFromMain,char *StudentAddressFromMain,char* StudentSexFromMain,char *StudentNumberFromMain, int *score) { strcpy(Name,NameFromMain); SetPersonAddress(StudentAddressFromMain); SetPersonSex(StudentSexFromMain); strcpy(StudentNumber ,StudentNumberFromMain); for(int i=0; i<6; i++) { switch(i) { case 0: MathResult=score[0]; case 1: EnglishResult=score[1]; case 2: CResult=score[2]; case 3: CompilationLanguageResult=score[3]; case 4: DigitalLogicResult=score[4]; case 5: MarksismResult=score[5]; } } total=MathResult+EnglishResult+CResult+CompilationLanguageResult+DigitalLogicResult+MarksismResult; Average=total/6.0; } void student::ShowStudentInformation() { cout< cout<<"学生的家庭地址为: "; ShowPersonAddress(); cout< cout<<"学生的性别为: "; ShowPersonSex(); cout< cout<<"学生的考试课程成绩如下: "< cout<<"学生的离散数学课程成绩为: "< cout<<"学生的英语课程成绩为: "< cout<<"学生的C++课程成绩为: "< cout<<"学生的汇编语言课程成绩为: "< cout<<"学生的数字逻辑课程成绩为: "< cout<<"学生的马克思主义哲学课程成绩为: "< cout<<"学生的总分为:"< void FindStudentNumber(student *data) { char findnum[25]; cout<<"请输入学号:"; cin>>findnum; int i=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<<"在编号"< } } void FindStudentName(student *data) { char findname[25]; cout<<"请输入姓名:"; cin>>findname; int i=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<<"在编号"< } } void paint() { int i; cout<<" 学生信息管理系统"< putchar('%'); cout< putchar('%'); cout< void main() { char StuSex[2],StuName[25] ,StuAddress[25],StuNumber[25]; int StuScore[6],ctrl; int i=0,j; student stu[StuNum]; paint(); cout<<"请选择一个序号 "< while (ctrl != 0) { switch(ctrl) { case 1: for(i; i system("cls"); cout<<"请输入第"< cout<<"请输入学生的姓名:"; cin>>StuName; cout< cin>>StuSex; cout< cin>>StuNumber; cout< cin>>StuAddress; cout< cout<<"请按顺序输入学生的考试成绩"< cin>>StuScore[0]; cout< cin>>StuScore[1]; cout< cin>>StuScore[2]; cout< cin>>StuScore[3]; cout< cin>>StuScore[4]; cout< cin>>StuScore[5]; cout< stu[i].SetStudentInformation(StuName,StuAddress,StuSex,StuNumber,StuScore); } break; case 2: cout< for(j=0; j system("pause"); break; case 3: cout< FindStudentNumber(stu); system("pause"); break; case 4: cout< FindStudentName(stu); system("pause"); break; } if (ctrl != '\\n') system("cls"); paint(); cout<<"请选择一个序号"< } }
