问题描述:(C++)输入一个数字(有正负)和一个日期,求日期加上此数字后的日期是多少?(考虑平年和闰年)
题主求解历程:一开始没有思路,从网上找类似题目答案。只找到: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测试案例出现问题可回复)
测试案例:
注: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; //按照示例格式输出
}
有其他便捷思路亦可交流