C++--类与对象(下)--相关例题--累加天数--打印日期--日期差值--计算日期到天数的转换--求前N项和

累加天数

要求:设计一个程序能计算一个日期加上若干天后是什么日期

这个要求和我们之前在日期相关的例题里面实现过,大体一致的.

1.判断是否是闰年
2.对天数进行判断,大于当月则减去,并且月份+1
3.一直操作,直到要加的天数为0为止,输出日期

#include<iostream>
  using namespace std;
   
  int main()
  {
    int n;
    while(cin>>n)		//这里的是代码中要累加的数目
    {
      for(int i=0;i<n;i++)		//循环进行
      {
       int y,m,d,num;		//分别为要输入的年月日和要累加的天数
       int days[12]={31,28,31,30,31,30,31,31,30,31,30,31};	//每个月的月份
       cin>>y>>m>>d>>num;	//cin进行传入
        
       while(num>days[m-1])	//当要累加的天数大于当月的天数的时候
       {
         if(y%400==0||(y%4==0&&y%100!=0))	//先判断是否是闰年
           days[1]=29;
         else
           days[1]=28;
         
         num -= days[m-1]-d;		//判断完对对应的天数减去对应的一个月
         d=0;		//日变为0
         m++;		//月份+1
         if(m==13)		//如果月份为13月的时候
         {
           y++;		//年份+1
           m=1;		//月份=1
         }
      }
        printf("%4d-%02d-%02d\n",y,m,num);		//将其进行输出,最后的num就是小于这个月月份的,也就是日子
      }
    }
    return 0;
  }

打印对应的日期

要求:给出年分m和一年中的第n天,算出第n天是几月几号

1.定义出要计算的年份和天数
2.是否是闰年计算
3.按月份进行–,月份++
4.输出对应的日期

#include <iostream>
  using namespace std;
   
  int main()
  {
    int year;		//年份
    int day;		//这一年的第多少天
     
    int mon[13] = {31, 28, 31, 30, 31, 30, 31, 31, 30 ,31, 30, 31};   
    while(cin>>year>>day)		//循环呢输入
    {
    	//闰年判断
      if(((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0))
        mon[1] = 29;
      else
        mon[1] = 28;
        
      for(int i = 0; i < 12; i++)		//进行月份的循环
      {	
        if(day <= mon[i])		//如果剩下的天数小于对应的月份
        {
          printf("%04d-%02d-%02d\n", year, i + 1, day);		//直接输出
          break;		//循环结束
        }
        else
        {
        day = day - mon[i];		//如果大于,则继续减去对应月份的天数
        }
    }
    }
    return 0;
  }

日期差值

要求:求两个日期之间相差的天数,如果两个日期是连续的我们规定他们之间的天数为两天
两日期相减也在之前日期类代码中实现过,大家可以去看看! 点击此处

1.求出这一年距离0000年01月1号的距离函数,并对其进行封装
2.定义两个日期,对其进行输入
3.调用函数对于这里两个日期
4.对调用函数后求出的两个天数进行绝对值做差并进行输出

#include <iostream>
using namespace std;

int mon[12] = { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 };


int Count(int y, int m, int d)		//传入对应的年月日
{
	
	int yd = y * 365 + y / 4 - y / 100 + y / 400;	//求出这一年分所有的天数和
	
	int md = mon[m - 1];	//看在哪一个月

	if (m > 2 && ((y % 4 == 0 && y % 100 != 0) || y % 400 == 0))
		md += 1;		//是否是闰年判断

	return yd + md + d;	//整合年份对应的天数+月份对应的天数+天数
}

int main()
{
	int y1, m1, d1;						//==第一组日期输入求出
	scanf("%4d%2d%2d", &y1, &m1, &d1);
	int n1 = Count(y1, m1, d1);

	int y2, m2, d2;						//==第二组日期输入求出
	scanf("%4d%2d%2d", &y2, &m2, &d2);
	int n2 = Count(y2, m2, d2);

	cout << abs(n1 - n2) + 1 << endl;	//输出并绝对值做差   abs绝对值
}

计算日期到天数的转换

要求:输入对应年份的具体日子,求出是这一年的第多少天

1.对每个月都进行累加,形成一个对应的数组
2.对对应的日期进行相加,如果为5月份,则取前四个月相加的数字加上日期所对应的日
3.输出即可

#include<iostream>
using namespace std;

const int days[] = { 0,31,59,90,120,151,181,212,243,273,304,334,365 };

int main(){
    
    int y,m,d;
    while(cin>>y>>m>>d){		//循环输入
        
        int an=days[m-1]+d;		//核心代码
        if(((y%4==0&&y%100!=0)||y%400==0)&&m>2)		//是否是闰年
            an++;		//++
            cout<<an<<endl;		//输出
    }
    return 0;
}

求前N项和

要求:要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句

我利用了创建一个内部类的思想,在内部内中进行数字的相加和自加,然后定义 一个函数输入对应的n值,计算出前n项,再调用内部类的函数,注意,静态成员变量要在类的外部进行声明!

class Solution {
public:
    
    class Sum{		//创建内部类
        public:		//在公有的条件下
        Sum(){		//创建和的成员函数
        _sum +=_i;
        ++_i;
        }
    };
    int Sum_Solution(int n) {	//创建前n项
        
        _sum=0;		//每次自增后对值进行恢复,防止出错
        _i=1;
        
        Sum array[n];	//调用
        return _sum;	//输出最终要求的值
    };
    private:
    static int _i;		//静态变量
    static int _sum;
};

int Solution::_i=1;			//静态变量要在类的外部赋值
int Solution::_sum=0;

今天写的5个例题难度并不是很高,主要在于你的理解,要将整个思路进行总结,就像我上面的理清思路,然后多注意细节,多敲代码!!!就可以啦!!!加油!!!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值