【面向对象课】作业-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;
}
}
}