7-9 数据的间距问题(重载+函数模板) (60分)
三个类如下设计:类cTime有三个数据成员,hh,mm,ss,分别代表时,分和秒,并有若干构造函数和一个重载-(减号)的成员函数。类point有两个数据成员,x,y分别坐标,并有若干构造函数和一个重载-(减号)的成员函数。类date有三个数据成员,year,month,day分别代表年月日,并有若干构造函数和一个重载-(减号)的成员函数。 要求设计一个函数模板template <\class T>\ double dist(T a, T b) 对int,float,cTime,point和date或者其他类型的数据,返回间距。
其中,hh = 3600 ss, mm = 60 ss, year = 365 day, month = 30 day,对于cTime和date类型,数据在转换成ss或者day后进行运算。
输入格式:
每一行为一个操作,每行的第一个数字为元素类型,1为整型元素,2为浮点型元素,3为point类型,4,为time类型,5为date类型,若为整型元素,接着输入两个整型数据,
若为浮点型元素,接着输入两个浮点型数据,若为point型元素,输入两个point型数据(x1 y1 x2 y2),若为time型元素, 输入两个cTime型数据(hh1 mm1 ss1 hh2 mm2 ss2),若为date型数据,输入两个date型数据(year1 month1 day1 year2 month2 day2)。输入0时标志输入结束。
输出格式:
对每个输入,每行输出一个间距值。
样例输入:
1 2 5
4 18 21 22 18 20 31
3 2 4 5 9
5 2013 5 14 2013 5 15
2 2.2 9.9
0
样例输出:
3
51
5.83095
1
7.7
#include<iostream>
#include<cmath>
using namespace std;
class Point
{
int x,y;
public:
Point(){}
void set(int a,int b)
{
x=a;y=b;
}
friend float operator - (Point a,Point b)
{
float m;
m=sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
return m;
}
};
class cTime
{
int hh,mm,ss;
public:
cTime(){}
friend int operator - (cTime a,cTime b)
{
a.ss=a.hh*3600+a.mm*60+a.ss;
b.ss=b.hh*3600+b.mm*60+b.ss;
return b.ss-a.ss;
}
void set(int a,int b,int c)
{
hh=a;mm=b;ss=c;
}
};
class date
{
int y,m,d;
public:
date(){ }
friend int operator - (date a,date b);
void set(int a,int b,int c)
{
y=a;m=b;d=c;
}
};
int operator-(date a,date b)
{
int year1=fabs(a.y-b.y);
int month1=fabs(a.m-b.m);
int day1=fabs(a.d-b.d);
day1+=year1*365+month1*30;
return day1;
}
template<class T>
float dist(T a,T b)
{
float m;
m=fabs(a-b);
return m;
}
int main()
{
int type,num11,num12,num31,num32,num41,num42;
float num21,num22;
Point p1;Point p2;
cTime t1,t2;
date d1,d2;
while(1)
{
cin>>type;
if(type==0) break;
float x1;
int x2;
switch(type)
{
case 3:
cin>>num11>>num12>>num31>>num32;
p1.set(num11,num12);
p2.set(num31,num32);x1=dist(p1,p2);
cout<<x1<<endl;
break;
case 1:
cin>>num11>>num12;x2=dist(num11,num12);
cout<<x2<<endl;
break;
case 2:
cin>>num21>>num22;x1=dist(num21,num22);
cout<<x1<<endl;
break;
case 4:
cin>>num11>>num12>>num31>>num32>>num41>>num42;
t1.set(num11,num12,num31);
t2.set(num32,num41,num42);
x2=dist(t1,t2);
cout<<x2<<endl; break;
case 5:
cin>>num11>>num12>>num31>>num32>>num41>>num42;
d1.set(num11,num12,num31);
d2.set(num32,num41,num42);
x2=dist(d1,d2);
cout<<x2<<endl; break;
}
}
return 0;
}
总结:按功能逐步搭建类对象
先空白构造函数 再set函数 再分别搭建operator-函数
再搭建主函数分别的功能
尽量每一步的操作是一样的