C++程序设计(输入一个数字和日期求此日期加上或减去数字后的日期)

问题描述:(C++)输入一个数字(有正负)和一个日期,求日期加上此数字后的日期是多少?(考虑平年和闰年)watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAS2F3YXNha2lIMlI=,size_20,color_FFFFFF,t_70,g_se,x_16

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAS2F3YXNha2lIMlI=,size_20,color_FFFFFF,t_70,g_se,x_16

题主求解历程:一开始没有思路,从网上找类似题目答案。只找到:1.求两个日期间相隔多少日?2.给定一个年份(1900-2005)和一个数字(1-366)求这是今年的几月几日?

形成自己的思路:1.找到基准日期(题主以1年1月1日为准)2.将日/月/年转化为总共的天数(到基准日期)3.加上或减去数字 4.将得到的新数字转化回天数(日期->天数->日期)

写代码时的困难:天数转化回日期时困难重重。一、故转化思路再次细分先问题:1.先求年和剩余天数2.借鉴此段代码(给定一个年份(1900-2005)和一个数字(1-366)求这是今年的几月几日?)二、ide使用不熟练,之前一直在用Devcpp。此段代码决定用Vscode来写让自己熟练一下更加先进和强大ide的使用。但过程中:首先配置环境就先搞了一上午,其次代码的分步调试纠错等不会使用(又没找到教程想要不耽误进程,调试又回到了Devcpp)

程序实现:给定任意日期(不考虑1月35日,-2021年等不合法输入)和数字可计算给定日期加上或减去此数字后的日期。(测试案例不多如果有uu测试案例出现问题可回复)

测试案例:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAS2F3YXNha2lIMlI=,size_20,color_FFFFFF,t_70,g_se,x_16

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAS2F3YXNha2lIMlI=,size_20,color_FFFFFF,t_70,g_se,x_16

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAS2F3YXNha2lIMlI=,size_20,color_FFFFFF,t_70,g_se,x_16

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAS2F3YXNha2lIMlI=,size_20,color_FFFFFF,t_70,g_se,x_16

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAS2F3YXNha2lIMlI=,size_20,color_FFFFFF,t_70,g_se,x_16

 注:1.有uu说launch和task这两个文件应该没配置好,偶尔会有玄学问题。(应当注意解决一下此问题)

代码奉上(欢迎指正):

/*Fron Liuzhi*/
#include<iostream>
#include<stdio.h>
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
bool isLeapYear(int year)   //判断平闰年
{
	return ((year%4==0 && year%100!=0) || year%400==0);
}
int getDays(int year, int month, int day)     //由日期得到总天数
{
	int m[] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
	if(isLeapYear(year))
		m[2]++;
	int result = 0;
	for(int i = 1;i < year;i++)
	{
		result += 365;
		if(isLeapYear(i))
			result ++;
	}
	for(int i = 1;i < month;i++)
	{
		result += m[i];
	}
	result += day;
	
	return result;
}
int getYears(int days)       //由天数得到最后所处在的年份
{
	int sum = 0;int years = 1;int finalyears = 0;
	    for(int i =1;days>sum;i++){
        if(isLeapYear(i) ){
            sum = sum + 366;
          }else{
            sum = sum + 365;
               }
    years++;
    }
	finalyears = years - 1;
	return finalyears;
}
int getRemainder(int days,int finalyears )       //总的天数减去所在年份还余下多少天
{
	   for(int i = 1;i<=finalyears-1;i++){
        if(isLeapYear(i)){
            days = days - 366;
        }else{
            days = days -365;
        }
    }
	return days;
}
int main(){
	int days,month,years,num;
	int finaltotalldays;
	cout<<"Enter the difference in days: ";
	cin>>num;
	cout<<"Enter a date in the form day month year: ";
	cin>>days>>month>>years;
	finaltotalldays = getDays(years,month,days) + num;
	int fianlyears;
	fianlyears = getYears(finaltotalldays);
	int remianderDays;
	remianderDays = getRemainder(finaltotalldays,fianlyears);
    //以下代码解决给定一个年份和天数判断为这一年的几月几日
	int sum = 0, i = 0;
	int a[12]={31,28,31,30,31,30,31,31,30,31,30,31};
	 if((fianlyears%4==0&&fianlyears%100!=0)||(fianlyears%400==0)){
	 	a[1]=29;
	 }
	 while(sum+a[i]<remianderDays){
	 	sum+=a[i];
	 	i++;
	 }
	 cout<<remianderDays-sum<<"/"<<i+1<<"/"<<fianlyears; //按照示例格式输出
}

有其他便捷思路亦可交流

  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值