C语言编写万年历小程序

来源:互联网 发布:mac用u盘装系统 编辑:程序博客网 时间:2024/06/02 04:21

该程序简单地输入一个年份(1901年之后的年份),随后程序输出该年份十二个月的日历。

#include<stdio.h>#define  Mon     1#define  Tues    2#define  Wed     3#define  Thur    4#define  Fri     5#define  Sat     6#define  Sun     0#define  January_days      31#define  February_days     28#define  March_days        31#define  April_days        30#define  May_days          31#define  June_days         30#define  July_days         31#define  August_days       31#define  September_days    30#define  October_days      31#define  November_days     30#define  December_days     31#define first1month  January_days#define first2month  January_days+February_days#define first3month  January_days+February_days+March_days#define first4month  January_days+February_days+March_days+April_days#define first5month  January_days+February_days+March_days+April_days+May_days#define first6month  January_days+February_days+March_days+April_days+May_days+June_days#define first7month  January_days+February_days+March_days+April_days+May_days+June_days \                 +July_days#define first8month  January_days+February_days+March_days+April_days+May_days+June_days \                 +July_days+August_days#define first9month  January_days+February_days+March_days+April_days+May_days+June_days \                 +July_days+August_days+September_days#define first10month  January_days+February_days+March_days+April_days+May_days+June_days \                 +July_days+August_days+September_days+October_days#define first11month  January_days+February_days+March_days+April_days+May_days+June_days \                 +July_days+August_days+September_days+October_days+November_daysint known_weekday = Tues;int known_year = 1901;int konwn_month = 1;int known_day = 1;int day_count(int month){switch(month){case 1: return 0;break;case 2: return first1month;break;case 3: return first2month;break;case 4: return first3month;break;case 5: return first4month;break;case 6: return first5month;break;case 7: return first6month;break;case 8: return first7month;break;case 9: return first8month;break;case 10: return first9month;break;case 11: return first10month;break;case 12: return first11month;break;}}/*char * month_name(int month){switch(month){case 1:return "January";break;case 2:return "February";break;case 3:return "March";break;case 4:return "April";break;case 5:return "May";break;case 6:return "June";break;case 7:return "July";break;case 8:return "August";break;case 9:return "September";break;case 10:return "October";break;case 11:return "November";break;case 12:return "December";break;default:break;}}*/char * month_name(int month){switch(month){case 1:return "一月";break;case 2:return "二月";break;case 3:return "三月";break;case 4:return "四月";break;case 5:return "五月";break;case 6:return "六月";break;case 7:return "七月";break;case 8:return "八月";break;case 9:return "九月";break;case 10:return "十月";break;case 11:return "十一月";break;case 12:return "十二月";break;default:break;}}/*按格式打印某年某月名称*/void first_line_print(int month, int year){//printf("%20s  %d  \n",month_name(month),year);printf("%8d年  %s  \n",year, month_name(month));}/*按格式打印星期名称*/void week_print(){//printf("%-6s%-6s%-6s%-6s%-6s%-6s%-6s\n","Sun.", "Mon.", "Tues.", "Wed.", "Thur.", "Fri.", "Sat.");printf("%-3s%-3s%-3s%-3s%-3s%-3s%-3s\n","日", "一", "二", "三", "四", "五", "六");}/*计算该年该月份与已知日子之间的距离天数*/int date_distance_count(int month, int year){int leap_year_count = 0;int i;int distance;if (year > known_year){for (i=known_year; i<year; i++){if(((i%4 == 0) && (i%100 != 0) ) || (i%400 == 0)){leap_year_count++;}}if (month > 2){if(((year%4 == 0) && (year%100 != 0) ) || (year%400 == 0)){leap_year_count++;}}}elseif (year == known_year){if (month > 2){leap_year_count = 1;}}distance = (year - known_year)*365 + leap_year_count + day_count(month);return distance;}/*确定该月份第一天是星期几*/int makesure_firstday_weekday(int month, int year){int date_distance = 0;int weekday;date_distance = date_distance_count(month, year);weekday = (known_weekday + date_distance)%7;return weekday;}/*依次打印出该月份的日子*/void print_in_turn(int month, int firstday, int year){int i = 1;int weekday;switch(firstday){case Sun:break;case Mon:printf("%-3s","");break;case Tues:printf("%-6s","");break;case Wed:printf("%-9s","");break;case Thur:printf("%-12s","");break;case Fri:printf("%-15s","");break;case Sat:printf("%-18s","");break;}switch(month){case 1:case 3:case 5:case 7:case 8:case 10:case 12:{for(i=0; i<31; i++){weekday = (firstday + i)%7;printf("%-3d",i+1);if(weekday == Sat){printf("\n");}}break;}case 2:{if(((year%4 == 0) && (year%100 != 0) ) || (year%400 == 0)) /*闰年*/{for(i=0; i<29; i++){weekday = (firstday + i)%7;printf("%-3d",i+1);if(weekday == Sat){printf("\n");}}break;}else  /*平年*/{for(i=0; i<28; i++){weekday = (firstday + i)%7;printf("%-3d",i+1);if(weekday == Sat){printf("\n");}}break;}}case 4:case 6:case 9:case 11:{for(i=0; i<30; i++){weekday = (firstday + i)%7;/*计算该天是星期几*/printf("%-3d",i+1);if(weekday == Sat){printf("\n");/*如果是星期六,则换行*/}}break;}}}void date_print(int month, int year){int firstday;firstday = makesure_firstday_weekday(month, year);print_in_turn(month, firstday, year);printf("\n");}void main_month(int month, int year){first_line_print(month, year);week_print();date_print(month, year);printf("\n\n");}void main_calendar(int year){int i;for(i=1; i<=12; i++){main_month(i, year);}}int main(){int year;printf("请输入年份:year = ");scanf("%d",&year);printf("\n");while(year < 1902){printf("请输入大于1901的年份\n");printf("请输入年份:year = ");scanf("%d",&year);printf("\n");}main_calendar(year);scanf(" ");return 0;}

示例:


0 0