1. 程式人生 > >C++第11周mooc線上測評—第11周 類的繼承

C++第11周mooc線上測評—第11周 類的繼承

//1公有繼承中派生類Student對基類Person成員的訪問(20分)
//題目內容:
//已知基類Person的定義如下:
//class Person
//{
//	char Name[20];
//	char Sex;
//	int
//		Age;
//public:
//	void Register(char *name, int age, char sex);
//	void
//		ShowMe();
//};
//請通過繼承的方法建立一個派生類Student,其中
//1.新增的資料成員有:
//int
//Number;
//char ClassName[10];
//2.新增的成員函式有:
//void RegisterStu(char
//*classname, int number, char *name, int age, char sex)
//
////對資料成員賦值,並使用基類的Register
//void
//ShowStu() //顯示資料成員資訊,並使用基類的ShowMe
//在主程式中建立一個派生類物件,利用已有的成員函式分別顯示派生類物件和基類物件的資料成員。
//
//輸入格式 :
//學生的班級、學號、姓名、年齡和性別
//
//輸出格式:
//先輸出派生類物件的資料成員,依次為 學號、班級、姓名、年齡和性別
//再輸出基類的資料成員,依次為姓名、年齡和性別
//
//輸入樣例:
//計算機51 85071011 張弓長 18 m
//
//輸出樣例:
//85071011 計算機51 張弓長 18 m
//張弓長 18 m
#include <iostream>
#include <string.h>
using namespace std;
class Person
{
private:
	char Name[20];
	char Sex;
	int  Age;
public:
	void Register(char *name, int age, char sex)
	{
		strcpy(this->Name, name);
		this->Sex = sex;
		this->Age = age;
	}
	void ShowMe()
	{
		cout << Name << " " << Age << " " << Sex<<endl;
	}
};

class Student:public Person
{
private:
	int Number;
	char ClassName[10];
public:
	void RegisterStu(char*classname, int number, char *name, int age, char sex)
	{
		Person::Register(name, age, sex);
		strcpy(this->ClassName, classname);
		this->Number = number;
	}
	void ShowStu()
	{
		cout << Number << " " << ClassName << " " ;
		Person::ShowMe();
	}
};


int main()
{
	char Name[20];
	char Sex;
	int  Age;
	int Number;
	char ClassName[10];
	Student stu1;
	cin >> ClassName >> Number >> Name >> Age >> Sex;
	stu1.RegisterStu(ClassName, Number, Name, Age, Sex);
	stu1.ShowStu();
	stu1.Person::ShowMe();
	system("pause");
	return 0;
}

//2一個基類Person的多個派生類(20分)
//題目內容:
//已知基類Person的定義如下:
//class Person
//{
//protected:
//	char Name[10];
//	char
//		Sex;
//	int Age;
//public:
//	void Register(char *name, int age, char
//		sex);
//	void
//		ShowMe();
//};
//請通過繼承的方法建立兩個派生類,其中
//派生類Teacher:
//1.新增的資料成員有:
//char
//Dept[20];
//int
//Salary;
//2.新增的成員函式有:
//建構函式,並使用基類的Register
//3.重寫的成員函式有:
//void
//ShowMe() //顯示資料成員資訊,並使用基類的ShowMe
//派生類Student:
//1.新增的資料成員有:
//char
//ID[12];
//char Class[12];
//2.新增的成員函式有:
//Student(char *name, int age, char
//sex, char *id, char *classid);
//3.重寫的成員函式有:
//void
//ShowMe() //顯示資料成員資訊,並使用基類的ShowMe
//在主程式中分別建立兩個派生類物件,利用已有的成員函式分別顯示兩個派生類物件的資料成員。
//
//輸入格式 :
//教師物件的初始化引數
//學生物件的初始化引數
//
//輸出格式:
//請參考輸出樣例嚴格按照格式輸出教師物件和學生物件的詳細資訊
//
//輸入樣例:
//章立早 38 m 電信學院 2300
//李木子 22 f 02035003 能動01
//
//輸出樣例:
//姓名 章立早
//性別 男
//年齡 38
//工作單位 電信學院
//月薪 2300
//學號 02035003
//姓名 李木子
//性別 女
//年齡 22
//班級 能動01

#include <iostream>
#include <string.h>
using namespace std;
class Person
{
protected:
	char Name[10];
	char Sex;
	int  Age;
public:
	void Register(char *name, int age, char sex)
	{
		strcpy(Name, name);
		Age = age;
		Sex = sex;
	}
	void ShowMe()
	{
		cout << "姓名" << " ";
		cout << Name << endl;
		cout << "性別" << " ";
		if (Sex == 'm')
		{
			cout << "男" << endl;
		}
		else
		{
			cout << "女" << endl;
		}
		cout << "年齡" << " ";
		cout << Age << endl;
	}
};
class Teacher :protected Person
{
private:
	char Dept[20];
	int Salary;
public:
	Teacher(char *name, int age, char sex, char Dept[], int Salary)
	{
		Person::Register(name, age, sex);
		strcpy(this->Dept, Dept);
		this->Salary = Salary;
	}
	void ShowMe()
	{
		Person::ShowMe();
		cout << "工作單位" << " ";
		cout << Dept << endl;
		cout << "月薪" << " ";
		cout << Salary << endl;
	}
};
class Student :protected Person
{
private:
	char ID[12];
	char Class[12];
public:
	Student(char *name, int age, char sex, char *id, char *classid)
	{
		Person::Register(name, age, sex);
		strcpy(this->ID, id);
		strcpy(this->Class, classid);
	}
	void ShowMe()
	{
		cout << "學號" << " ";
		cout << ID << endl;
		Person::ShowMe();
		cout << "班級" << " ";
		cout << Class << endl;
	}
};

int main()

{
	char Name1[10];
	char Name2[10];
	char Sex1;
	char Sex2;
	int  Age1;
	int  Age2;
	char Dept[20];
	int Salary;
	char ID[12];
	char Class[12];

	cin >> Name1 >> Age1 >> Sex1>> Dept >> Salary;
	cin >> Name2 >> Age2 >> Sex2 >> ID >> Class;
	Teacher teacher1(Name1, Age1, Sex1, Dept, Salary);
	teacher1.ShowMe();
	
	Student student1(Name2, Age2, Sex2, ID, Class);
	student1.ShowMe();
	system("pause");
	return 0;
}
//3派生類Student的建構函式和解構函式(20分)
//題目內容:
//已知基類Person的定義如下:
//class Person
//{
//	char Name[10]; //姓名
//	int Age; //年齡
//public:
//	Person(char* name, int age)
//	{
//		strcpy(Name, name);
//		Age = age;
//		cout << "constructor of person " << Name << endl;
//	}
//	~Person()
//	{
//		cout << "deconstructor of person " << Name << endl;
//	};
//	請通過繼承的方法建立一個派生類Student,其中
//		1.新增的資料成員有:
//		char ClassName[10]; //班級
//	Person Monitor; //班長
//	2.新增的成員函式有:
//		Student(char *name, int age, char *classname, char *name1, int age1) //name1和age1是班長的資訊
//		~Student()
//		在主程式中建立一個派生類物件。
//
//	輸入格式 :
//	Student類的初始化資訊
//
//		輸出格式:
//		派生類和基類建構函式和解構函式輸出的資訊,請參考輸出樣例的格式。
//
//		輸入樣例:
//		張弓長 18 計算機51 李木子 20
//
//		輸出樣例:
//		constructor of person 張弓長
//		constructor of person 李木子
//		constructor of Student
//		deconstructor of Student
//		deconstructor of person 李木子
//		deconstructor of person 張弓長
//		注意:person為小寫,單詞間有一個空格。

#include <iostream>
#include <string.h>
using namespace std;
class Person
{
private:
	char Name[10]; //姓名
	int Age; //年齡
public:
	Person(char* name, int age)
	{
		strcpy(Name, name);
		Age = age;
		cout << "constructor of person " << Name << endl;
	}
	~Person()
	{
		cout << "deconstructor of person " << Name << endl;
	};
};


class Student :public Person
{
private:
	char ClassName[10];
	Person Monitor;
public:
	Student(char *name, int age, char *classname, char *name1, int age1)
		:Person(name, age), Monitor(name1, age1)
	{
		strcpy(ClassName, classname);
		cout << "constructor of Student" << endl;
	}
	~Student()
	{
		cout << "deconstructor of Student" << endl;
	};
};


int main()

{
	char name[10];
	int age;
	char classname[10];
	char name1[10];
	int age1;
	cin >> name >> age >> classname >> name1 >> age1;
	Student student1(name, age, classname, name1, age1);
	student1.~Student();
	system("pause");
	return 0;
}

//4從Point類繼承的Circle類(20分)
//題目內容:
//已知基類Point的定義如下:
//
//class Point
//{
//	int x, y; //點的x和y座標 
//public: Point(int = 0, int = 0); // 建構函式 
//		void SetPoint(int, int); // 設定座標 
//		int GetX() { return x; } // 取x座標 
//		int GetY() { return y; } // 取y座標 
//		void Print(); //輸出點的座標 }; 
//		Point(int a, int b) { SetPoint(a, b); }
//		void SetPoint(int a, int b) { x = a; y = b; }
//		void Print() {
//			cout << "[" << x << "," << y << "]";
//		}
//
//		請通過繼承的方法建立一個派生類Circle,其中
//			1.新增的資料成員有: double radius;
//		2.新增的成員函式有:
//			Circle(int x = 0, int y = 0, double r = 0.0); //對資料成員賦值,並使用SetRadius和基類的Point 
//		void SetRadius(double); //設定半徑 
//		double GetRadius(); //取半徑 
//		double Area(); //計算面積 
//		void Print(); //輸出圓心座標和半徑,並使用基類的Print 
//		在主程式中分別建立基類物件和派生類物件,使用使用者輸入的初值分別對基類物件和派生類物件的資料成員賦值後,利用已有的成員函式分別顯示基類物件和派生類物件的資料成員資訊。
//			圓周率取3.14。
//
//		輸入格式 :
//		第一行是Point類的初始化資訊,第二行是Circle類的初始化資訊
//
//			輸出格式:
//			請參考輸出樣例,嚴格按照樣例輸出,建議直接將部分文字複製貼上程序序程式碼中
//
//			輸入樣例:
//			30 50
//			120 80 10
//
//			輸出樣例:
//			Point p[30, 50]
//			Circle c Center = [120, 80]
//			Radius = 10
//			The centre of circle c[120, 80]
//			The area of circle c 314
#include <iostream>
#include <string.h>
using namespace std;
#define PI 3.14
class Point
{
private:

	int x, y; //點的x和y座標 

public:
	int GetX() { return x; } // 取x座標 
	int GetY() { return y; } // 取y座標 
	Point(int a, int b) { SetPoint(a, b); }
	void SetPoint(int a, int b) { x = a; y = b; }
	void Print() {
		cout << "[" << x << "," << y << "]";
	}
};
class Circle:public Point
{
private:
	double radius;
public:
	Circle(int x = 0, int y = 0, double r = 0) :Point(x, y)
	{
		
		SetRadius(r);
	}
	void SetRadius(double r)
	{
		radius = r;
	}

	double GetRadius()
	{
		return radius;
	}

	double Area()
	{
		cout << "The centre of circle c ";
		Point::Print();
		cout << endl;
		cout << "The area of circle c ";
		cout << PI*radius*radius << endl;
		return PI*radius*radius;
	}

	void print()
	{
		cout << "Circle c Center=";
		Point::Print();
		cout << endl;
		cout << "Radius=" << radius << endl;
	}
	~Circle()
	{

	}
};

int main()
{
	int x1, y1;
	int x2, y2;
	double r;
	cin >> x1 >> y1;
	cin >> x2>>y2>>r;
	Point p(x1,y1);
	Circle c(x2, y2, r);
	cout << "Point p ";
	p.Print();
	cout << endl;
	c.print();
	c.Area();
	system("pause");
	return 0;
}

 
//5從Student類和Teacher類多重派生Graduate類(20分)
//題目內容:
//已知基類Person定義如下:
//class Person
//{
//	char Name[10];
//	char Sex[10];
//	int Age;
//public:
//	void Register(char *name, int age, char *sex);
//	void ShowMe();
//};
//請通過繼承的方法建立兩個派生類,其中
//派生類Teacher:
//1.新增的資料成員有:
//char Dept[20];
//int Salary;
//2.新增的成員函式有:
//Teacher(char *name, int age, char *sex, char *dept, int salary);
//void Show() //顯示新增資料成員
//派生類Student:
//1.新增的資料成員有:
//char ID[12];
//char Class[12];
//2.新增的成員函式有:
//Student(char *name, int age, char *sex, char *ID, char *Class);
//void Show()//顯示新增資料成員
//請通過繼承的方法從Teacher和Student中建立派生類Graduate,其中
//1.新增的成員函式有:
//Graduate(char *name, int age, char *sex, char *dept, int salary, char *id, char *classid);
//2.重寫的成員函式有:
//void ShowMe()//顯示資料成員,要求呼叫基類的Show和ShowMe
//在主程式中建立一個派生類Graduate的物件,利用成員函式顯示物件的資料成員。
//
//
//輸入格式 :
//Graduate物件的初始化資訊
//
//輸出格式:
//按照輸出樣例格式輸出Graduate物件的資訊
//
//輸入樣例:
//李木子 22 f 電信學院 2300 04035003 碩401
//
//輸出樣例:
//班級 碩401
//學號 04035003
//姓名 李木子
//性別 女
//年齡 22
//工作單位 電信學院
//月薪 2300

#include <iostream>
#include <string.h>
using namespace std;

class Person
{
private:
	char Name[10];
	char Sex[10];
	int Age;
public:
	void Register(char *name, int age, char *sex)
	{
		strcpy(Name, name);
		strcpy(Sex, sex);
		Age = age;
	}
	void ShowMe()
	{
		cout << "姓名 " << Name << endl;
		cout << "性別 ";
		if (Sex[0] == 'm')
		{
			cout << "男" << endl;
		}
		else
		{
			cout << "女" << endl;
		}
		cout << "年齡 " << Age << endl;
	}
};

class Teacher :public Person
{
private:
	char Dept[20];
	int Salary;
public:
	Teacher(char *name, int age, char *sex, char *dept, int salary)
	{
		Register(name, age, sex);
		strcpy(Dept, dept);
		Salary = salary;
	}
	void Show()
	{
		cout << "工作單位 " << Dept << endl;
		cout << "月薪 " << Salary << endl;
	}
};

class Student :public Person
{
private:
	char ID[12];
	char Class[12];
public:
	Student(char *name, int age, char *sex, char *ID, char *Class)
	{
		Register(name, age, sex);
		strcpy(this->ID, ID);
		strcpy(this->Class, Class);
	}
	void Show()
	{
		cout << "班級 " << Class << endl;
		cout << "學號 " << ID << endl;
	}
};

class Graduate :public Teacher, public Student
{
private:

public:
	Graduate(char *name, int age, char *sex, char *dept, int salary, char *id, char *classid) :
		Student(name, age, sex, id, classid), Teacher(name, age, sex, dept, salary)

	{

	}

	void ShowMe()
	{
		Student::Show();
		Student::ShowMe();
		Teacher::Show();
	}
};
int main()
{
	char name[10];
	int age;
	char sex[10];
	char dept[20];
	int salary;
	char id[12];
	char classid[12];

	cin >> name >> age >> sex >> dept >> salary >> id >> classid;
	Graduate gra1(name, age, sex, dept, salary, id, classid);
	gra1.ShowMe();
	system("pause");
	return 0;
}