某农业大学第六次实验(静态、友元、继承与派生)

1.Document类(公有继承)

【问题描述】

定义一个Document类,有数据成员name, 从Document类派生出Book类,增加数据成员pageCount。

主函数已经提供如下,请勿修改:

int main() {

Document a("Document1");

Book b("Book1", 100);

a.PrintNameOf();

b.PrintNameOf();

}

【样例输入】


【样例输出】

Document1

Name of book: Book1

【样例说明】输出第一行为Document类对象a的名称;第二行为Book类对象b的名称。输出语句均在PrintNameOf()函数中完成。

#include<bits/stdc++.h>
using namespace std; 

class Document
{
public:
	string name;
	Document(string s)
	{
		name=s;
	}
	void PrintNameOf()
	{
		cout << name<<endl;
	}
}; 

class Book:public Document
{
public:
	int page;
	Book(string na,int n):Document(na)
	{
		page=n;
	}
	void PrintNameOf()
	{
		cout << "Name of book: "<<name<<endl;
	}
};

int main() 
{
	Document a("Document1");
	Book b("Book1", 100);
	a.PrintNameOf();
	b.PrintNameOf();
}
2.学生类(静态数据成员和静态成员函数,即数据的共享)

【问题描述】

定义一个类Student,要求使用静态数据成员或静态成员函数计算全班学生的《计算机导论》课程的总成绩和平均成绩。请同学们自行设计该类。

【提示】

静态数据成员:static int total;  表示所有同学成绩总分

静态成员函数:static void Average(int sum){}  计算sum个学生的平均成绩,主函数在调用的时候采用Student::Average(n)的形式。

【输入形式】

学生姓名 课程成绩

【输出形式】

总成绩和平均成绩 

【样例输入】

Zhang 82

Li 79

Wang 93

Liu 66

Xia 90

【样例输出】

410

82

#include<bits/stdc++.h>
using namespace std;

class Student
{
public:
	static int total;//static变量需要初始化
	static void Average(int sum);
	void Add(int score)
	{
		total+=score;
	}
};
int Student::total=0; 
void Student::Average(int sum)
{
	int t=(double)total/sum;
	cout << total<<endl<<t<<endl;
}
 
int main()
{
	int num=5;
	Student s;
	int sco;
	string name;
	
	for(int i=0;i<num;i++)
	{
		cin>>name;
		cin>>sco;
		s.Add(sco);
	}
	s.Average(num);
	return 0;
}
3.复数类Imaginary的设计

【问题描述】

根据以下主函数的功能来设计复数类Imaginary,使其能正确运行。类Imaginary中应该具有描述复数的实部和虚部的私有数据成员a和b,还有相应的构造函数和按照“a±bi”格式显示复数的成员函数print()。设计类Imaginary的2个友元函数分别进行复数的加、减运算,并在这些函数调用类Imaginary的成员函数print()显示结果。

int main()

{

    float x1,y1,x2,y2;

    cin>>x1>>y1>>x2>>y2;    //输入4个数据,分别表示进行运算的两个复数的实部和虚部

    Imaginary imag1(x1,y1),imag2(x2,y2);    //用x1、y1创建Imaginary类对象imag1

    Add(imag1,imag2);   //调用友元函数求两个复数之和,按a±bi的格式显示运算结果(a和b均为实数)

    Sub(imag1,imag2);   //求两个复数之差并显示运算结果

    return 0;

}

【输入形式】

输入4个数据,分别表示进行运算的两个复数的实部和虚部

【输出形式】

2行,分别显示两个复数进行加、减运算的结果

【样例输入】

1 3 2 5

【样例输出】

3+8i

-1-2i

#include<bits/stdc++.h>
using namespace std;

class Imaginary
{
public:
	float a,b;
	Imaginary(float A,float B)
	{
		a=A;
		b=B;
	}
	void print()
    {
        cout<<a<<b<<"i"<<endl;
    }
	void Add(Imaginary e1,Imaginary e2);
	void Sub(Imaginary e1,Imaginary e2);
};

void Add(Imaginary e1,Imaginary e2)
{
	float c;
    c=e1.b+e2.b;
    if(c>0)
    {
    	cout<<e1.a+e2.a<<"+"<<c<<"i"<<endl;
	}
    else if(c<0)
    {
    	cout<<e1.a+e2.a<<c<<endl;
	} 
    else
    {
    	cout<<e1.a+e2.a<<endl;
	}
}

void Sub(Imaginary e1,Imaginary e2)
{
	float c;
    c=e1.b-e2.b;
    if(c>0)
    {
    	cout<<e1.a-e2.a<<"+"<<c<<"i"<<endl;
	}
    else if(c<0)
    {
    	cout<<e1.a-e2.a<<c<<"i"<<endl;
	}
    else
    {
    	cout<<e1.a-e2.a<<endl;
	}
}

int main()
{
    float x1,y1,x2,y2;
    //输入4个数据,分别表示进行运算的两个复数的实部和虚部
    cin>>x1>>y1>>x2>>y2;    
	//用x1、y1创建Imaginary类对象imag1
    Imaginary imag1(x1,y1),imag2(x2,y2);    
	//调用友元函数求两个复数之和,按a±bi的格式显示运算结果(a和b均为实数)
    Add(imag1,imag2);   
	//求两个复数之差并显示运算结果
    Sub(imag1,imag2);   
    return 0;
}
4.图形类(继承与派生、纯虚函数、动态联编的多态性)

【问题描述】 

(1)首先设计一个抽象类Shape,包含三个公有的纯虚函数,分别实现显示数据成员的值、计算面积、计算体积的功能,函数名为ShowData()、GoArea()、GoVolume()

(2)设计两个Shape的公有派生类平面图形类、立体图形类,包含公有的数据成员面积area和体积volume,并实现基类Shape的三个纯虚函数的函数体。

(3)分别设计圆形类、椭圆类、矩形类、等腰三角形类,作为平面图形类的公有派生类。并在各个类里依次添加数据成员圆形半径、椭圆的横轴和纵轴长度、矩形的长和宽、等腰三角形的底边长和高。并实现数据的显示输出函数、实现计算面积的函数。

(4)分别设计球类、圆柱体类、长方体类,作为立体图形类的公有派生类。并在各个类里依次添加数据成员球的半径,圆柱体的底面的半径和高,长方体的长宽高。并实现数据的显示输出函数、实现计算体积的函数。

(5)计算面积的函数和计算体积的函数均需要先cin相应的数据,再才能计算,计算结果为double型,且保留2位小数,将计算结果给相应的数据成员进行赋值。函数无返回值。

(6)测试数据时,定义各种类型的对象,然后定义Shape类型的指针p,用户依次输入1、2、3......6、7,分别代表圆形、椭圆、矩形、三角形、球、圆柱体、长方体。通过使用switch语句,将对象地址赋值给p指针。然后调用该对象的计算面积或计算体积的函数,输出计算结果。为方便测试,switch仅执行一次,程序则结束。

举例:

Shape *p;  

Circle c;  

p=&c;

p->GoArea();

p->ShowData();

【样例输入】

5

2

【样例输出】

33.51

【样例说明】5代表球,2代表球的半径,根据体积公式4/3*pi*r*r*r得到33.51

#include<bits/stdc++.h>
using namespace std;
#define PI 3.14159265

class Shape
{
public:
	virtual void ShowData()=0;
	virtual void GoArea()=0;
	virtual void GoVolume()=0;
}; 

class Plane_Figure:virtual public Shape
{
public:
	double area,volume;
	void ShowData()
	{
		printf("%.2f\n",area);
	}
	void GoArea()
	{
		area=0;
	}
	void GoVolume()
	{
		volume=0;
	}
};

class Solid_Figure:virtual public Shape
{
public:
	double area,volume;
	void ShowData()
	{
		printf("%.2f\n",volume);
	}
	void GoArea()
	{
		area=0;
	}
	void GoVolume()
	{
		volume=0;
	}
};

class Circle:public Plane_Figure//圆形类
{
private:
	int r;
public:
	void ShowData()
	{
		printf("%.2f\n",area);
	}
	void GoArea()
	{
		cin>>r;
		area=PI*r*r;
	}
};

class Ellipse:public Plane_Figure//椭圆类
{
private:
	int a,b;
public:
	void ShowData()
	{
		printf("%.2f\n",area);
	}
	void GoArea()
	{
		cin>>a>>b;
		area=a*b*PI;
	}
};

class Rectangle:public Plane_Figure//矩形类
{
private:
	int l,w;
public:
	void ShowData()
	{
		printf("%.2f\n",area);
	}
	void GoArea()
	{
		cin>>l>>w;
		area=l*w;
	}
};

class Tag:public Plane_Figure//等腰三角形
{
private:
	int a,b;
public:
	void ShowData()
	{
		printf("%.2f\n",area);
	}
	void GoArea()
	{
		cin>>a>>b;
		area=(a*b)/2;
	}
};

class Ball:public Solid_Figure//球类
{
private:
	int r;
public:
	void ShowData()
	{
		printf("%.2f\n",volume);
	}
	void GoVolume()
	{
		cin>>r;
		volume=(4*PI*r*r*r)/3;
	}
};

class Column:public Solid_Figure//圆柱体类
{
private:
	int a,b;
public:
	void ShowData()
	{
		printf("%.2f\n",volume);
	}
	void GoVolume()
	{
		cin>>a>>b;
		volume=PI*a*a+2*PI*a*b;
	}
};

class Cuboid:public Solid_Figure//长方体类
{
private:
	int c,k,g;
public:
	void ShowData()
	{
		printf("%.2f\n",volume);
	}
	void GoVolume()
	{
		cin>>c>>k>>g;
		volume=c*k*g;
	}
};

int main()
{
	Shape *sh;
	Circle ci;
	Ellipse el;
	Rectangle re;
	Tag ta;
	Ball ba;
	Column co;
	Cuboid cu;
	
	int n;
	cin>>n;
	switch(n)
	{
		case 1:
			sh=&ci;
			sh->GoArea();
			sh->ShowData();
			break;
		case 2:
			sh=&el;
			sh->GoArea();
			sh->ShowData();
			break;
		case 3:
			sh=&re;
			sh->GoArea();
			sh->ShowData();
			break;
		case 4:
			sh=&ta;
			sh->GoArea();
			sh->ShowData();
			break;
		case 5:
			sh=&ba;
			sh->GoVolume();
			sh->ShowData();
			break;
		case 6:
			sh=&co;
			sh->GoVolume();
			sh->ShowData();
			break;
		case 7:
			sh=&cu;
			sh->GoVolume();
			sh->ShowData();
			break;
		default:
			break;
	}
	return 0;
}
5.Person类、学生类、教师类和研究生类(多重继承)

【问题描述】研究生Graduate既有学生Student的属性,又有教师Teacher的属性,通过多重继承说明一个研究生类Graduate。

从前面实验题目完成的Person类派生出Teacher类,新增专业(dept)和月薪(salary)属性,并定义Teacher类的构造函数初始化新增的数据成员,showMe成员函数显示新增的数据成员的值。

再从Person类派生出Student类,新增班级(class)和学号(ID)属性,定义Student类的构造函数初始化新增的数据成员,showMe成员函数显示新增的数据成员的值。

通过“多重继承”说明一个研究生类Graduate,定义Graduate类的构造函数,定义Graduate类的showMe成员函数显示各个数据成员的值。

主函数设计如下,请勿修改:

int main(){

  Graduate stu1("Lisi",22,'m',"College of Informatics",2000,"2015013","S101");

  stu1.showMe();

  return 0;

}

提示:(1)Graduate的父类是Student和Teacher,而Student和Teacher有共同的父类Person,如果是普通继承则姓名、性别和年龄就发生了重复。因此,这一题需要用到虚基类的概念。

(2)注意showMe()成员函数在每个类里都有。

【样例输出】

class: S101
id: 2015013
name: Lisi
sex: m
age: 22
dept: College of Informatics
salary: 2000

#include<bits/stdc++.h>
using namespace std;

class Person
{
protected:
	char name[10];
	int age;
	char sex;
public:
	Person()
	{
		
	}
	Person(char *s,int n,char c)
	{
		strcpy(name,s);
		age=n;
		sex=c;
	}
	void ShowMe()
	{
		cout <<"name: "<<name<<endl;
		cout << "sex: "<<sex<<endl;
		cout << "age: "<<age<<endl;
	}
};

class Teacher:virtual public Person
{
protected:
	char dept[30];
	double salary;
public:
	Teacher(char *a,double b)
	{
		strcpy(dept,a);
		salary=b;
	}
	void ShowMe()
	{
		cout << "dept: "<<dept<<endl;
		cout << "salary: "<<salary<<endl;
	}
};

class Student:virtual public Person
{
protected:
	char id[10],clas[10];
public:
	Student(char *a,char *b)
	{
		strcpy(id,a);
		strcpy(clas,b);
	}
	void ShowMe()
	{
		cout << "class: "<<clas<<endl;
		cout<<"id: "<<id<<endl;
	}
};

class Graduate:public Teacher,public Student
{
public:
	Graduate(char *na,int ag,char se,char *de,int salary,char *i,char *c):Person(na,ag,se),Teacher(de,salary),Student(i,c)
    {

    }
    void showMe()
    {
    	Student::ShowMe();
    	Person::ShowMe();
    	Teacher::ShowMe();
	}
};

int main()
{
  Graduate stu1("Lisi",22,'m',"College of Informatics",2000,"2015013","S101");
  stu1.showMe();
  return 0;
}
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值