5-7 点到原点的距离(多态)

给出下面的一个基类框架:

class Point
{
 protected:
int dimension;//点的维数,最多不超过100维
private:
 int point_length[100];//点数组
public:
Point ();//构造函数根据需要重载
float distance( );//计算当前点到原点的距离
void display();//输出点
}

以Point为基类建一个派生类Point_2D,增加以下数据成员:

float x;//2D平面上点的x坐标
float y;//2D平面上点的y坐标

增加以下成员函数:

Point_2D类的无参和参数化构造函数
float distance( );//计算当前点到原点的距离
void display();//输出点

以Point为基类建一个派生类Point_3D,增加以下数据成员:

float x;//3D平面上点的x坐标
float y;//3D平面上点的y坐标
float y;//3D平面上点的z坐标

增加以下成员函数:

Point_3D类的无参和参数化构造函数
float distance( );//计算当前点到原点的距离
void display();//输出点

生成上述类并编写主函数,要求主函数有一个基类Point指针数组pt,数组元素不超过10个

Point *pt [10];

主函数根据输的点信息,相应建一个广义点对象类对象或Point_3D类对象或Point_2D类,并且取址按序赋给基类指针数组元素,最后遍历基类Point指针数组 pt,计算每一个点到原点的距离。

输入格式:

测试输包含一个测试用例,每个测试用例占一行,每一行给出一个点的基本信息,每行的第一个数字为当前点的类型,1为广义点,1后面输入一个数字m表示该点维数,后面跟随m个数字为m个坐标,2为2维点,后面跟随两个数字,分别为x和y,3为3维点,后面跟随三个数字分别为x、y、z。

提示:应用虚函数实现多态

输入样例:

1 5 1 1 1 1 1
2 3 4
3 1 2 2
0

输出样例:

Distance from Point(1,1,1,1,1) to original point is 2.23607
Distance from Point(3,4) to original point is 5
Distance from Point(1,2,2) to original point is 3


  • 时间限制:400ms
  • 内存限制:64MB
  • 代码长度限制:16kB
  • 判题程序:系统默认
  • 作者:余春艳
  • 单位:浙江大学

 

#include<iostream>
#include<cmath>
using namespace std;
//广义点 
class Point
{
protected:
    int dimension;//点的维数,最多不超过100维
private:
    float point_length[100];//点数组
public:
    Point ( ){};//构造函数根据需要重载
    Point (int a , float b[]) : dimension(a){
        //这里实现传指针赋值给数组
        for(int i=0;i<a;i++)
        {
            point_length[i] = b[i];
        }
    };
    virtual float distance( ){
        float ans=0;
        for(int i=0;i<dimension;i++)
        {
            ans += (point_length[i] * point_length[i]);
        }
        return sqrt(ans);
    };
    virtual void display( ){
    //Distance from Point(1,1,1,1,1) to original point is 2.23607
    if(dimension == 1 ){
        cout<<"Distance from Point"<<point_length[0]<<" to original point is " << fabs(point_length[0]) <<endl;
    }
    else{
        cout<<"Distance from Point(";
        for(int i=0;i<dimension-1;i++)
        {
            cout<<point_length[i]<<",";
        }
        cout<<point_length[dimension-1]<<") to original point is "<<distance()<<endl;
        };        
    }

};
//二维点 
class Point_2D : public Point{
protected:
    float x;//2D平面上点的x坐标
    float y;//2D平面上点的y坐标
public:    
    Point_2D( ) { };//无参和参数化构造函数
    Point_2D(float a,float b) : Point( ) , x(a) , y(b){ dimension = 2; };
    float distance( ) { return sqrt(x*x + y*y); };//计算当前点到原点的距离
    void display( ) { 
    //Distance from Point(3,4) to original point is 5
        cout<<"Distance from Point("<<x<<","<<y<<") to original point is "<<distance()<<endl;
    };//输出点
}; 
//以Point为基类建一个派生类Point_3D,增加以下数据成员:
//三维点 

class Point_3D : public Point{
protected:
    float x;//3D平面上点的x坐标
    float y;//3D平面上点的y坐标
    float z;//3D平面上点的z坐标
public:/**/
    Point_3D( ){ };//无参和参数化构造函数
    Point_3D(float a,float b,float c) : Point( ) , x(a) , y(b) , z(c) { dimension = 3; };
    float distance( ) { return sqrt( x*x + y*y + z*z ); };//计算当前点到原点的距离
    void display( ){
    //Distance from Point(1,2,2) to original point is 3
    cout<<"Distance from Point("<<x<<","<<y<<","<<z<<") to original point is "<<distance()<<endl;
    } ;//输出点
};
//****注意!派生类的成员成员函数要有定义,不然编译不过“returned 1” 


int main()
{
    int type,count=0;
    Point *pt [10];
    
    while(cin>>type){
        if(type == 0)break;                                            
        switch(type){
        case 1:{
            int len;
            float hello[100];
            cin>>len;
            for(int i=0;i<len;i++){
                cin>>hello[i];
            } 
            pt[count++] = new Point(len,hello);             
            break;
        }
        case 2:{
            float a,b;
            cin>>a>>b;
            pt[count++] = new Point_2D(a,b);            
            break;
        }
        case 3:{
            float a,b,c;
            cin>>a>>b>>c;
            pt[count++] = new Point_3D(a,b,c);
            break;
        }
        }
    }
    for(int i=0;i<count;i++) 
    {
        pt[i]->display();
    }
    return 0;
}

 

posted @ 2017-06-18 22:42  hello_OK  阅读(1170)  评论(0编辑  收藏  举报