1、问题描述
(1)输入今天的日期(年,月,日)和你的出生日期(年,月,日),计算你在这个世界已经生存了多少天。取值范围:年:1900 – 2100,月:1 – 12,日:1 - 31
(2)输入期望的年龄,计算还将在这个世界生存的天数。
2、解题算法思想
(1)对于第一问:我们可以把已经活过的天数分解成整年的天数、整月的天数以及日的天数。具体的方法在下一部分详细解释。
(2)对于第二问:还要活得天数=总共要活的天数-已经活了的天数。
注:总共要活的天数和已经活了的天数都可以通过第一问的函数求得。
3、关键函数countLiveday( )详解
函数功能:计算两个日期间的天数。
函数算法:把总天数拆成整年的天数、整月的天数以及日的天数。
%%解说例子%%:1997-10-19——2020-03-27
函数执行流程:(用上面例子辅以说明)
——》开始;
——》计算天数的变量daynum置0;
——》计算年的天数,计算方法:通过for循环从出生那年累加到今年的前一年(1997年到2019年);
——》减去出生那年没过的整月天数,计算方法:通过for循环从1月累减到出生那个月的前一月(1月到9月);
——》加上今年到现在过得整月天数,计算方法:通过for循环从1月累加到现在的前一月(1月到2月);
——》减去出生那个月没过的天数,加上现在这个月已过的天数(减去10月的19天,加上3月的27天);
——》返回总天数daynum;
——》结束;
注意点:
(1)计算天数是要分是否为闰年。
(2)计算月的天数时,可以分别把平年和闰年每月的天数定义在两个数组中。
例如:
int m[ ]={31,28,31,30,31,30,31,31,30,31,30,31};
int n[ ]={31,29,31,30,31,30,31,31,30,31,30,31};
函数代码:
void countLiveday(int a,int b,int c,int a1,int b1,int c1)
{
daynum=0; //变量的初始化,否则每次调用函数,daynum的值就会继续累加,计算错误!!!
int t1=a,t2=a1;
for(;a1<a;a1++) //计算年天数;
{
if(leapYear(a1)==1)
daynum+=366; //闰年天数;
else
daynum+=365; //平年天数;
}
for(int i=0;i<b1-1;i++) //计算出生前没过的月天数;
{
if(leapYear(t2)==1)
daynum-=n[i]; //二月有29天;
else
daynum-=m[i]; //二月有28天;
}
for(int j=0;j<b-1;j++) //计算今年没算的天数;
{
if(leapYear(t1)==1)
daynum+=n[j]; //二月有29天
else
daynum+=m[j]; //二月有28天;
}
daynum=daynum-c1+c; //减去出生那个月没过的天数,加上现在这个月已过的天数;
}
4、完整解法代码
#include
using namespace std;
int wishAge;
int daynum, leaveDaymun = 0, temp;
int m[] = { 31,28,31,30,31,30,31,31,30,31,30,31 }; //存放平年各月份天数的数组;
int n[] = { 31,29,31,30,31,30,31,31,30,31,30,31 }; //存放闰年各月份天数的数组;
bool check(int a, int b, int c) //判断输入的年月日是否合法;
{
if (a < 1900 || a>2100 || b < 1 || b>12 || c < 1 || c>31) //数据的边界值;
return false;
else
return true;
}
bool leapYear(int a) //判断是否为闰年;
{
if ((a % 4 == 0 && a % 100 != 0) || a % 400 == 0) //闰年的条件;
return true;
else
return false;
}
void countLiveday(int a, int b, int c, int a1, int b1, int c1)
{
daynum = 0; //变量的初始化,否则每次调用函数,daynum的值就会继续累加,计算错误!!!
int t1 = a, t2 = a1;
for (; a1 < a; a1++) //计算年天数;
{
if (leapYear(a1) == 1)
daynum += 366; //闰年天数;
else
daynum += 365; //平年天数;
}
for (int i = 0; i < b1 - 1; i++) //计算出生前没过的月天数;
{
if (leapYear(t2) == 1)
daynum -= n[i]; //二月有29天;
else
daynum -= m[i]; //二月有28天;
}
for (int j = 0; j < b - 1; j++) //计算今年没算的天数;
{
if (leapYear(t1) == 1)
daynum += n[j]; //二月有29天
else
daynum += m[j]; //二月有28天;
}
daynum = daynum - c1 + c; //减去出生那个月没过的天数,加上现在这个月已过的天数;
}
int main()
{
int y1, y2, m1, m2, d1, d2;
cout << "下面输入的日期格式为yyyy mm dd" << endl;
cout << "请输入今天的日期:";
cin >> y1 >> m1 >> d1; //输入现在日期;
cout << "请输入你的出生日期:";
cin >> y2 >> m2 >> d2; //输入出生日期;
if (!check(y1, m1, d1) || !check(y2, m2, d2)) //日期合法性的判断;
{
cout << "输入日期不合理!!!";
}
else if (y1 < y2) //日期合法性的判断;
{
cout << "出生年月小于现在年月,输入错误!!!";
}
else
{
countLiveday(y1, m1, d1, y2, m2, d2); //日期输入正确,调用函数,计算已经活过的天数;
cout << "你已经活了" << daynum << "天。"; //输出天数daynum;
cout << endl;
cout << "请输入您的期望年龄( >你的真实年龄 ):";
cin >> wishAge; //输出期望年龄wishAge;
if (wishAge < y1 - y2) //期望年龄合法性判断;
{
cout << "输入的期望年龄不合理!!!";
}
else //当数据合法时;
{
temp = daynum; //保存上一步得到的daynum,因为再次调用函数时会被覆盖掉;
countLiveday(y2 + wishAge, m1, d1, y2, m2, d2); //计算从出生到期望年龄要活的总天数;
leaveDaymun = daynum - temp; //还要活的天数=要活的总天数-已经活的天数;
cout << "你还要活" << leaveDaymun << "天。" << endl;
}
}
return 0;
}
5、运行结果
测试用例
一个合理的日期:现在2020.03.26 出生日期:1997.10.19 希望活80岁;
一个不合理的日期:现在2020.03.26 出生日期:1997.10.32; 希望活-1岁;
一个边界日期:现在2100.12.31 出生日期:1900.01.01;
运行环境:VC++ 6.0
运行环境:VC++ 6.0
运行环境:VC++ 6.0
至此,整个题目解答完毕!!!
结语:以上就是我对这个问题的理解、解法,可能存在着更好、更简洁的解法代码,希望大家提出来,我们一起讨论,交换看法,共同进步。若上述代码中存在问题,望大家指正,谢谢大家看到结尾。(∩^∩)
奋斗的2351