1. 程式人生 > >各位程式猿/媛們,來用程式碼算一算在這個世界上活了多少天吧

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

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

為了提升小程式的使用者體驗,不讓使用者做過多的輸入,我們引入C語言中的<time.h>這個標頭檔案,讓程式自動讀取本機時間,使用者只需要輸入自己的生日,即可獲悉自己的存活天數。

首先介紹一下<time.h>的部分用法:

與日期和時間相關的資料結構

#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 <stdio.h>
#include <time.h>
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 <stdio.h>
#include <stdlib.h>
#include <time.h>
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<x[1].year)
    {
        dert_year=x[1].year-(x[0].year+1);
        T=x[0].year;
        for(i=0;i<dert_year;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<x[1].month;i++)
            {
                dert+=months_run[i];
            }
        else
            for(i=0;i<x[1].month-1;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<x[1].month)
       {
           if(x[0].year%4==0&&x[0].year%100!=0||x[0].year%400==0)
           {
               for(i=x[0].month;i<x[1].month-1;i++)
                    dert+=months_run[i];
           }
           else
           {
               for(i=x[0].month;i<x[1].month-1;i++)
                dert+=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月這個特殊的月份。

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

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

大家如果有什麼疑問歡迎email我。

email:[email protected]

相關推薦

各位程式/程式碼這個世界多少

前言:活了那麼久,想不想知道自己已經在這個世界上活了多少天了?本文就以小程式的形式解決這個問題,告誡大家人生苦短,請務必惜時如金。 為了提升小程式的使用者體驗,不讓使用者做過多的輸入,我們引入C語言中的<time.h>這個標頭檔案,讓程式自動讀取本機時間,使

禿頂真是男程式標配而滿臉痘是女程式的標配嗎?

從事軟體開發多年,主要在嵌入式領域,對瀏覽器核心,安卓框架層面研究的比較多,最近因為業務工作需要研究後臺,程式設計師這個職業是高度的腦力勞動,幾乎天天都盯在電腦螢幕上,經歷過幾家公司,認識的同事差不多也有幾百個了,絕大部分頭髮還是完好無損的,當然也有個別的禿頂特別厲害,禿頂主要分為區域性禿頂和全禿頂

「1024」程式設計師節一句話證明你是程式設計師

點選上方藍色字型【學習web前端】可【快速關注】1024程式設計師節,你收到公司的節日放假通知了

程式 和它 她 的雙肩包

                     一天,下班後去藥店買某一洗髮水。可能是一位姓黃的藥師肯定的多:你們幹IT的就是願意起頭皮削。當時蒙了,便問道:您怎麼知道我的職業呢? 這位藥師蛋蛋的說:背雙肩包的肯定是幹IT的。心裡無數只羊駝飄過。不知道是喜還是悲,是被人的認同還是被人的嘲笑。事後,冷靜了一下,上班的

程式會營銷餓死營銷人員

這段時間做推廣,說實話,並不是我所擅長。雖然團隊有人會專門負責推廣,但我都不大會評斷他們做的好與不好,微信裡關注一大批做運營推廣的號,也混在微信群裡面學習。近日,看見一國外大牛的文章,很激動找到很多興奮點,只是讀到工程師,想起被叫碼農的那段苦逼歲月。我喜歡做工程

程式的驕傲以及驕傲背後真實的原因。

引言   程式猿,這個字彙在近幾年開始漸漸被大眾所熟知。在外界看來,這一直是個特殊的群體,社會上也給程式猿貼了很多的標籤,內向、屌絲、苦逼、褲衩、拖鞋等等。在他們的心中,程式猿是這樣的。          同時,程式猿也被認為是很缺異性的,相信你一定見到過下面這種場景。  

當親戚問你工資程式如何作答簡直不能再機智

故事的發生是這樣的。。。。有一次,我去同學家吃飯。他有個親戚從老家來看病,住在他家。同學管親戚喊

十四.nginxweb反向代理調加權輪詢nfs服務

文件夾 是否 觀察 查看 方式 har sys 重新啟動 chm 一.部署nginx反向代理web服務,調度算法使用加權輪詢: 1.首先配置一個nginx服務端,三個web客戶端。用vmware 新建虛擬機完成,並用xshell連接 2.在服務端和3個web客戶端都下載e

個稅起徵點上調至5000Python少交多少稅

今天出了一個重磅訊息,個稅起徵點從3500上調到5000啦! 廣大IT農民工的生活壓力又減輕了一些,有沒有 晚上加一個雞腿,要不要~ 開心歸開心,我們來用Python算一算,新的規則下,我們需要交多少稅,比原先少交多少稅。 下面的這張表是稅率表,這是對超過免徵額部分的收入徵收的稅率 這次調

SQL Server基礎() 工程我們VS 新建個數據庫還是新增或讀取已有的資料庫呢(SSMS 可管理資料庫)?

一、VS 建立資料庫 1、轉 https://jingyan.baidu.com/album/9f63fb91893ac3c8410f0e58.html?picindex=2 2、VS建立資料庫後,新增表時,要點選"更新"按鈕。資料表才會成功建立。 轉https://blog.

配置好fastfds和nginxeclipse程式碼傳圖片失敗

1、提示:timed out,22122 說明無法訪問22122的埠 有可能是虛擬機器網絡卡沒開,也有可能是虛擬機器22122埠未開啟。 兩個都開啟後還是不行。 我就想知道主機能不能訪問虛擬機器的22122埠。網上找到了用命令 telnet ip 埠    測試如下

程式設計師有KPI嘛?程式碼衡量KPI是種什麼感覺?

關於程式設計師的績效考核,一直存在很大的爭議! 傳說那是某年某月某天的一個下午,某大公司的HR開了一個會,研究討論加強績效考核的辦法,一種神奇的考核標準就誕生了! 對此,這是我看到過比較經典的形容了: “用程式碼行數來衡量程式設計的進度,就如同用重量來衡量飛

【人生很短做自己喜歡的事情罷。】人生是場旅程我們經歷幾次輪迴才換來這個旅程這個旅程很短因此不妨大膽一些不妨大膽一些去愛個人去攀座山去追一個夢······有很多事我都不明白但我相信件事上天讓我們來到這個世界上,就是為了讓我們創

人生是一場旅程,我們經歷了幾次輪迴,才換來這個旅程,而這個旅程很短,因此不妨大膽一些,不妨大膽一些去愛一個人,去攀一座山,去追一個夢······有很多事我都不明白,但我相信一件事,上天讓我們來到這個世...

Python崛起:“人生苦短Python”並非句戲言

這些年,程式語言的發展程序很快,在商業公司、開源社群兩股力量的共同推動下,湧現出諸如Go、Swift這類後起之秀,其中最為耀眼的是Python。 知名開發者網站Stackoverflow撰文指出,從2012至2017年程式語言Python成為開發者使用增長最快的主流程式語言

新手程式設計師?教你解決辦法!基礎都掌握動手敲程式碼臉懵逼

相信很多初學程式設計的朋友都有這樣的苦惱:為什麼我感覺自己基礎都掌握了,也看過很多視訊和資料了,但就是自己動手敲程式碼的時候就開始懵逼了! 通常新手程式設計師會以不同的方式來表達這個疑問,比如: “我通過線上課程學習了前端,但是我還是不知道怎麼用它來程式設計。” “我知道這個理論,可是怎麼把

人生很短做自己喜歡的事情罷。(人生是場旅程我們經歷幾次輪迴才換來這個旅程這個旅程很短因此不妨大膽一些不妨大膽一些去愛個人去攀座山去追一個夢······有很多事我都不明白但我相信件事上天讓我們來到這個世界上,就是為了讓我們創造

人生是一場旅程,我們經歷了幾次輪迴,才換來這個旅程,而這個旅程很短,因此不妨大膽一些,不妨大膽一些去愛一個人,去攀一座山,去追一個夢······有很多事我都不明白,但我相信一件事,上天讓我們來到這個世...

作為程式設計師的你除了擼程式碼還能幹什麼?

生活不止眼前的苟且,還有詩與遠方。 外界傳聞“程式猿”只會敲程式碼,以至於人們常常將在 IT 公司工作的人認知為單一物種。然而對於真正身處其中的我們,真實的感受到: 生活彷彿墜入無盡的迴圈; 996 的工作制形同虛設; 以及節假日隨時候命……

做一個合格的程式之淺析Spring IoC原始碼(十)Spring refresh()方法解析後記1

上次分析refresh這塊spring IoC的時候,時間比較倉促,只是debug了部分原始碼,大家分析起來不是很好~ 今天我們還是先總結一下吧~ spring在例項化bean的時候,根據bean

做一個合格的程式之淺析Spring IoC原始碼(十)Spring refresh()方法解析之一

經過上面幾節的簡單介紹我們瞭解了spring的一些元件,現在我們來分析一下AbstractApplicationContext中的refresh()這個核心方法吧~ 用我們上一節的程式碼,debug進入refresh方法: public void refresh() th

Android 按下home鍵程式在後臺執行在launcher裡面再點選icon又重新啟動

在有些手機上會出現如題問題,可以在根activityd onCreate方法 super.onCreate(savedInstanceState); if (!isTaskRoot()) { finish();