⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ex8_5_1.cpp

📁 C++程序设计课本源码,供学习计算机的大学生们参考
💻 CPP
字号:
#include<iostream.h>
#include<string.h>

enum Tsex{mid,man,woman};
struct course{
	char* coursename;
	int grade;
};
class Person{
	char IdPerson[19];			//身份证号,18位数字
	char *Name;				//姓名
	Tsex Sex;				//性别
	int Birthday;				//生日,格式1986年8月18日写作19860818
	char *HomeAddress;		//家庭地址
public:
	Person(char *,char *,Tsex,int,char *);
	Person();
	Person(Person &ps);
	virtual ~Person();
	Person & operator=(Person &);
	void copy(Person &ps);
	void PrintPersonInfo();
};
Person::Person(char *id,char *name,Tsex sex,int birthday,char *homeadd){
	strcpy(IdPerson,id);
	Name=new char[strlen(name)+1];
	strcpy(Name,name);
	Sex=sex;
	Birthday=birthday;
	HomeAddress=new char[strlen(homeadd)+1];
	strcpy(HomeAddress,homeadd);
}
Person::Person(){
	IdPerson[0]='\0';Name=NULL;Sex=mid;
	Birthday=0;HomeAddress=NULL;
}
Person::Person(Person &ps){
	strcpy(IdPerson,ps.IdPerson);
	if(ps.Name!=NULL){
		Name=new char[strlen(ps.Name)+1];
		strcpy(Name,ps.Name);
	}
	else Name=NULL;
	Sex=ps.Sex;
	Birthday=ps.Birthday;
	if(ps.HomeAddress!=NULL){
		HomeAddress=new char[strlen(ps.HomeAddress)+1];
		strcpy(HomeAddress,ps.HomeAddress);
	}
	else HomeAddress=NULL;
}
Person::~Person(){
	cout<<"析构Person"<<endl;
	if(Name)delete[]Name;
	if(HomeAddress) delete [] HomeAddress;
}
Person & Person::operator=(Person &ps){
	copy(ps);//基类"="重载函数中加拷贝函数是为了方便派生类重载"="
	return *this;
}
void Person::copy(Person &ps){
	strcpy(IdPerson,ps.IdPerson);
	if(ps.Name!=NULL){
		delete[]Name;//赋值要先清原来分配的空间
		Name=new char[strlen(ps.Name)+1];
		strcpy(Name,ps.Name);
	}
	else Name=NULL;
	Sex=ps.Sex;
	Birthday=ps.Birthday;
	if(ps.HomeAddress!=NULL){
		delete [] HomeAddress;//赋值要先清原来分配的空间,再重新分配
		HomeAddress=new char[strlen(ps.HomeAddress)+1];
		strcpy(HomeAddress,ps.HomeAddress);
	}
	else {
		delete [] HomeAddress;
		HomeAddress=NULL;
	}
}
void Person::PrintPersonInfo(){
	int i;
	cout<<"身份证号:"<<IdPerson<<'\n'<<"姓名:"<<Name<<'\n'<<"性别:";
	if(Sex==man)cout<<"男"<<'\n';
	else if(Sex==woman)cout<<"女"<<'\n';
	     else cout<<" "<<'\n';
	cout<<"出生年月日:";
	i=Birthday;
	cout<<i/10000<<"年";
	i=i%10000;
	cout<<i/100<<"月"<<i%100<<"日"<<'\n'<<"家庭住址:"<<HomeAddress<<'\n';
}

class Student:public Person{//定义派生的学生类
	char NoStudent[10];//学号
	course cs[30];//30门课程与成绩
public:
	Student(char*id,char*name,Tsex sex,int birthday,char*homeadd,char*nostud);
	//注意派生类构造函数声明方式
	Student();
	Student(Student &Std);
	~Student();
	Student & operator=(Student &Std);
	SetCourse(char *,int);
	int GetCourse(char *);
	void PrintStudentInfo();
};
Student::Student(char*id,char*name,Tsex sex,int birthday,char*homeadd,char*nostud)
             :Person(id,name,sex,birthday,homeadd){//注意Person参数表不用类型
	strcpy(NoStudent,nostud);
	for(int i=0;i<30;i++){//课程与成绩清空
		cs[i].coursename=NULL;
		cs[i].grade=0;
	}
}
Student::Student(){//基类缺省的无参数构造函数不必显式给出
	NoStudent[10]=NULL;
	for(int i=0;i<30;i++){//课程与成绩清零,将来由键盘输入 
		cs[i].coursename=NULL;
		cs[i].grade=0;
	}
}
Student::Student(Student &Std):Person(Std){//按赋值兼容规则Std可为Person实参
	strcpy(NoStudent,Std.NoStudent);
	for(int i=0;i<30;i++){
		if(Std.cs[i].coursename!=NULL){
			cs[i].coursename=new char[strlen(Std.cs[i].coursename)+1];
			strcpy(cs[i].coursename,Std.cs[i].coursename);
		}
		else cs[i].coursename=NULL;
		cs[i].grade=Std.cs[i].grade;
	}
}
Student::~Student(){//基类析构函数不必显式给出
	cout<<"析构Student"<<endl;
	for(int i=0;i<30;i++)
		if(cs[i].coursename!=NULL) delete[]cs[i].coursename;
}//清除各课程名称不可少,它们放在堆区中
Student & Student::operator=(Student &Std){
	copy(Std);//按赋值兼容规则Std可为copy实参
	strcpy(NoStudent,Std.NoStudent);
	for(int i=0;i<30;i++){
		if(Std.cs[i].coursename!=NULL){
			delete[]cs[i].coursename;//拷贝要先清原来分配空间,再重新分配
			cs[i].coursename=new char[strlen(Std.cs[i].coursename)+1];
			strcpy(cs[i].coursename,Std.cs[i].coursename);
		}
		else cs[i].coursename=NULL;
		cs[i].grade=Std.cs[i].grade;
	}
	return *this;
}
int Student::SetCourse(char *coursename,int grade){
	bool b=false;//标识新输入的课程,还是更新成绩
	for(int i=0;i<30;i++){
		if(cs[i].coursename==NULL){
			//判表是否进入未使用部分(如有对应删除应按顺序表方式)
			cs[i].coursename=new char[strlen(coursename)+1];
			strcpy(cs[i].coursename,coursename);
			cs[i].grade=grade;
			b=false;
			break;
		}
		else if(!strcmp(cs[i].coursename,coursename)){
			//后查是否已有该课程记录。如先查,因strcmp()健壮型不好,遇NULL出错
			cs[i].grade=grade;
			b=true;
			break;
		}
	}
	if(i==30) return 0;//成绩表满返回0
	if(b) return 1;//修改成绩返回1
	else return 2;//登记成绩返回2
}
int Student::GetCourse(char *coursename){
	for(int i=0;i<30;i++)
		if(cs[i].coursename==NULL) break;//无此句,stcpy()会出错
		else if(!strcmp(cs[i].coursename,coursename))return cs[i].grade;
	return -1;
}//找到返回成绩,未找到返回-1
void Student::PrintStudentInfo(){
	int i;
	cout<<"学号:"<<NoStudent<<'\n';
	PrintPersonInfo();
	for(i=0;i<30;i++)//打印各科成绩
		if(cs[i].coursename!=NULL)cout<<cs[i].coursename<<'\t'<<cs[i].grade<<'\n';
		else break;
	cout<<"--------完-------- "<<endl;
}
void main(void){
	char temp[30];
	int i,k;
	Student stu1("320102811226161","朱海鹏",man,19811226,"南京市黄浦路1号","06000123");
	cout<<"请输入各科成绩:"<<'\n';//为简单仅以一个学生为例。完整应输入学号,查找,再操作
	while(1){//输入各科成绩,输入"end"停止
		cin>>temp;//输入格式:物理  80
		if(!strcmp(temp,"end")) break;
		cin>>k;
		i=stu1.SetCourse(temp,k);
		if(i==0)cout<<"成绩列表已满!"<<'\n';
		else if(i==1)cout<<"修改成绩"<<'\n';
		     else cout<<"登记成绩"<<'\n';
    }
	stu1.PrintStudentInfo();
	Student stu3;
	stu3=stu1;//派生类对象深拷贝
	stu3.PrintStudentInfo();
	Person *per4;
	Student	*stu4=new Student;
	*stu4=stu1;
	stu4->PrintStudentInfo();
	per4=stu4;
	delete per4;//动态生成的对象必须显式撤销
	Student stu2=stu1;//派生类对象深拷贝初始化
	stu2.PrintStudentInfo();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -