C++Experience

这篇博客介绍了使用C++进行编程实践,包括定义和实现平面点类Point,增加了获取和设置坐标的方法以及显示信息的函数。接着通过继承Point创建三维空间点类Point3D,扩展了z轴坐标和相关函数。此外,还定义了折线类Curve3D,实现了动态管理空间点、计算折线长度、文件输入输出等功能。

题目2-实验1:定义并实现一个平面点类

1. Point,包含protected类型的数据成员m_xm_y用于保存x轴、y轴两个坐标值,并具有如下数据成员:

2. get_x()get_y()用于获取xy轴的坐标值

3. set_x()set_y()用于获取xy轴的坐标值

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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值