年龄天数的计算(C++)

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<iostream>
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

发布了12 篇原创文章 · 获赞 3 · 访问量 379

猜你喜欢

转载自blog.csdn.net/weixin_45620022/article/details/105137538