【C++练习】日期常见题型训练(5道编程题)

①.日期累加

在这里插入图片描述

解题思路:
1. 日期相加相减都要考虑2月的天数情况。
2.写一个可以获取每个月份天数的函数(要讨论闰年情况)。
3.当日期相加超过本月的最大天数时,就需要将月份加一,而天数需要减去当月的天数,当天数还大于当前月份天数,循环上面的操作。当天数小于当前月份天数,循环停止,而最终的day就是剩下的天数。
4.当月份超过12时,就需要将年份加一,而月份需要重新置为1。

#include <iostream>
#include <iterator>
using namespace std;
int GetMonday(int year, int month)
{
    int monday[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
    if (month == 2 && ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0))
    {
        return 29;
    }
    else
    {
        return monday[month];
    }
}
int main()
{
    int n;
    cin>>n;
    for(int i=0;i<n;i++)
    {
     
      int year,month,day,day1;
      cin>>year>>month>>day>>day1;
      int total =day+day1;
      while(total>GetMonday(year,month))
      {
         total-=GetMonday( year,  month);
         month++;
         if(month==13)
         {
            year++;
            month=1;
         }
      }
      day=total;

    printf("%4d-%02d-%02d\n",year,month,day);

    }
}

②.日期差值

在这里插入图片描述

解题思路:
1.两个日期相减就是事日期的差值。
2.如何计算差值?从较小的日期不断的叠加,每叠加一次就计数一次,当叠加到较大的日期时,那么计数器上的数值就是差值。
3.需要考虑到闰年2月的情况。
3.需要将一串日期给分割出来。year是前4位。month是56位,day是78位。利用/%来分离。
4.确保是小的日期叠加到大的日期。

#include <iostream>
using namespace std;

int GetMonday(int year, int month)
{
    int monday[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
    if (month == 2 && ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0))
    {
        return 29;
    }
    else
    {
        return monday[month];
    }
}
int main()
{
    int time1, y1, m1, d1;
    int time2, y2, m2, d2;
    int n = 1;//计数器
    while ((cin >> time1 >> time2))
    {
        if (time1 > time2)//确保time1是小的日期,time2是大的日期,从time1叠加到time2
        {
            int temp = time1;
            time1 = time2;
            time2 = temp;
        }
        y1 = time1 / 10000;
        m1 = time1 % 10000 / 100;
        d1 = time1 % 100;
        y2 = time2 / 10000;
        m2 = time2 % 10000 / 100;
        d2 = time2 % 100;

        while ((y1 < y2) || (m1 < m2) || (d1 < d2))//当满足其中一个条件就说明time1还是小于time2还需要叠加
        {
            d1++;//日期进行叠加
            if (d1 > GetMonday(y1, m1))//到day叠加到大于本月的最大天数时,就需要将月份进一。而天数需要重新置为1,重新叠加。
            {
                m1++;
                d1=1;
            }
            if (m1 == 13)//如果月份超过12,则年份需要进一,月份重新置为1
            {
                y1++;
                m1 = 1;
            }
            n++;//每叠加一次,计数器需要计数一次。
        }
       
        cout << n << endl;
    }

    
}

③.打印日期

在这里插入图片描述

解题思路:
1.就是将天数转化为对应的月份。
2.要考虑闰年2月。
3.月份默认为1月,当天数大于1月天数时,月份加1,将天数减去1月天数。当剩下的天数大于2月天数时,月份再加1,将天数减去2月天数……循环上面的操作,直到天数小于月份的天数时,再终止循环。最终的月份和天数就出来了。

#include <iostream>
using namespace std;
int GetMonday(int year, int month)
{
    int monday[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
    if (month == 2 && ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0))
    {
        return 29;
    }
    else
    {
        return monday[month];
    }
}
int main()
{
    int year,m;
    int month=1;
    int day=0;
    while(cin>>year>>m)
    {
       for(int i=1;i<=12;i++)
       {
        if(m>GetMonday(year,i))
        {
          month++;
          m-=GetMonday( year,i);
        }
        else {
        break;
        }
       }
       day=m;

       printf("%4d-%02d-%02d",year,month,day);
    }
}

④.求1+2+3+…+n(非正常方法)

在这里插入图片描述

解题思路:
1.不能使用正常的方法来计算。
2.利用构造函数特性。每生成一个对象,就会自动调用构造。
3.创建n个对象,调用n次构造,在构造函数里面进行数值的叠加。
4.要注意当构造函数结束该数值还存在,需要使用静态成员变量。
5.静态成员变量要在类里声明,类外定义。
6.如何获取类里的数据?利用静态成员函数就可以不需要this指针,也可以调用。

class sum{
public:
   sum()//利用构造函数特性,在构造函数里面进行数值叠加
   {
    _ret+=_i;
    ++_i;
   }
   static int GetRet()//最终利用静态成员函数,使结果被外部获取。
   {
        return _ret;
   }
private://静态成员  类里声明
   static int _i;
   static int _ret;
};
int sum::_i=1;//类外定义
int sum::_ret=0;
class Solution {
public:
    int Sum_Solution(int n) {
        
        sum a[n];//调用n次构造函数。
        return sum::GetRet();//调用类里的成员函数需要this指针,单类里的静态成员函数不需要可以直接调用,但需要指明类域。
    }
};

⑤.计算一年的第几天

在这里插入图片描述

解题思路:
1.通过枚举出每个月的天数,然后将其相加即可。
2.需要考虑闰年2月的天数。
3.当月份等于一月时,直接返回当前的天数即可。
4.当月份大于1月时,就从1月开始累计到该月。

#include <iostream>
using namespace std;
 int GetMonday(int year, int month)
    {
        int monday[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
        if (month == 2 && ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0))
        {
            return 29;
        }
        else
        {
            return monday[month];
        }

    }
    int Day(int year,int month,int day)
    {
            int i = 0;
    int ret = 0;
        for (i = 1; i < month; i++)
        {
            ret += GetMonday(year, i);
        }
        if (month == 1)
        {
            return  day;
        }
            return ret + day;
    }

int main()
{
    int year,month,day;
    cin>>year>>month>>day;
    cout<<Day(year,month,day)<<endl;
     
}
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小陶来咯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值