【面向对象课】作业-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;
		}
	}
}
posted @ 2022-06-06 00:00  yoshinow2001  阅读(76)  评论(0编辑  收藏  举报