#include #include #include int Leap (int year) //判断闰年 { return (year%4==0&&year%100!=0)||(year%400==0); } int Kimlareson(int year, int month, int day) { if (month<3) //1,2月要当做去年的13,14月算 { month+=12; year-=1; } int K = year % 100; int J = year / 100; if (year<1582||(year==1582&&(month<10||(month==10&&day<=4))))//1582年10月4日及之前 { return (day+(13*(month+1))/5+K+K/4+5-J)%7; } else //1582年10月15日及之后 { return (day+(13*(month+1))/5+K+K/4+J/4+5*J)%7; } } int daysinmonth(int year,int month) { switch(month) { case 2: return Leap(year)?29:28; //判断2月天数 case 4: case 6: case 9: case 11: return 30; default: return 31; } } void print_month_calendar(int year,int month,int *start_day)//单个月的日历 { const char *months[]={"一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"}; printf("\n %d %s\n",year,months[month - 1]); printf("日 一 二 三 四 五 六\n"); int days_in_month=daysinmonth(year,month); for (int i=0;i<*start_day;i++) { printf(" "); } for (int day=1;day<=days_in_month;day++) { printf("%2d ",day); if ((*start_day+day)%7==0) { printf("\n"); } } printf("\n"); *start_day=(*start_day+days_in_month)%7; } void print_1582(int *start_day) //单独处理1582年10月这个怪胎(?) { printf("\n 十月 1582\n"); printf("日 一 二 三 四 五 六\n"); for (int i=0;i<*start_day;i++) { printf(" "); } // 打印1-4日 for (int day=1;day<=4;day++) { printf("%2d ",day); if ((*start_day+day-1)%7==6) { printf("\n"); } } int current_day=5; //跳过5-14日 for (int day=15;day<=31;day++) { if ((*start_day+current_day-1)%7==0) { printf("\n"); } printf("%2d ",day); current_day++; } printf("\n"); *start_day=(*start_day+21)%7; //1582年10月只有21天 } void print_calendar(int year) //打印单列日历 { int start_day=Kimlareson(year,1,1); for (int month=1;month<=12;month++) { if (year==1582&&month==10) { print_1582(&start_day); //处理1582年10月 } else { print_month_calendar(year,month,&start_day); } } } void print_calendar_double(int year) //打印双列整年日历 { int start_day[12]; start_day[0]=Kimlareson(year,1,1); for (int month=1;month<12;month++) //计算每月起始星期几 { start_day[month]=(start_day[month-1]+daysinmonth(year,month))%7; } const char *months[]={"一月", "二月", "三月", "四月", "五月", "六月","七月", "八月", "九月", "十月", "十一月", "十二月"}; for (int i = 0; i < 6; i++) //每行输出两个月 { printf("\n"); for (int j = 0; j < 2; j++) //两个月的标题 { int month = i * 2 + j + 1; printf(" %d %s ",year,months[month-1]); } printf("\n"); for (int j = 0; j < 2; j++) //星期标题 { printf("日 一 二 三 四 五 六 "); } printf("\n"); int max_days[2] = { daysinmonth(year, i * 2 + 1), daysinmonth(year, i * 2 + 2) };//获取两个月的最大天数和起始星期几 int start_days[2] = { start_day[i * 2], start_day[i * 2 + 1] }; //打印日期 int day[2] = {1, 1}; //每个月的当前日期 int printed_anything = 1; //标记是否有剩余日期可打印 while (printed_anything) { printed_anything = 0; for (int j = 0; j < 2; j++) { if (day[j] == 1) //打印月初的空格 { for (int k = 0; k < start_days[j]; k++) { printf(" "); } } while (day[j] <= max_days[j] && ((day[j] + start_days[j] - 1) % 7) != 6)//打印日期 { printf("%2d ",day[j]++); printed_anything=1; } if (day[j] <= max_days[j])//打印最后一个日期,换行并跳到下一个月 { printf("%2d ",day[j]++); printed_anything=1; } else { printf(" "); //填充空格保持对齐 } printf(" "); //每月之间的间隔 } printf("\n"); //换行到下一个星期 } } } int main() { SetConsoleOutputCP(65001); int x; for(;x!=4;) { printf(" menu\n"); printf("[1]判断是否闰年\n"); printf("[2]输出该年份的日历\n"); printf("[3]求这一天是星期几\n"); printf("[4]退出\n"); scanf("%d",&x); if(x==1) { int y,x; printf("请输入年份:"); scanf("%d",&y); if (y<0) { printf("你确定你输的是对吗?\n"); } else if(y>=10000) { printf("%d...你不觉得太过久远了吗?\n",y); } else { x=Leap(y); if(x==1) printf("是闰年\n"); else printf("不是闰年\n"); } } else if(x==2) { int y,x; printf("请输入年份:"); scanf("%d",&y); if (y<0) { printf("你确定你输的是对吗?\n"); } else if(y>=10000) { printf("%d...你不觉得太过久远了吗?\n",y); } else { printf("请选择单列或双列输出(1.单列 2.双列):"); scanf("%d",&x); if(x==1) { print_calendar(y); } else if(x==2) { print_calendar_double(y); } else { printf("啧...我觉得我说的很明显了呢...\n"); } } } else if(x==3) { int year, month, day; printf("请输入日期(年 月 日):"); scanf("%d %d %d", &year, &month, &day); if(year<0||month<=0||day<=0) { printf("你是认真的吗?\n"); } else if(year>=10000) { printf("%d...你不觉得太过久远了吗?\n",year); } else if(month>=13||day<=0||day>31) { printf("你是认真的吗?\n"); } else if((month==2&&Leap(year)&&day>29)||(month==2&&Leap(year)==0&&day>28)) { printf("你是认真的吗?\n"); } else if(year==1582&&month==10&&day>4&&day<15) { printf("这一天已经被教皇大人吃掉了www\n"); } else { int weekday=Kimlareson(year, month, day); const char *weekdays[] = {"星期六","星期日","星期一","星期二","星期三","星期四","星期五"}; printf("%d年%d月%d日是:%s\n",year,month,day,weekdays[weekday]); } } else if(x==4) exit(0); else if(x==99) printf("你先生,何时来的?\n是要时停扫地偷胖次吗?\n"); else { printf("请不要开玩笑了,我没有这个功能哦\n"); } } return 0; }