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