• 【面向对象课】作业Inherit


    7-4 两点间距离计算

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

    class Point_1D{
    protected:
        float x;//1D 点的x坐标
    public:
        Point_1D(float p = 0.0);
        float distance(const Point_1D & p2);
    }
    

    以Point_1D为基类建立一个派生类Point_2D,增加一个保护数据成员:

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

    以Point_2D为直接基类再建立一个派生类Point_3D,增加一个保护数据成员:

        float z;//3D立体空间中点的z坐标
    

    生成上述类并编写主函数,根据输入的点的基本信息,建立点对象,并能计算该点到原点的距离。

    输入格式: 测试输入包含若干测试用例,每个测试用例占一行(点的类型(1表示1D点,2表示2D点,3表示3D点) 第一个点坐标信息(与点的类型相关) 第二个点坐标信息(与点的类型相关))。当读入0时输入结束,相应的结果不要输出。

    输入样例:

    1 -1 0
    2 3 4 0 0
    3 1 2 2 0 0 0
    0
    

    输出样例:

    Distance from Point -1 to Point 0 is 1
    Distance from Point(3,4) to Point(0,0) is 5
    Distance from Point(3,3,3) to Point(0,0,0) is 3
    

    代码:

    #include<bits/stdc++.h>
    using namespace std;
    #define fastio ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0)
    #define endl '\n'
    class Point_1D{
    protected:
    	float x;
    public:
    	Point_1D(float p=0.0):x(p){};
    	float distance(){return abs(x);}
    	Point_1D operator-(const Point_1D &rhs){
    		return Point_1D(x-rhs.x);
    	}
    	friend istream& operator>>(istream& in,Point_1D &t){
    		in>>t.x;
    		return in;
    	}
    	friend ostream& operator<<(ostream& out,const Point_1D&t){
    		out<<' '<<t.x;
    		return out;
    	}
    };
    class Point_2D:public Point_1D{
    protected:
    	float y;
    public:
    	Point_2D(float p=0,float q=0):Point_1D(p),y(q){}
    	float distance(){return sqrt(x*x+y*y);}
    	Point_2D operator-(const Point_2D &rhs){
    		return Point_2D(x-rhs.x,y-rhs.y);
    	}
    	friend istream& operator>>(istream& in,Point_2D &t){
    		in>>t.x>>t.y;
    		return in;
    	}
    	friend ostream& operator<<(ostream& out,const Point_2D&t){
    		out<<'('<<t.x<<','<<t.y<<')';
    		return out;
    	}
    };
    class Point_3D:public Point_2D{
    protected:
    	float z;
    public:
    	Point_3D(float p=0,float q=0,float r=0):Point_2D(p,q),z(r){}
    	double distance(){return sqrt(x*x+y*y+z*z);}
    	Point_3D operator-(const Point_3D &rhs){
    		return Point_3D(x-rhs.x,y-rhs.y,z-rhs.z);
    	}
    	friend istream& operator>>(istream& in,Point_3D &t){
    		in>>t.x>>t.y>>t.z;
    		return in;
    	}
    	friend ostream& operator<<(ostream& out,const Point_3D&t){
    		out<<'('<<t.x<<','<<t.y<<','<<t.z<<')';
    		return out;
    	}
    };
    template<typename T>
    void solve(){
    	T pt1,pt2;
    	cin>>pt1>>pt2;
    	cout<<"Distance from Point"<<pt1<<" to Point"<<pt2<<" is "<<(pt1-pt2).distance()<<endl;
    }
    int main(){
    	int d;
    	while(cin>>d&&d){
    		if(d==1)solve<Point_1D>();
    		else if(d==2)solve<Point_2D>();
    		else solve<Point_3D>();
    	}
    	return 0;
    }
    

    (真的是又臭又长)

    7-3 时间模拟

    分数 50
    作者 余春艳
    单位 福州大学

    给出下面的基类Time的框架如下:

    class Time{
    protected:
        int second;
        int minute;
        int hour;
    public:
         void operator++();
         void operator--();
    }
    

    建立一个派生类Time_12hours,用于表示十二进制时间,增加以下成员数据:

    string type;//标识为12进制时间,type=”12-hours-time”
    string interval;//标识为AM或者PM,interval=”AM”或interval=”PM”
    

    增加以下成员函数:

    void operator++();
    void operator--();
    

    建立一个派生类Time_24hours,用于表示二十四进制时间,增加以下成员数据:

         string type;//标识为24进制时间,type=”24-hours-time”
    

    增加以下成员函数:

    void operator++();
    void operator--();
    

    生成上述类并编写主函数,根据输入的初始时间信息、自增或者自减类型、自增或者自减次数,输出其最后时间信息。

    输入格式:测试输入包含多个测试用例,一个测试用例为一行,每行共五个数字,第一个数字为进制,121表示输入为12进制AM时间,122表示输入为12进制PM时间,输入为24表示输入为24进制时间,第二个数字为hour,第三个数字为minute,第四个数字为second,第五个字符为运算类型,+表示自增,-表示自减,第六个数字为运算次数,0表示测试用例结束。

    输入样例:

    121 11 59 59 + 3
    24 11 59 59 + 3
    122 11 59 59 + 3
    122 00 00 00 - 3
    121 00 00 00 - 5
    24 00 00 00 - 1
    0
    

    输出样例:

    PM 00:00:02
    12:00:02
    AM 00:00:02
    AM 11:59:57
    PM 11:59:55
    23:59:59
    

    代码:

    #include<bits/stdc++.h>
    using namespace std;
    #define fastio ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0)
    #define endl '\n'
    const int MX=60*60*24;
    class Time{
    protected:
    	int second,minute,hour;
    public:
    	void turn_24(int sum){
    		second=sum%60;
    		minute=sum/60%60;
    		hour=sum/60/60;
    	}
    	void operator++(){
    		int sum=(second+minute*60+hour*3600+1)%MX;
    		turn_24(sum);
    	}
    	void operator--(){
    		int sum=(second+minute*60+hour*3600-1)%MX;
    		if(sum<0)sum+=3600*24;
    		turn_24(sum);
    	}
    	Time(int _h=0,int _m=0,int _s=0):hour(_h),minute(_m),second(_s){}
    	friend ostream& operator<<(ostream &out,const Time t){
    		out<<fixed<<setw(2)<<setfill('0');
    		out<<setw(2)<<t.hour<<':'<<setw(2)<<t.minute<<':'<<setw(2)<<t.second;
    		return out;
    	}
    };
    class Time_12hours:public Time{
    private:
    	string type,interval;
    public:
    	void rev(){
    		if(interval=="AM")interval="PM";
    		else interval="AM";
    	}
    	void turn_12(int sum){
    		if(sum>=12*3600){sum-=12*3600;rev();}
    		if(sum<0){sum+=12*3600;rev();}
    		second=sum%60;
    		minute=sum/60%60;
    		hour=sum/60/60;
    	}
    	Time_12hours(int _h=0,int _m=0,int _s=0,string _ty="12",string _it="AM")
    		:Time(_h,_m,_s),type(_ty),interval(_it){}
    	void operator++(){
    		int sum=second+minute*60+hour*3600+1;
    		turn_12(sum);
    	}
    	void operator--(){
    		int sum=second+minute*60+hour*3600-1;
    		turn_12(sum);
    	}
    	friend ostream& operator<<(ostream &out,const Time_12hours t){
    		out<<t.interval<<' ';
    		out<<fixed<<setw(2)<<setfill('0');
    		out<<setw(2)<<t.hour<<':'<<setw(2)<<t.minute<<':'<<setw(2)<<t.second;
    		return out;
    	}
    };
    int main(){
    	fastio;
    	int ty,h,m,s,x;
    	string op;
    	while(cin>>ty&&ty){
    		cin>>h>>m>>s>>op>>x;
    		if(ty==24){
    			Time t=Time(h,m,s);
    			for(int i=0;i<x;i++){
    				if(op[0]=='+')++t;
    				else --t;
    			}
    			cout<<t<<endl;
    		}else{
    			Time_12hours t;
    			if(ty==121)t=Time_12hours(h,m,s,"12","AM");
    			else t=Time_12hours(h,m,s,"12","PM");
    			for(int i=0;i<x;i++){
    				if(op[0]=='+')++t;
    				else --t;
    			}
    			cout<<t<<endl;
    		}
    	}
    }
    
  • 相关阅读:
    hdu 1272 小希的迷宫
    hdu 1318 Palindromes
    ANR traces中内存占用情况解读
    请教会linux shell脚本的=~是什么意思?
    kernel struct definition location
    SecureCRT sysrq键设置
    sysrq
    Linux中断管理 (1)Linux中断管理机制【转】
    Linux suspend 流程介绍(2)之 freeze task
    Linux进程状态解析 之 R、S、D、T、Z、X (主要有三个状态)
  • 原文地址:https://www.cnblogs.com/yoshinow2001/p/16345689.html
Copyright © 2020-2023  润新知