周五打卡

发布时间 2023-05-05 19:37:57作者: 菜鸟de博客

题目描述

编写一个模板函数 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) {}
};

设计思路

  1. 自定义 Time 和 Date 类,便于进行比较和运算。
  2. 使用模板函数 maxn() 来找到数组中的最大值。
  3. 根据输入的类型,使用不同的存储方式。对于 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;
}