C語言日期函數,日期處理函數
定義一個表示日期的結構體類型,再分別定義函數完成下列功能:計算某一天是對應年的第幾天,這一年一共多少天;計算兩個日期之間相隔的天數。兩個日期由鍵盤輸入。
算法思想
設定結構體類型表示日期類型名為 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 %d\n",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 days\n",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 的變量。
- C語言漢諾塔問題,用C語言實現漢諾塔
- 漢諾塔問題是指:一塊板上有三根針 A、B、C。A 針上套有 64 個大小不等的圓盤,按照大的在下、小的在上的順序排列,要把這 64 個圓盤從
- 03-10 關注:0
- C語言日期函數,日期處理函數
- 定義一個表示日期的結構體類型,再分別定義函數完成下列功能:計算某一天是對應年的第幾天,這一年一共多少天;計算兩個日期之間相隔的
- 03-10 關注:0
- C語言三色旗問題
- 有一根繩子,上面有紅、白、藍三種顏色的旗子。
- 03-10 關注:0
- C語言整數逆序輸出
- 將一個從鍵盤輸入的整數存放到一個數組中,通過程序的運行按照數組中的逆序輸出該整數,利用遞歸的方法解決問題。
- 03-10 關注:0
- C語言約瑟夫環問題
- 編號為 1,2,3,…,n 的 n 個人圍坐一圈,任選一個正整數 m 作為報數上限值,從第一個人開始按順時針方向報數,報數到 m 時停止,報
- 03-10 關注:1
- C語言輸出等腰三角形
- 本實例要求從鍵盤輸入任意整數 n,通過程序運行輸出對應高度為 n 的等腰三角形。
- 03-10 關注:1