C++实训(第三章)
1.点类定义平面点类 POINT,点的 x,y坐标是其数据成员,double类型,私有;成员函数有 set()设置点的 x,y坐标,distance()计算和另一个点的距离,show()显示坐标的位置信息。成员函数均为公有。编写主函数,使用 POINT类定义两个点对象,输入并设置两个点的坐标,显示依次两个点的坐标信息,计算并显示两个点的距离。主函数、运行结果、源代码如下:#include<i
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;
}
更多推荐
所有评论(0)