C語言日期函數,日期處理常式

2020-07-16 10:04:32
定義一個表示日期的結構體型別,再分別定義函數完成下列功能:計算某一天是對應年的第幾天,這一年一共多少天;計算兩個日期之間相隔的天數。兩個日期由鍵盤輸入。

演算法思想

設定結構體型別表示日期型別名為 Date,利用 typedef 將其定義為日期型型別名,有三個整型型別的成員分別表示年、月、日。

設定函數計算輸入的日期是這一年的第幾天。函數的形參為日期型變數,函數體中設定整型陣列存放每個月的天數,二月份的天數為 28 天;設定函數判斷年份是否為閏年以決定二月份的天數。根據輸入的日期月份,在陣列中將相應的月份天數求和,假日曰期即為天數。

設定函數完成兩個日期的比較,比較形參 d 和 s 兩個日期的大小。首先比較年,同年的比較月,同月的比較日。變數 start 儲存輸入的小的日期年份,end 儲存輸入日期大的年份,然後計算兩個日期之間的天數。

程式由 6 個函數構成,yearday() 函數計算某年的天數,monthday() 函數計算某年二月份的天數,dayofyeaK() 函數計算某日期是某年的第幾天,cmpdate() 函數比較兩個日期的大小,interday() 函數計算兩個日期之間的天數;dayofyear() 函數呼叫 monthday() 函數,interday() 函數呼叫 cmpdate() 函數、yearday() 函數、dayofyear() 函數;主函數呼叫 yearday() 函數、dayofyear() 函數、interday() 函數。

程式程式碼

#include <stdio.h>
#include <math.h>
typedef struct
{
    int year,month,day;
}Date;

int yearday(int year)
{
    int yday;
    if(year%4==0&&year%100!=0||year%400==0)
        yday=366;
    else
        yday=365;
    return yday;
}

int monthday(int year)
{
    int mday;
    if(year%4==0&&year%100!=0||year%400==0)
        mday=29;
    else
        mday=28;
    return mday;
}

int dayofyear(Date d)
{
    int i,total=0;
    int months[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
    months[2]=monthday(d.year);
    for(i=1;i<d.month;i++)
        total=total+months[i];
    total=total+d.day;
    return total;
}

int cmpdate(Date d,Date s)
{
    int result;
    if(d.year==s.year)
    {
        if(d.month==s.month)
        {
            if(d.day==s.day)
            result=0;
            else result=d.day-s.day;
        }
        else result=d.month-s.month;
    }
    else result=d.year-s.year;
    return result;
}

int interday(Date d,Date s)
{
    int result,te,ts,total;
    int year,start,end,day;
    int i;
    result=cmpdate(d,s);
    if(result>0)
    {
        start=s.year;
        end=d.year;
        te=dayofyear(d);
        ts=dayofyear(s);
    }
    else if(result<0)
    {
        start=d.year;
        end=s.year;
        ts=dayofyear(d);
        te=dayofyear(s);
    }
    else return 0;
    if(start==end)
        return abs(te-ts);
    else
    {
        total=0;
        for(i=start;i<=end;i++)
        {
            day=yearday(i);
            if(i==start)
                total=total+day-ts;
            else if(i==end)
                total=total+te;
            else
                total=total+day;
        }
    }
    return total;
}

int main()
{
    Date d1,d2;
    int y,n;
    printf("input date:");
    scanf("%d%d%d",&d1.year,&d1.month,&d1.day);
    scanf("%d%d%d",&d2.year,&d2.month,&d2.day);
    y=yearday(d1.year);
    n=dayofyear(d1);
    printf("%d days %dn",d1.year,y);
    printf("%d-%d-%d is the %d day.n",d1.year,d1.month,d1.day,n);
    n=interday(d1,d2);
    printf("%d-%d-%d and %d-%d-%d distance ",d1.year,d1.month,d1.day,d2.year,d2.month,d2.day);
    printf("%d daysn",n);
    return 0;
}

偵錯執行結果

輸入 2009 年 2 月 1 日和 2015 年 2 月 1 日,程式執行結果如下所示:

input date:2009 2 1 2015 2 1
2009 days 365
2009-2-1 is the 32 day.
2009-2-1 and 2015-2-1 distance 2191 days

總結

結構體變數作為函數引數可以有以下兩種形式。

① 結構體變數的成員作為函數的實參,則對應定義函數的形參為普通變數或陣列。如範例程式程式碼中的“y=yearday(d1.year);”“months[2]=monthday(d.year);”兩條語句,呼叫函數的實參分別為結構體變數 d1 和 d 的成員 year;對應的被呼叫函數 yearday()、monthday() 的形參都為 int year,是普通的整型變數。

② 函數的實參為結構體變數,則對應函數的形參應該也是結構體變數,其傳遞方式和普通變數一樣,採用的是值傳遞方式。如程式程式碼中的 dayofyear()、cmpdate() 和 interday() 函數的形參均為結構體 Date 的變數,在程式呼叫時實參也為結構體 Date 的變數。