PTA 7-9 编写一个友元函数,求两个日期之间相差的天数。

本文介绍了一个包含年月日的Date类,实现了友元函数计算日期差天数,以及辅助功能如判断闰年和合法日期检查。通过实例展示了如何使用类和友元函数来解决日期操作问题,遇到非法时间会返回错误提示。

题目

设计一个日期类Date,包括日期的年份、月份和日号,编写一个友元函数,求两个日期之间相差的天数。该类中设计有3个友元函数;count_day()函数,它有两个参数,第2个参数是一个标志,当其值等于1 时,计算一年的开始到某日期的天数;否则计算某日期到年尾的天数。leap()函数用于判断指定的年份是否为闰年。subs()函数用于计算两个日期之间的天数。 当时间输入不正确时,输出“time error!”

输入样例:

在这里给出一组输入。例如:

2000 1 1 
2002 10 1

输出样例:

在这里给出相应的输出。例如:

1004

代码:

//7-9 编写一个友元函数,求两个日期之间相差的天数
#include<iostream>
using namespace std;
int is_leap(const int &year);
class Date
{
private:
    int year, month, day;

public:
    Date(int y = 0, int m = 1, int d = 1) : year(y), month(m), day(d) { ; }
    friend int is_leap(const int &year);
    friend int count_day(const Date &d, int flag);
    friend int subs(const Date &d1, const Date &d2);
    friend bool operator>=(const Date &d1, const Date &d2);

    int is_big_month()
    {
        int dm[7] = {1, 3, 5, 7, 8, 10, 12};
        for (int i = 0; i < 7; i++) if (dm[i] == month) return 1;
        return 0;
    }
    bool is_legal()
    {
        if (year > 0 && month <= 12 && month >= 1 && day >= 1)
        {
            if (month == 2 && day <= 28 + is_leap(year)) return true;
            else if (month != 2 && day <= 30 + is_big_month()) return true;
        }
        return false;
    }
};

bool operator>=(const Date &d1, const Date &d2)
{
    if (d1.year<d2.year)return false;
    if (d1.month<d2.month)return false;
    if (d1.day<d2.day)return false;
    return true;
}


int is_leap(const int &year)
{
    if ((year % 400 == 0) || (year % 4 == 0 && year % 100 != 0)) return 1;
	else return 0;
}

int count_day(const Date &d, int flag)
{
    int ans, isleap = is_leap(d.year);
    ans = 31 * (d.month - 1) + d.day;
    if (d.month > 2)
    {
        ans -= (4 * (d.month) + 23) / 10;
        ans += isleap;
    }
    if (flag == 1) return ans;
    return 365 + isleap - ans;
}

int subs(const Date &d1, const Date &d2)
{
    if (d1.year == d2.year) return count_day(d2, 1) - count_day(d1, 1);
    int ans = 0;
    for (int i = d1.year + 1; i < d2.year; i++) ans += 365 + is_leap(i);
    ans += count_day(d2, 1);
    ans += count_day(d1, 2);
    return ans;
}


int main()
{

        int y, m, d;
        cin >> y >> m >> d; Date d1(y, m, d);
        cin >> y >> m >> d; Date d2(y, m, d);
        if (d1.is_legal() && d2.is_legal() && d2>=d1) cout << subs(d1, d2);
        else cout << "time error!";
 
    return 0;
}

吐槽:

傻逼wx题目不写清楚点。

第二个时间需要大于第一个。

以下是一个使用 C++ 设计的包含年、、日的日期类 `Date`,并编写一个友元函数来计算两个日期之间相差天数的示例代码: ```cpp #include <iostream> #include <cmath> class Date { private: int year; int month; int day; // 判断是否为闰年 bool isLeapYear(int y) const { return (y % 4 == 0 && y % 100 != 0) || (y % 400 == 0); } // 计算从该日期到该年 1 1 日的天数 int daysToStartOfYear() const { int daysInMonth[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; if (isLeapYear(year)) { daysInMonth[1] = 29; } int days = 0; for (int i = 0; i < month - 1; ++i) { days += daysInMonth[i]; } days += day; return days; } // 计算该日期所在年份的总天数 int daysInYear() const { return isLeapYear(year) ? 366 : 365; } public: Date(int y, int m, int d) : year(y), month(m), day(d) {} // 友元函数,计算两个日期之间天数 friend int daysBetween(const Date& d1, const Date& d2); }; // 友元函数实现 int daysBetween(const Date& d1, const Date& d2) { if (d1.year == d2.year) { return std::abs(d1.daysToStartOfYear() - d2.daysToStartOfYear()); } Date earlier = (d1.year < d2.year) ? d1 : d2; Date later = (d1.year < d2.year) ? d2 : d1; int days = 0; // 计算 earlier 到该年年底的天数 days += earlier.daysInYear() - earlier.daysToStartOfYear(); // 计算 earlier 年份到 later 年份之间整年的天数 for (int y = earlier.year + 1; y < later.year; ++y) { Date temp(y, 1, 1); days += temp.daysInYear(); } // 计算 later 从该年年初到该日期天数 days += later.daysToStartOfYear(); return days; } int main() { Date d1(2023, 1, 1); Date d2(2024, 1, 1); int diff = daysBetween(d1, d2); std::cout << "两个日期之间相差天数: " << diff << std::endl; return 0; } ``` ### 代码解释: 1. **`Date` 类**:包含私有成员变量 `year`、`month` 和 `day` 分别表示年、、日。 2. **`isLeapYear` 方法**:用于判断某一年是否为闰年。 3. **`daysToStartOfYear` 方法**:计算从该日期到该年 1 1 日的天数。 4. **`daysInYear` 方法**:计算该日期所在年份的总天数。 5. **`daysBetween` 友元函数**:计算两个日期之间相差天数。 ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值