题目:
两个类如下设计:类time有三个数据成员,hh,mm,ss,分别代表时,分和秒,并有若干构造函数和一个重载-(减号)的成员函数。类date有三个数据成员,year,month,day分别代表年月日,并有若干构造函数和一个重载>(<)(大于号或者小于号)的成员函数。
要求设计一个函数模板template <class T> double maxn(T x[], int len) 对int,float,time和date或者其他类型的数据,返回最大值。
主函数有如下数据成员:
int intArray[100];
double douArray[100];time timeArray[100];
date dateArray[100];
其中,hh = 3600 ss, mm = 60 ss, year = 365 day, month = 30 day,对于time和date类型,数据在转换成ss或者day后进行运算。
输入格式:
每行为一个操作,每行的第一个数字为元素类型,1为整型元素,2为浮点型元素,3为time类型,4为date类型,若为整型元素,接着输入整型数据,以0结束。若为浮点型元素,接着输入浮点型数据,以0结束。若为time型元素, 输入time型数据(hh1 mm1 ss1 hh2 mm2 ss2),以0结束。若为date型数据,输入date型数据(year1 month1 day1 year2 month2 day2),以0结束。输入-1时表示全体输入结束。
输出格式:
对每次输入,输出一个最大值。
样例输入:
1 4 5 9 3 7 0
2 4.4 5.5 6.9 3.2 2.7 0
3 18 21 22 18 20 31 18 21 49 0
4 2013 5 14 2013 5 15 2013 4 1 0
-1
样例输出:
9
6.9
18 21 49
2013 5 15
代码:
#include<iostream>
#include<cmath>
using namespace std;
template <typename T>
T maxn(T a[],int n);
class Time {
int hh, mm, ss;
public:
Time(int h=-1,int m=-1,int s=-1):hh(h),mm(m),ss(s) {}
void set_time(int h, int m, int s) {
hh = h;
mm = m;
ss = s;
}
friend int operator-(Time &t1,Time &t2);
friend bool operator>(Time &d1, Time &d2);
friend ostream & operator<<(ostream &output,Time &t);
};
ostream &operator << (ostream &output,Time &t) {
output << t.hh << " " << t.mm << " " << t.ss ;
return output;
}
bool operator > (Time &d1, Time &d2) {
int d1_sum = d1.hh * 3600 + d1.mm * 60 + d1.ss;
int d2_sum = d2.hh * 3600 + d2.mm * 60 + d2.ss;
if(d1_sum>d2_sum)
return 1;
else
return 0;
}
int operator - (Time &t1,Time &t2) {
int t1_sum = t1.hh * 3600 + t1.mm * 60 + t1.ss;
int t2_sum = t2.hh * 3600 + t2.mm * 60 + t2.ss;
return t1_sum - t2_sum;
}
class Date {
int year, month, day;
public:
Date(int y = 0, int m = 0, int d = 0) : year(y),month(m),day(d) {}
void set_date(int y , int m , int d ) {
year = y;
month = m;
day = d;
}
friend bool operator>(Date &d1, Date &d2);
friend ostream & operator<<(ostream &output,Date &d);
};
ostream & operator <<(ostream &output,Date &t) {
output << t.year << " " << t.month << " " << t.day ;
return output;
}
bool operator > (Date &d1, Date &d2) {
int d1_sum = d1.year * 365 + d1.month * 30 + d1.day;
int d2_sum = d2.year * 365 + d2.month * 30 + d2.day;
if(d1_sum>d2_sum)
return 1;
else
return 0;
}
int main() {
int intArray[100];
double douArray[100];
Time timeArray[100];
Date dateArray[100];
int icount, dcount, tcount, Dcount;
int flag,i1,i2,i3;
double d1, d2;
for (;;) {
cin >> flag;
if(flag==-1)
break;
else if(flag==1) {
//int i = 0;
for (int i = 0;; i++) {
cin >> flag;
if(!flag)
break;
intArray[i] = flag;
icount = i;
}
maxn(intArray, icount);
} else if(flag==2) {
for (int i = 0;; i++) {
cin >> d1;
if(!d1)
break;
douArray[i] = d1;
dcount = i;
}
maxn(douArray, dcount);
} else if(flag==3) {
for (int i = 0;; i++) {
cin >> i1;
if(!i1)
break;
cin >>i2 >> i3;
timeArray[i].set_time(i1, i2, i3);
tcount = i;
}
maxn(timeArray, tcount);
} else if(flag==4) {
for (int i = 0;; i++) {
cin >> i1;
if(!i1)
break;
cin >>i2 >> i3;
dateArray[i].set_date(i1, i2, i3);
Dcount = i;
}
maxn(dateArray, Dcount);
}
}
}
template <typename T>
T maxn(T a[],int n) {
int max=0;
for (int i = 0; i <= n; i++) {
if(a[i]>a[max]) {
max = i;
}
}
cout << a[max]<<endl;
return a[max];
}