题目2-实验1:定义并实现一个平面点类
1. Point,包含protected类型的数据成员m_x、m_y用于保存x轴、y轴两个坐标值,并具有如下数据成员:
2. get_x()、get_y()用于获取x、y轴的坐标值
3. set_x()、set_y()用于获取x、y轴的坐标值
4. DisplayPoint()函数,用于输出点的全部信息(坐标等)
5. 主程序从键盘输入点的坐标值,程序结束前输出点的信息。
实验2:从平面点类Point采用继承的方式,派生三维空间点类Point3D
1. 增加数据成员m_z(z轴坐标值)
2. 增加成员函数set_z()、get_z()用于设定或获取z轴坐标数值
3. 采用虚函数的方式重载DisplayPoint输出三维空间点的全部信息。
4. 主程序从键盘输入点的三维坐标值,程序结束前输出点的信息。
实验3:定义并实现折线类Curve3D
1. 该类的对象拥有至少1个空间点(Point3D类型的数据,用指针与动态空间申请实现),以及记录点数量的数据成员
2. 编写带默认参数值的构造函数,折线默认的空间点为原点(0,0,0)
3. 编写析构函数;
4. 成员函数DisplayCurve用于输出折线的各个点的信息;
5. 成员函数CurveLen用于计算并输出折线长度;
6. 重载加号运算符+,可以将一个Point3D点增加到折线点序列中(表示将折线延长到改点处);
7. 重载减号运算符-,可以将一个Point3D点从折线点序列中删除(先在点序列中搜索,如果有要删除的点,就删除,如果没有,返回即可);
8. 重载赋值运算符= 解决浅拷贝问题;
9. 成员函数write_txt(ofstream os),实现将折线数据写入文本文件的功能,文本文件每行保存一个点的三个坐标值,有多少个点,就有多少行;
10. 成员函数read_txt(ifstream is),实现从文本文件读入折线数据的功能,文本文件每行保存一个点的三个坐标值,有多少个点,就有多少行;
11. 成员函数read_binary(ifstream is) ,实现将折线数据写入二进制文件的功能;
12. 成员函数read_binary(ifstream is) 实现从二进制文件读入折线数据的功能。
#include <iostream>
#include <cstring>
#include <cstdio>
#include <fstream>
#include <cmath>
#include <stdlib.h>
using namespace std;
//点类
class Point{
public:
Point();
Point(int row,int col);
int get_x() const; //取x,const不改变数值
int get_y() const;
void set_x(int x);
void set_y(int y);
virtual void Display(); //虚函数
protected:
int m_x;
int m_y;
};
Point::Point(){
m_x=0;
m_y=0;
}
Point::Point(int row,int col){
m_x=row;
m_y=col;
}
int Point::get_x() const{
return m_x;
}
int Point::get_y() const{
return m_y;
}
void Point::set_x(int x){
m_x=x;
}
void Point::set_y(int y){
m_y=y;
}
void Point::Display(){
printf("Point Position:(%d , %d)\n",m_x,m_y);
}
//三维点类,继承二维点类
class Point3D:public Point{
public:
Point3D();
Point3D(int row,int col,int height);
int get_z() const;
void set_z(int z);
virtual void Display(); //函数重载
protected:
int m_z;
};
Point3D::Point3D(){
m_z=0;
}
Point3D::Point3D(int x,int y,int z){
m_x=x,m_y=y,m_z=z;
}
int Point3D::get_z() const{
return m_z;
}
void Point3D::set_z(int z){
m_z=z;
}
void Point3D::Display(){
printf("Point Position:(%d, %d, %d)\n",m_x,m_y,m_z);
}
//折线类,继承三维点类
class Curve3D:public Point3D{
public:
Curve3D();
Curve3D(int Num,Point3D Now_Point[]);
~Curve3D(); //析构函数,程序结束释放内存
void get_PointNum(int Num);
double CurveLen();
void DisplayCurve();
const Curve3D& operator=(const Curve3D &t); //运算符重载,等号加好减号
Curve3D operator+(const Point3D &t) const;
Curve3D operator-(const Point3D &t) const;
void write_txt(); //文件函数,写入、读出文件
Curve3D read_txt();
int write_binary(); //二进制文件函数,写入、读出二进制文件
Curve3D read_binary();
private:
int PointNum;
Point3D *Cur_Point; //动态内存分配,指针
};
//初始化
Curve3D::Curve3D(){
PointNum=1;
Point3D Center(0,0,0);
Cur_Point=new Point3D[PointNum];
Cur_Point[0]=Center;
}
Curve3D::Curve3D(int Num,Point3D Now_Point[]){
PointNum=Num;
Cur_Point=new Point3D[PointNum];
for(int i=0;i<PointNum;i++){
Cur_Point[i]=Now_Point[i];
}
}
//释放
Curve3D::~Curve3D(){
delete []Cur_Point;
}
//给点数赋值
void Curve3D::get_PointNum(int Num){
PointNum=Num;
}
//计算折线长度
double Curve3D::CurveLen(){
double ans=0;
for(int i=0;i<PointNum-1;i++){
double x1=(double)Cur_Point[i].get_x();
double y1=(double)Cur_Point[i].get_y();
double z1=(double)Cur_Point[i].get_z();
double x2=(double)Cur_Point[i+1].get_x();
double y2=(double)Cur_Point[i+1].get_y();
double z2=(double)Cur_Point[i+1].get_z();
ans+=sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1)+(z2-z1)*(z2-z1));
}
return ans;
}
//重载赋值符号
const Curve3D& Curve3D::operator=(const Curve3D &t){
if(this!=&t){
PointNum=t.PointNum;
delete[] Cur_Point;
Cur_Point=new Point3D[PointNum];
for(int i=0;i<PointNum;i++)
Cur_Point[i]=t.Cur_Point[i];
}
return *this;
}
//重载加号
Curve3D Curve3D::operator+(const Point3D &t) const{
Curve3D temp;
temp.PointNum=PointNum+1;
delete [] temp.Cur_Point;
temp.Cur_Point=new Point3D[temp.PointNum];
for(int i=0;i<temp.PointNum-1;i++)
temp.Cur_Point[i]=Cur_Point[i];
temp.Cur_Point[temp.PointNum-1]=t;
return temp;
}
//重载减号
Curve3D Curve3D::operator-(const Point3D &t) const{
Curve3D temp;
temp.PointNum=0;
int x=t.get_x();
int y=t.get_y();
int z=t.get_z();
delete [] temp.Cur_Point;
temp.Cur_Point=new Point3D[PointNum];
for(int i=0;i<PointNum;i++){
if((Cur_Point[i].get_x()==x) && (Cur_Point[i].get_y()==y) && (Cur_Point[i].get_z()==z)){
cout<<"Delete Completely"<<endl;
continue;
}
else{
temp.Cur_Point[temp.PointNum]=Cur_Point[i];
temp.PointNum++;
}
}
return temp;
}
//输出折线信息
void Curve3D::DisplayCurve(){
int x,y,z;
for(int i=0;i<PointNum;i++){
x=Cur_Point[i].get_x();
y=Cur_Point[i].get_y();
z=Cur_Point[i].get_z();
printf("Point Position:(%d, %d, %d)\n",x,y,z);
}
}
//折线信息写入txt文件
void Curve3D::write_txt(){
ofstream os;
os.open("file.txt");
os<<PointNum<<endl;
for(int i=0;i<PointNum;i++){
int x=Cur_Point[i].get_x();
int y=Cur_Point[i].get_y();
int z=Cur_Point[i].get_z();
os<<x<<' '<<y<<' '<<z<<endl;
}
os.close();
}
//从txt文件读出折线信息
Curve3D Curve3D::read_txt(){
ifstream is("file.txt");
int Num;
is >> Num;
Point3D *pe;
pe = new Point3D[Num];
int x,y,z;
for(int i=0;i<Num;i++){
is >> x >> y >> z;
pe[i].set_x(x);
pe[i].set_y(y);
pe[i].set_z(z);
}
is.close();
Curve3D Curve(Num,pe);
return Curve;
}
//折线信息写入二进制文件
int Curve3D::write_binary(){
ofstream BinOut_file("BinIn.dat",ios::binary);
if(BinOut_file.fail()){
cerr<<"Open failure on BinOut.dat"<<endl;
return 1;
}
int object_size=sizeof(Point3D);
for(int i=0;i<PointNum;i++){
BinOut_file.write(reinterpret_cast<char *>(&Cur_Point[i]),object_size);
}
BinOut_file.close();
return 0;
}
//二进制文件读出折线信息
Curve3D Curve3D::read_binary(){
ifstream BinIn_file("BinIn.dat",ios::binary);
if(BinIn_file.fail()){
cerr<<"Open failure on BinIn__file"<<endl;
exit(0);
}
int object_size=sizeof(Point3D);
Point3D Point[1000];
int Num=0;
while(BinIn_file.read(reinterpret_cast<char *>(&Point[Num]),object_size)){
int x=Point[Num].get_x();
int y=Point[Num].get_y();
int z=Point[Num].get_z();
cout<<x<<" " <<y<< " "<<z<<endl;
Num++;
}
Curve3D Curve(Num,Point);
BinIn_file.close();
return Curve;
}
void menu(){
cout<<"Which Function You Want:"<<endl;
cout<<"1/Add Point to Curve3D."<<endl;
cout<<"2/Sub Point From Curve3D If The Point It Has."<<endl;
cout<<"3/Display CurvePoint Information."<<endl;
cout<<"4/Cal CurveLen"<<endl;
cout<<"5/Write To TXT File."<<endl;
cout<<"6/Read From TXT File."<<endl;
cout<<"7/Write To Binary File."<<endl;
cout<<"8/Read From Binary File."<<endl;
cout<<"9/Exit."<<endl;
return;
}
int main(){
menu();
int choice;
Curve3D Curve,Co;
cout<<"Input Your Choice,Please: "<<endl;
while(scanf("%d",&choice) && choice!=9){
//加入点,默认初始点是(0 0 0)
if(choice==1){
int x,y,z;
cout<<"Input Point Position Information like 'x y z',Please"<<endl;
cin>>x>>y>>z;
Point3D Point(x,y,z);
Co=Curve+Point;
Curve=Co;
}
//删除点
else if(choice==2){
int x,y,z;
cout<<"Input Point Position Information like 'x y z',Please"<<endl;
cin>>x>>y>>z;
Point3D Point(x,y,z);
Co=Curve-Point;
Curve=Co;
}
//输出点
else if(choice==3)
Curve.DisplayCurve();
//计算长度
else if(choice==4){
double ans=Curve.CurveLen();
cout<<"Total CurveLen is: " <<ans<<endl;
}
//写入txt文件
else if(choice==5)
Curve.write_txt();
//读出txt文件
else if(choice==6)
Curve=Curve.read_txt();
//写入二进制文件
else if(choice==7)
Curve.write_binary();
//读出二进制文件
else if(choice==8)
Curve=Curve.read_binary();
else if(choice==9)
return 0;
cout<<"Input Your Choice,Please: "<<endl;
}
return 0;
}