日历和日期-算法
文章目錄
- 1.給定出生年月日及現在年月日,計算天數
- 2.指定年月日距離1990年1月1日的天數及小時
- 3.計算某年某月某日是本年度第幾天
- 4.給出年月日,計算該日是星期幾
- 5.給出年份,計算元旦那天是星期幾
- 總結
1.給定出生年月日及現在年月日,計算天數
思想:
計算由兩部分組成
1.現在年到出生年是幾年,并算出這些年的天數之和
2.現在月日距出生月日的天數
完整代碼:
#include <stdio.h> int main() {int sum_day(int, int); //? int leap(int year);int year1, month1, day1, days1;int year, month, day, days, j, dayss = 0;printf("請輸入出生年月日: \n");scanf("%d, %d, %d", &year1, &month1, &day1);printf("請輸入現在的年月日: \n"); scanf("%d, %d, %d", &year, &month, &day);days1 = sum_day(month1, day1);//是閏年則月份大于3即包括了2月,閏年2月多一天,所以+1 if(leap(year1) && (month1>=3)) //出生月日總天數 days1 = days1 + 1;//月+日 days = sum_day(month, day); if(leap(year)&&month>=3) //現在月日總天數 {days = days + 1;} /*年 -> 天 */ if(year1>year)printf("輸入有誤");else if(year1==year){printf("\n");printf("總天數是%天\n", days-days1);printf("總小時數是%d時\n", 24*(days-days1));}else{ for(j=year1+1; j<=year-1; j++){if(leap(j)==1){dayss = dayss + 366 - days1;}else{dayss = dayss + days + 365 - days1;}}printf("總天數是%d天\n", dayss);printf("總小時數是%d時\n", 24*dayss); }return 0; } /*月+日 -> 天數 */ int sum_day(int month, int day) {int day_tab[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};int i;for(i=1; i<=month-1; i++)day += day_tab[i];return (day); } /*判斷是否為閏年 */ int leap(int year) {int leap;leap = (year%4==0 && year%100!=0) || year%400==0;//如果是閏年leap=1,反之為0 return(leap); }2.指定年月日距離1990年1月1日的天數及小時
思想同上
/* 指定年月日距離1990年1月1日的天數及小時 */ #include <stdio.h>//存儲年月日 typedef struct date{int year;int month;int day; }DATE;int countday(DATE); int runyear(int);int main() {DATE today;int totalday;printf("請輸入指定年月日: ");scanf("%d, %d, %d", &today.year, &today.month, &today.day);totalday = countday(today) - 1;printf("總天數是%d天\n", totalday);printf("總小時是%d時\n", 24*totalday);return 0;} //計算總天數+1 int countday(DATE currentday){//存儲每個月天數 ,2月默認值28天 int permonth[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};int totalday = 0, year, i;//年->天數 for(year=1990; year<currentday.year; year++){if(runyear(year)) //是閏年的話,一年就是366天 totalday = totalday + 366;elsetotalday = totalday +365;}//如果是閏年的話,2月就是29天 if(runyear(currentday.year))permonth[2] += 1;//月->天數 for(i=0; i<currentday.month; i++){totalday += permonth[i];}//(年+月)+日 totalday += currentday.day;return(totalday);}//判斷是否為閏年 int runyear(int year){if((year%4==0&&year%100!=0)||(year%400==0))return 1;elsereturn 0;}3.計算某年某月某日是本年度第幾天
/* 計算某年某月某日是本年度第幾天 */ #include <stdio.h> int main() {int sum_day(int, int);int leap(int year);int year, month, day, days;printf("\n");printf("請輸入所求日期: \n");scanf("%d, %d, %d", &year, &month, &day);printf("%d, %d, %d", year, month, day);days = sum_day(month, day);if(leap(year)&&month>=3){days = days + 1;}printf("是本年度第%d天\n", days);return 0;} int sum_day(int month, int day) {int day_tab[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};int i;for(i=1; i<=month-1; i++){day += day_tab[i]; } return(day); }int leap(int year) {int leap;leap = (year%4==0 && year%100!=0) || year%400 == 0;return(leap); }4.給出年月日,計算該日是星期幾
/* 計算某年某月某日是星期幾 */ #include <stdio.h> int main() {int a, b, c, d, s, z;printf("請輸入年月日: \n");scanf("%d, %d, %d", &a, &b, &c);if((a%4==0&&a%100!=0) || (a%400==0)){if(b==1)d = c;if(b==2)d = c + 31;if(b==3)d = c + 60;if(b==4)d = c + 91;if(b==5)d = c + 121;if(b==6)d = c + 152;if(b==7)d = c + 182;if(b==8)d = c + 213;if(b==9)d = c + 244;if(b==10)d = c + 274;if(b==11)d = c + 305;if(b==12)d = c + 335;}else{if(b==1)d = c;if(b==2)d = c + 31;if(b==3)d = c + 59;if(b==4)d = c + 90;if(b==5)d = c + 120;if(b==6)d = c + 151;if(b==7)d = c + 181;if(b==8)d = c + 212;if(b==9)d = c + 243;if(b==10)d = c + 273;if(b==11)d = c + 304;if(b==12)d = c + 334;}s = a - 1 + (a - 1) / 4 - (a - 1) / 100+ (a - 1) / 400 + d;z = s % 7; if(z==0)printf("%d年%d月%d日這天是星期天\n", a, b, c);if(z==1) printf("%d年%d月%d日這天是星期一\n", a, b, c);if(z==2)printf("%d年%d月%d日這天是星期二\n", a, b, c);if(z==3)printf("%d年%d月%d日這天是星期三\n", a, b, c);if(z==4)printf("%d年%d月%d日這天是星期四\n", a, b, c);if(z==5)printf("%d年%d月%d日這天是星期五\n", a, b, c);if(z==6)printf("%d年%d月%d日這天是星期六\n", a, b, c);return 0; }5.給出年份,計算元旦那天是星期幾
/* 給出年份,計算元旦那天是星期幾 */ #include <stdio.h> int main() {int a, s, z;printf("請輸入年份:\n");scanf("%d", &a);s = a + (a - 1) / 4 - (a - 1) / 100+ (a - 1) / 400;z = s % 7; if(z==0)printf("元旦這一天是星期天\n");if(z==1) printf("元旦這一天是星期一\n");if(z==2)printf("元旦這一天是星期二\n");if(z==3)printf("元旦這一天是星期三\n");if(z==4)printf("元旦這一天是星期四\n");if(z==5)printf("元旦這一天是星期五\n");if(z==6)printf("元旦這一天是星期六\n");return 0;}總結
主要模塊
1.判斷是否為閏年
int leap(int year) {int leap;leap = (year%4==0 && year%100!=0) || year%400==0;//如果是閏年leap=1,反之為0 return(leap); }2.計算從現在月日距出生月日的天數
/*月+日 -> 天數 */ int sum_day(int month, int day) {int day_tab[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};int i;for(i=1; i<=month-1; i++)day += day_tab[i];return (day); }3.現在年到出生年是幾年,并算出這些年的天數之和
/*年 -> 天 */ if(year1>year)printf("輸入有誤");else if(year1==year){printf("\n");printf("總天數是%天\n", days-days1);printf("總小時數是%d時\n", 24*(days-days1));}else{ for(j=year1+1; j<=year-1; j++){if(leap(j)==1){dayss = dayss + 366 - days1;}else{dayss = dayss + days + 365 - days1;} }printf("總天數是%d天\n", dayss);printf("總小時數是%d時\n", 24*dayss); } return 0; }4、對于閏年、平年的總天數處理
方式一:先給二月份一個默認值,最后在計算的總天數中+1即可
方式二:修改月份
//計算總天數+1 int countday(DATE currentday){//存儲每個月天數 ,2月默認值28天 int permonth[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};int totalday = 0, year, i;//年->天數 for(year=1990; year<currentday.year; year++){if(runyear(year)) //是閏年的話,一年就是366天 totalday = totalday + 366;elsetotalday = totalday +365;}//如果是閏年的話,2月就是29天 if(runyear(currentday.year))permonth[2] += 1;//月->天數 for(i=0; i<currentday.month; i++){totalday += permonth[i];}//(年+月)+日 totalday += currentday.day;return(totalday);}總結