UIT2024_Calendar/stu2024/数技2401赵仔航.c
2024-12-07 16:23:34 +08:00

315 lines
7.9 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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;
}