若是一個漁夫從 2011 年 1 月 1 日開始每三天打一次漁,兩天曬一次網,編程實現當輸入 2011 1 月 1 日之後的任意一天,輸出該漁夫是在打漁仍是在曬網。html
(1) 自定義函數 leap(),用來判斷輸入的年份是不是閏年。算法
(2) 自定義函數 number(),用來計算輸入日期距 2011 年 1 月 1 日共有多少天。編程
(3) main() 函數做爲程序的入口函數,在 main() 函數中調用上面兩個函數。程序代碼以下:數組
1 #include <stdio.h> 2 int leap(int a) /*自定義函數leap()用來指定輸入的年份是否爲閏年*/ 3 { 4 if (a%4==0&&a%100!=0||a%400==0) /* 閏年斷定條件 */ 5 return 1; /*是閏年返回1*/ 6 else 7 return 0; /*不是閏年返回O*/ 8 } 9 10 int number(int year,int month,int day) /*自定義函數 number() 計算輸入日期距2011年1月1日共有多少天*/ 11 { 12 int sum = 0, i, j, k; 13 int a[12]={31,28,31,30,31,30,31,31,30,31,30,31}; /*數組a存放平年每個月的天數*/ 14 int b[12]={31,29,31,30,31,30,31,31,30,31,30,31}; /*數組b存放閏年每個月的天數*/ 15 16 if(leap(year)==1) /*判斷是否爲閏年*/ 17 for(i=0;i<month-1;i++) 18 sum+=b[i]; /*是閏年,累加數組b前m-1個月份的天數*/ 19 else 20 for(i=0;i<month-1;i++) 21 sum+=a[i]; /*不是閏年,累加數組a前m-1個月份的天數*/ 22 for(j=2011;j<year;j++) 23 if (leap(j)==i) 24 sum+=366; /*2011年到輸入的年份是閏年的加366*/ 25 else 26 sum+=365; /*2011年到輸入的年份不是閏年的加365*/ 27 sum+=day; /*將前面累加的結果加上日期,求出總天數*/ 28 return sum; /*返回計算的天數*/ 29 } 30 31 int main() 32 { 33 int year,month,day,n; 34 printf("請輸入年月日\n"); 35 scanf("%d%d%d",&year,&month,&day); /*輸入年月日*/ 36 n=number(year,month,day); /*調用函數 number()*/ 37 if((n%5)<4&&(n%5)>0) /*餘數是1或2或3時說明在打漁,不然在曬網*/ 38 printf("%d:%d:%d 打魚\n",year,month,day); 39 else 40 printf("%d:%d:%d 曬網\n",year,month,day); 41 return 0; 42 }
運行結果:微信
請輸入年月日 2011 1 4 2011:1:4 曬網
本實例主要有如下兩個技術要點:函數
(1) 判斷輸入的年份(2011 年之後包括 2011 年)是否爲閏年,這裏自定義函數 leap() 來進行判斷。該函數的核心內容就是閏年的判斷條件即能被 4 整除但不能被 100 整除,或能被 400 整除。學習
(2) 求輸入日期距 2011 年 1 月 1 日有多少天。首先判斷 2011 年距輸入的年份有多少年,這其中有多少年是閏年就將 sum 加多少個 366,有多少年是平年便將 sum 加上多少個 365。spa
其次要將 12 個月每個月的天數存到數組中,由於閏年 2 月份的天數有別於平年,故採用兩個數組 a 和 b 分別存儲。若輸入年份是平年,月份爲 m 時就在前面累加日期的基礎上繼續累加存儲着平年每個月天數的數組的前 m-1 個元素,將累加結果加上輸入的日期便求出了最終結果。閏年的算法相似。code
感謝你的閱讀,請用心感悟!更多內容請關注微信公衆號:C語言自學網 ;但願能夠幫到愛學習的你!!分享也是一種快樂!!!請接力。。。htm