题目描述
编写一个模板函数 maxn(),可以返回数组中最大的元素。包括三种类型的数组:int、double、Time(时间)和Date(日期)。
时间和日期分别由 Time 类和 Date 类实现:
class Time {
private:
int hh, mm, ss;
public:
Time(int _hh = 0, int _mm = 0, int _ss = 0) : hh(_hh), mm(_mm), ss(_ss) {}
};
class Date {
private:
int year, month, day;
public:
Date(int _year = 0, int _month = 0, int _day = 0) : year(_year), month(_month), day(_day) {}
};
设计思路
- 自定义 Time 和 Date 类,便于进行比较和运算。
- 使用模板函数
maxn()来找到数组中的最大值。 - 根据输入的类型,使用不同的存储方式。对于 Time 和 Date 类型,使用数组存储。
程序流程图
开始
读入输入类型 type
while (type != -1) {
if (type == 1) {
读入 int 数组 intArray
调用 maxn(intArray)
输出结果
} else if (type == 2) {
读入 double 数组 douArray
调用 maxn(douArray)
输出结果
} else if (type == 3) {
读入 Time 数组 timeArray
计算 timeArray 中两个元素的时间差
调用 maxn(timeArray)
输出结果
} else if (type == 4) {
读入 Date 数组 dateArray
计算 dateArray 中两个元素的日期差
调用 maxn(dateArray)
输出结果
}
重置数组和计数器
读入输入类型 type
}
结束
代码实现
#include <iostream>
using namespace std;
class Time {
private:
int hh, mm, ss;
public:
Time(int _hh = 0, int _mm = 0, int _ss = 0) : hh(_hh), mm(_mm), ss(_ss) {}
int toSeconds() const {
return hh * 3600 + mm * 60 + ss;
}
Time operator- (const Time& t) const {
int s1 = toSeconds(), s2 = t.toSeconds();
int s = abs(s1 - s2);
return Time(s / 3600, s % 3600 / 60, s % 60);
}
};
class Date {
private:
int year, month, day;
public:
Date(int _year = 0, int _month = 0, int _day = 0) : year(_year), month(_month), day(_day) {}
int toDays() const {
return year * 365 + month * 30 + day;
}
Date operator- (const Date& d) const {
int s1 = toDays(), s2 = d.toDays();
int s = abs(s1 - s2);
return Date(s / 365, s % 365 / 30, s % 365 % 30);
}
};
template <class T>
double maxn(T x[], int len) {
double maxVal = x[0];
for (int i = 1; i < len && x[i]; ++i) {
if (x[i] > maxVal) {
maxVal = x[i];
}
}
return maxVal;
}
int main() {
int intArray[100], num = 0;
double douArray[100], d = 0;
Time timeArray[100];
Date dateArray[100];
int type;
while (cin >> type && type != -1) {
if (type == 1) {
while (cin >> intArray[num] && intArray[num]) {
++num;
}
cout << (int)maxn(intArray, num) << endl;
} else if (type == 2) {
while (cin >> douArray[d] && douArray[d]) {
++d;
}
cout << maxn(douArray, d) << endl;
} else if (type == 3) {
int hh1, mm1, ss1, hh2, mm2, ss2;
while (cin >> hh1 >> mm1 >> ss1 >> hh2 >> mm2 >> ss2 && (hh1 || mm1 || ss1 || hh2 || mm2 || ss2)) {
Time t1(hh1, mm1, ss1), t2(hh2, mm2, ss2);
timeArray[num] = t1 - t2;
++num;
}
cout << timeArray[0].toSeconds();
cout << (timeArray[0] < timeArray[1] ? timeArray[1] : timeArray[0]) << endl;
} else if (type == 4) {
int year1, month1, day1, year2, month2, day2;
while (cin >> year1 >> month1 >> day1 >> year2 >> month2 >> day2 && (year1 || month1 || day1 || year2 || month2 || day2)) {
Date d1(year1, month1, day1), d2(year2, month2, day2);
dateArray[num] = d1 - d2;
++num;
}
cout << dateArray[0].toDays();
cout << (dateArray[0] < dateArray[1] ? dateArray[1] : dateArray[0]) << endl;
}
num = 0; d = 0;
}
return 0;
}