C++实训(第三章)

1.点类

  定义平面点类 POINT,点的 x,y坐标是其数据成员,double类型,私有;成员函数有 set()设置点的 x,y坐标,distance()计算和另一个点的距离,show()显示坐标的位置信息。成员函数均为公有。
编写主函数,使用 POINT类定义两个点对象,输入并设置两个点的坐标,显示依次两个点的坐标信息,计算并显示两个点的距离。
主函数、运行结果、源代码如下:

#include<iostream>
#include<cmath>
using namespace std;
class POINT
{
  private:
           double zb1,zb2;
  public:
           void set(double a,double b)
           {
           	 zb1=a;
			 zb2=b;
           }
		   double distance(POINT b)
		   {
		   	 return sqrt((zb1-b.zb1)*(zb1-b.zb1)+(zb2-b.zb2)*(zb2-b.zb2));
		   }
		   void show()
		   {
		   	cout<<"已设置点坐标为("<<zb1<<","<<zb2<<" )"<<endl;
		   }	
}a,b;
int main()
{
	double x,y;
	cin>>x>>y;
	a.set(x,y);
	cin>>x>>y;
	b.set(x,y);
	a.show();
	cout<<endl;
	b.show();
	cout<<endl;
	cout<<a.distance(b)<<endl;
	return 0;
} 

2.带构造函数的点类

定义平面点类POINT,点的 x,y坐标是其数据成员,double类型,私有;成员函数有默认构造函数,带两参数x,y坐标的构造函数,  distance()计算和另一个点的距离,show()显示坐标的位置信息。成员函数均为公有,默认构造函数将点的坐标设为(0,0)

编写主函数,输入两个点的坐标并由此定义两个点对象,依次两个点的坐标信息,计算并显示两个点的距离。主函数、运行结果、源代码如下:

#include<iostream>
#include<cmath>
using namespace std;
class POINT
{
	private:
		double zb1,zb2;
	public:
		POINT()
		{
			zb1=0;
			zb2=0;
		}
		POINT(double x,double y)
		{
			zb1=x;
			zb2=y;
		}
	    double distance(POINT a)
	    {
	        return sqrt((zb1-a.getx())*(zb1-a.getx())+(zb2-a.gety())*(zb2-a.gety())); 
	    }
	    void show()
	    {
	    	cout<<"你设置的点坐标为("<<zb1<<","<<zb2<<")"<<endl;
	    }
	    double getx()
	    {
	    	return zb1;
	    }
	    double gety()
	    {
	    	return zb2;
	    }
};
int main()
{  
    double x,y;
	cin>>x>>y;
	POINT a(x,y);
	a.show();
	cin>>x>>y;
	POINT b(x,y);
	b.show();
	cout<<a.distance(b);	   
} 

3.带拷贝构造函数和析构函数的矩形类

定义矩形类 RECT,两个对角顶点坐标是其数据成员(mX1,mY1,mX2,mY2),int类型,私有;成员函数有默认构造设置所有数据成员值为 0,四参数构造函数设置两个顶点坐标,拷贝构造函数, set()设置两个顶点坐标, area()计算面积,perimeter()计算周长,showinfo()显示两个顶点信息,show()显示由“*”组成的矩形(宽是矩形的宽度,高是矩形的高度),析构函数。成员函数均为公有,析构函数中显示两个顶点信息和字符串“deconstruct”。编写主函数,使用 RECT类定义一个矩形类对象 a(默认构造),输入并设置矩形的两个顶点,显示矩形的成员信息,计算并显示矩形的周长和面积,显示由“*”组成的矩形;由刚输入的顶点向右平移 2单位构造对象  b,再由对象  b
构造对象 c,显示矩形 c的成员信息,计算并显示矩形  c的周长和面积,显示由“*”组成的矩形c。

提示:矩形图形显示函数如下

void show()

{
  for(int i=0;i<abs(mY2-mY1);++i)
   for(int j=0;j<abs(mX2-mX1);++j)
      cout<<"*";
      cout<<endl;
}

析构函数参考如下:

~Rect()
{
  cout<<"("<<mX1<<","<<mY1<<","<<mX2<<","<<mY2<<")deconstruct"<<endl;
}

主函数和运行结果如下:

#include<iostream>
#include<cmath>
using namespace std;
class RECT
{
	private:
	    int mx1;
	    int my1;
	    int mx2;
	    int my2;
    public:
	 RECT() 
	  {
		mx1=0; 
		my1=0;
		mx2=0;
		my2=0;
	  }
	RECT(int a,int b,int c,int d):mx1(a),my1(b),mx2(c),my2(d){}
	RECT(RECT &r)
	{
		mx1=r.mx1;
		my1=r.my1;
		mx2=r.mx2;
		my2=r.my2;
	}
	void set(int a1,int b1,int c1,int d1)
	{
		mx1=a1;
		my1=b1;
		mx2=c1;
		my2=d1;
	}
	int area()
	{
		int s;
		s=(abs(this->mx2-this->mx1)*abs(this->my2-this->my1));
		return s;
	}
	int perimeter()
	{ 
		int l;
		l=2*(abs(this->mx2-this->mx1)+abs(this->my2-this->my1));
		return l; 
	}
	void showinfo()
	{
		cout<<"("<<this->mx1<<","<<this->my1<<","<<this->mx2<<","<<this->my2<<")"<<endl;
	}
	void show()
	{
		for(int i=0;i<(abs(this->my2-this->my1));i++)
		{
			for(int j=0;j<(abs(this->mx2-this->mx1));j++)
				cout<<"*";
			    cout<<endl;
		}
	}
	~RECT() 
	{
		cout<<"(" <<mx1<<","<<my2<<","<<mx2<<","<<my2<<") deconstruct"<<endl;
	}
};
int main()
{
	RECT a; 
	double x1,x2,y1,y2;
	cin>>x1>>y1>>x2>>y2;
	a.set(x1,y1,x2,y2); 
	a.showinfo();
	cout<<endl; 
	cout<<a.perimeter()<<endl;
	cout<<a.area()<<endl;
	a.show();
	RECT b(x1+2,y1,x2+2,y2); 
	RECT c(b);
	c.showinfo();
	cout<<endl;
	cout<<c.perimeter()<<endl;
	cout<<c.area()<<endl;
	c.show();
	return 0;
}

4.继承点类定义圆类

定义基类——平面点类 POINT,x,y坐标为其私有数据成员,double;成员函数有:默认构造设置坐标为(0,0);两参数构造函数初始化 x、y;set()函数设置x、y坐标;show()显示  x、y坐标。成员函数均为公有。定义派生类——圆类,继承上面的 POINT点类,增加数据成员  radius表
示半径,double,私有。成员函数有:默认构造函数,设置圆心半径均为 0;三参数构造函数初始化圆心和半径;set()设置圆心和半径;show()显示圆心和半径。

编写主程序,(1)使用默认构造函数定义圆类对象a,使用三参数构造函数定义圆类对象b,圆心为(1,2),半径为3;显示对象  a、对象 b的信息;输入圆心半径,设置对象a的圆心半径,再次显示对象  a的信息。
主函数、运行结果、源代码如下:

#include<iostream>
#include<cstring>
using namespace std;
class POINT
{
	protected:
		double x,y;
  	public:
  		POINT()
  		{
  			x=0;
  			y=0;
  		}
  		POINT(double a,double b)
  		{
  			x=a;
  			y=b;
  		}
  		double set(double a,double b)
  		{
  			x=a;
  			y=b;
  		}
  		void show()
  		{
  			cout<<"x="<<x<<" y="<<y;
  		}
  		double getx()
  		{
  			return x;
  		}
  		double gety()
  		{
  			return y;
  		}
};
class CIRCLE:public POINT
{
	private:
		double radius;
	public:
		CIRCLE()
		{
			radius=0;
		}
		CIRCLE(double a,double b,double c):POINT(a,b),radius(c)
		{
		}
		void set(double a,double b,double c)
        {
			x=a;
			y=b;
			radius=c;
        }
		void show()
		{
			POINT::show();
			cout<<" r="<<radius;
		}
};
int main()
{
	CIRCLE a,b(1,2,3);
	double x,y,r;
	a.show(); cout<<endl;
	b.show(); cout<<endl;
	cin>>x>>y>>r;
	a.set(x,y,r);
	a.show(); cout<<endl;
	return 0;
}

5.继承车辆类定义客车类

定义基类——车辆类 VEHICLE,车牌号、车主是私有数据成员,字符数组,大小 20;成员函数有:默认构造函数设置车牌号为“00000”,车主为"unknown";两参数构造函数设置车牌号和车主,车牌号和车主的参数设置为字符指针;set()函数设置车牌号和车主,参数为字符指针;show()显示车牌号和车主。成员函数均为公有。

定义派生类——客车类 BUS,继承上面的 VEHICLE类,增加数据成员座位数 seats,int,私有。成员函数有:默认构造函数,设置车牌号"00000"、车主“unknown”和座位数 0;三参数构造函数初始化车牌号、车主和座位数;set()设置车牌号、车主和座位数,默认座位数 0;show()显示车牌号、车主和座位数。编写主程序,(1)使用默认构造函数定义客车类对象a,使用三参构造函数
定义客车类对象 b,车牌号为“SHAN-1234567”,车主“ZhangSan”,座位数  40;显示对象 a、对象 b的信息;输入车牌号、车主和座位数,设置对象a的成员,再次显示对象 a的信息。

运行结果和源代码如下:

#include<iostream>
#include<cstring>
using namespace std;
class VEHICLE
{
	private:
		char chepai[20];
		char chezhu[20];
	public:
		VEHICLE()
		{
			strcpy(chezhu,"unknown");
			strcpy(chepai,"00000");
		}
		VEHICLE(char *a,char *b)
		{
			strcpy(chezhu,a);
			strcpy(chepai,b);
		}
		void set(char *a,char *b)
		{
			strcpy(chezhu,a);
			strcpy(chepai,b);
		}
		void show()
		{
			cout<<"Number:"<<chepai;
			cout<<"owner:"<<chezhu;
		}
	
};
class BUS:public VEHICLE
{
	private:
		int seats;
	public:
		BUS()
		{
			seats=0;
		}
		BUS(int s)
		{
			seats=s;
		}
		BUS(char *a,char *b,int s):VEHICLE(a,b),seats(s){}
		void set(char *a,char *b,int s)
		{
			VEHICLE::set(a,b);
			seats=s;
		}
		void show()
		{
			VEHICLE::show();
			cout<<"Seats:"<<seats<<endl;
		}
};
int main()
{
	BUS a,b("ZhangSan","SHAN-1234567",40);
	a.show();
	b.show();
	char x[20],y[20];
	int z;
	cin>>x>>y>>z;
	a.set(y,x,z);
	a.show();
	return 0;
}

6.人员类的继承实训

人员类的继承实训;设计基类人员类,数据成员为姓名和身份号,成员函数有输入数据和显示数据;派生学生类,数据成员包括电话号码和C++成绩,成员函数有输入数据和显示数据;设计学生地址类,数据成员包括地址和年龄,成员函数输入数据和显示数据;由学生类和地址类派生学生成绩类,数据成员数学成绩和英语成绩,成员函数输入数据和显示数据;职员类继承人员类,没有任何成员。要求如下:

(1)设计人员类;

(2)设计地址类;

(3)由人员类派生学生类;

(4)由人员类派生职员类;

(5)由学生类和地址类派生出学生成绩表;

(6)编制主程序,验证结果。

分析:首先设计一个人员类 Person,数据成员有姓名  name[80]和身份号id[20]为字符数组,输入数据 input()有 2个参数姓名和身份号,printname()显示姓名,print()显示身份号。

学生地址类Add,数据成员字符数组addr[80]表示地址,整数old表示年龄,输入数据input()设置地址和年龄,函数print()显示地址和年龄。学生类Student继承person类,Student有数据成员tel[16]表示电话号码,整数sc++表示 C++成绩,函数print()显示电话号码和C++成绩,输入数据input()
设置电话号码和 C++成绩,还要调用基类的 input(),printname()调用基类的printname()函数。

Employee类继承Person类,不设计任何成员。

学生成绩类Score是多继承,由  Student类和Add类共同派生,   Score有数据成员数学成绩math和英语成绩english,输入数据input()设置数学成绩和英语成绩,调用2个基类的input()函数,  printname()调用Student基类的printname()函数

运行结果及源代码如下:

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

class People
{
private:
    char name[80];
    char   id[20];       
public:
    People(){}
    People(char *m,char *j)
    {
		strcpy(name,m);
		strcpy(id,j);
    }
    void Input()
    {
		cout<<"请输入姓名:"; 
		cin.getline(name,80);
		cout<<"请输入身份证号:";
		cin>>id;
    }
    void printname()
    {
		cout<<"姓名:"<<name<<endl;
    }
    void print()
    {
		cout<<"身份证号:"<<id<<endl;
    }
};
class Add
{
private:
    char addr[80];
    int       age;
public:
    Add(){}
    Add(char *a, int b )
    {
		strcpy(addr,a);
		age=b;
    }
    void AddInput()
    {
		cout<<"请输入地址:"; 
		scanf("%s",addr);
		cout<<"请输入年龄:";
		cin>>age;
    }
    void print()
    {
		cout<<"地址:"<<addr<<endl;
		cout<<"年龄:"<<age<< endl;
    }
};
class Student:virtual public People
{
	public:
    char tel[16];
    int   cgrade;
public:
    Student(){}
    Student(char *m,char* i,char* t,float cpp):People(m,i)
	{
		strcpy(tel,t);
		cgrade=cpp;
	}
    void StuImput()
    {
		cout<<"输入电话:";
		scanf("%s",tel);
		cout << "输入c++成绩:";
		cin >>cgrade; 
    }
    void print()
    {
		cout<<"电话:"<<tel<<endl;
		cout<<"c++成绩:"<<cgrade<< endl;
    }
};
class Score :virtual public Student,public Add
{
private:
    int math;
    int english;
public:
    Score(){}
    Score(char *m,char* i,char* t,float cpp,char*A_size,int A_age,float maths,float englishs):Student(m,i,t,cpp),Add(A_size,A_age)
    {
        math=maths;
        english=englishs;   
    }
    void Input()
    {
		cout<<"输入数学成绩:";
		cin >>math;
		cout<<"输入英语成绩:";
		cin >>english;
    }
    void print()
    {
		cout<<"数学成绩:"<<math<<endl;
		cout<<"英语成绩:"<<english<<endl;
    }
};
class Employee :virtual public People{};
int main()
{
	
    Score tangyh;
    tangyh.People::Input();
    tangyh.StuImput();
    tangyh.AddInput();
    tangyh.Input();
	cout<<endl<<endl;
    tangyh.People::printname();
    tangyh.Add::print();
    tangyh.Student::print();
    tangyh.print();
    return 0; 
}

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

熔岩超美身材巨兽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值