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

博客讲述了如何使用C++编程解决输入一个数字和日期,计算加减后的日期,涉及平闰年判断和日期转换。博主从无思路到找到类似问题,再到形成解题思路,最终实现代码,包括日期转天数、天数转日期等步骤,同时分享了IDE使用经验。
摘要由CSDN通过智能技术生成

问题描述:(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; //按照示例格式输出
}

有其他便捷思路亦可交流

(1) 测试日期类成员函数,在主函数中列出菜单选项,可以完成日期的加减比较等测试功能。 (2) 完善程序功能,在日期相加的菜单选项中增加日期天数,结果为新日期日期家月份,结果为新日期,要考虑闰年情况。 (3) 完善程序功能,在日期相减的菜单选项中增加日期天数,结果为新日期日期减月份,结果为新日期,要考虑闰年情况。 (4) 显示日期时增加显示星期及英文形式的月份的功能。 (5) 增加输入的甄别功能,即输入非法数据(如负数、日期超过31天、时间超过24小时等情况)的识别显示功能。 (1) 仿照日期类编写时间类CTime_t,可以完成时间的设置、运算、比较等功能。 (2) 增加时间的输入功能,既可以选择输入格式,可以输入hh:mm:ss格式的信息。 (3) 增加时间的输出格式,可以输出12小时的时间格式。 (4) 编写时间和日期的派生类CDati,完成日期与时间的联合设置、运算、比较等功能,要求该派生类可以完成:日期时间加天数或时间等于新的日期时间,日期时间减天数或等于新的日期时间,两个日期时间相减等于天数或时间等工作,在程序中考虑闰年等具体情况,并重载各种运算符。 (5) 增加输入的甄别功能,即输入非法数据,即输入非法数据(如负数、日期超过31天、时间超过24小时等情况)的识别显示功能。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值