年齡天數的計算(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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章