媛們,來用代碼算一算在這個世界上活了多少天吧

前言:活了那麼久,想不想知道自己已經在這個世界上活了多少天了?本文就以小程序的形式解決這個問題,告誡大家人生苦短,請務必惜時如金。

為了提升小程序的用戶體驗,不讓用戶做過多的輸入,我們引入C語言中的這個頭文件,讓程序自動讀取本機時間,用戶只需要輸入自己的生日,即可獲悉自己的存活天數。

首先介紹一下的部分用法:

與日期和時間相關的數據結構

#ifndef _TM_DEFINED 
struct tm {
int tm_sec; /* 秒 – 取值區間為[0,59] */
int tm_min; /* 分 - 取值區間為[0,59] */
int tm_hour; /* 時 - 取值區間為[0,23] */
int tm_mday; /* 一個月中的日期 - 取值區間為[1,31] */
int tm_mon; /* 月份(從一月開始,0代表一月) - 取值區間為[0,11] */
int tm_year; /* 年份,其值等於實際年份減去1900 */
int tm_wday; /* 星期 – 取值區間為[0,6],其中0代表星期天,1代表星期一,以此類推 */
int tm_yday; /* 從每年的1月1日開始的天數 – 取值區間為[0,365],其中0代表1月1日,1代表1月2日,以此類推 */
int tm_isdst; /* 夏令時標識符,實行夏令時的時候,tm_isdst為正。不實行夏令時的進候,tm_isdst為0;不瞭解情況時,tm_isdst()為負。*/

};
#define _TM_DEFINED
#endif

由此可知,tm是一個結構體,裡面的一系列成員即是與本機時間相關的參數。需要注意的是,tm_year並不是實際的公元紀年,tm_year+1900才是實際的公元紀年,tm_mon也不是實際的月份,tm_mon+1才是實際的月份。例如,今天是2018年8月13日,tm_year的實際值是118,tm_mon的實際值是7。

下面我們嘗試打印一下本機時間,裡面的部分代碼是獲取本機時間的固定形式。

#include 
#include
int main()
{
struct tm *local;
time_t t;
t=time(NULL);
local=localtime(&t);
printf("現在的時間是:%d年%d月%d日%d時%d分%d秒\n",local->tm_year+1900,local->tm_mon+1,local->tm_mday,local->tm_hour,local->tm_min,local->tm_sec);
return 0;
}
各位程序猿/媛們,來用代碼算一算在這個世界上活了多少天吧


下面進入核心算法部分:

整個小程序雖然只有一行輸入和一行輸入,裡面設計的內容卻複雜的很。需要涉及閏年的問題,(year%4==0&&year%100!=0||year%400==0)為真的即為閏年,閏年的2月有29天。

上代碼:

#include 
#include
#include
typedef struct Date
{
int year;
int month;
int day;
}date;
void main()
{
int i;
int T;
int dert_year=0;
int dert=0;
//x[0]為生日 x[1]為本機時間
date x[2];
//獲取本機時間
struct tm *local;
time_t t;
t=time(NULL);
local=localtime(&t);
x[1].year=local->tm_year+1900;
x[1].month=local->tm_mon+1;

x[1].day=local->tm_mday;
//正常年份12個月的天數
int months_normal[12]={31,28,31,30,31,30,31,31,30,31,30,31};
//閏年12個月的天數
int months_run[12]={31,29,31,30,31,30,31,31,30,31,30,31};
//輸入
printf("請輸入您的生日:");
scanf("%d%d%d",&x[0].year,&x[0].month,&x[0].day);
//檢查輸入 只是粗略檢查 並沒有考慮具體月份的情況
if(!(x[0].month>=1&&x[0].month<=12&&x[0].day>=1&&x[0].day<=31))
{
printf("您的輸入有誤!\n");
exit(0);
}
/************************中間天數****************************/
if(x[0].year{
dert_year=x[1].year-(x[0].year+1);
T=x[0].year;
for(i=0;i{
if((T+1)%4==0&&(T+1)%100!=0||(T+1)%400==0)
dert+=366;
else
dert+=365;
T++;
}
/************************後向天數****************************/
if(x[1].year%4==0&&x[1].year%100!=0||x[1].year%400==0)
for(i=0;i{
dert+=months_run[i];
}
else
for(i=0;i{
dert+=months_normal[i];
}
dert+=x[1].day;
/************************前向天數****************************/
if(x[0].year%4==0&&x[0].year%100!=0||x[0].year%400==0)
for(i=x[0].month;i<12;i++)
{
dert+=months_run[i];

}
else
for(i=x[0].month;i<12;i++)
{
dert+=months_normal[i];
}
if(x[0].year%4==0&&x[0].year%100!=0||x[0].year%400==0)
dert+=months_run[x[0].month-1]-x[0].day;
else
dert+=months_normal[x[0].month-1]-x[0].day;
}
else
{
if(x[0].month{
if(x[0].year%4==0&&x[0].year%100!=0||x[0].year%400==0)
{
for(i=x[0].month;idert+=months_run[i];
}
else
{
for(i=x[0].month;idert+=months_normal[i];
dert+=x[1].day;
dert+=months_normal[x[0].month-1]-x[0].day;
}
}
else
dert=x[1].day-x[0].day;
}
//輸出結果
printf("您在這個世界上已經活了%d天!\n問問自己,有多少天白活了?\n",dert);
}

為了體現整個思路的流暢性,我幾乎將所有的代碼都放到了主函數中,請大家見諒。

由上述代碼可知,我將天數的計算分成了三部分,一部分是前向天數,一部分是中間天數,一部分是後向天數。所謂的前向天數是指出生日期當年剩餘的天數,例如出生日期為1999年6月18日,則前項天數為自1999年6月19日0時起至1999年12月31日24時止的總天數;後向天數是指本機日期當年已經經過的天數;例如本機時間為2018年8月13日,則後向天數為自2018年1月1日0時起至2018年8月13日24時止的總天數。而中間天數是指間隔年的所有天數,舉個例子,1998年3月2日和2000年6月18日,間隔年就是1999年這一整年;若是1998年3月2日和1999年6月18日,則沒有間隔年,只有前向天數和後向天數。間隔年若為閏年則天數加上366,間隔年若為正常年份則天數加上365。此外,在前向天數和後向天數的計算中,也要注意考慮閏年和正常年份,以及2月這個特殊的月份。

最後為大家展示一下實驗結果:

各位程序猿/媛們,來用代碼算一算在這個世界上活了多少天吧


人生不過三萬天,你有多少的時間虛度了,又有多少的時間用來敲了代碼,又有多少的時間陪了家人和朋友。希望各位程序猿/媛們可以拿出更多的時間做更有意義的事。共勉。


分享到:


相關文章: