315 lines
7.9 KiB
C
315 lines
7.9 KiB
C
#include <stdio.h>
|
||
#include <stdlib.h>
|
||
#include<windows.h>
|
||
|
||
|
||
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;
|
||
} |