212 lines
2.8 KiB
C
212 lines
2.8 KiB
C
#include<stdio.h>
|
|
|
|
|
|
|
|
void printfMenu ()
|
|
{
|
|
printf("1.单列输出\n");
|
|
printf("2.双列输出\n");
|
|
}
|
|
//判断是否为闰年
|
|
int isLeapyear(int y)
|
|
{
|
|
if(y%4==0&&y%100!=0 || y%400==0)
|
|
return 1;
|
|
else
|
|
return 0;
|
|
}
|
|
//这个函数用于计算返回该月的天数
|
|
int daysInMonth(int y, int m)
|
|
{
|
|
switch(m){
|
|
case 1:
|
|
case 3:
|
|
case 5:
|
|
case 7:
|
|
case 8:
|
|
case 10:
|
|
{
|
|
if(y==1582)
|
|
{
|
|
days=21;
|
|
}
|
|
}
|
|
case 12:days = 31;break;
|
|
case 4:
|
|
case 6:
|
|
case 9:
|
|
case 11:days = 30;break;
|
|
case 2:{
|
|
if(((year%4) == 0) && ((year%100)!=0) || ((year%400) == 0)){
|
|
days = 29;
|
|
}else{
|
|
days = 28;
|
|
}
|
|
}
|
|
}
|
|
return days;
|
|
}
|
|
|
|
//判断指定日期是星期几
|
|
int dayOfWeek(int y, int m, int d)
|
|
{
|
|
if(y>1852 && m>10 && d>4)//1582.10.4之后
|
|
{
|
|
if (m < 3)
|
|
{
|
|
m += 12;
|
|
y--;
|
|
}
|
|
int h = (d + 2 * m + 3 * (m + 1) / 5 + y + y / 4 - y / 100 + y / 400) % 7;
|
|
return h + 1;
|
|
}
|
|
else
|
|
{
|
|
int K,J,h;
|
|
K=y%100;
|
|
J=y/100;
|
|
switch(m)
|
|
{
|
|
case 1:
|
|
m=3;
|
|
break;
|
|
case 2:
|
|
m=4;
|
|
break;
|
|
case 3:
|
|
m=5;
|
|
break;
|
|
case 4:
|
|
m=6;
|
|
break;
|
|
case 5:
|
|
m=7;
|
|
break;
|
|
case 6:
|
|
m=8;
|
|
break;
|
|
case 7:
|
|
m=9;
|
|
break;
|
|
case 8:
|
|
m=10;
|
|
break;
|
|
case 9:
|
|
m=11;
|
|
break;
|
|
case 10:
|
|
m=12;
|
|
break;
|
|
case 11:
|
|
m=13;
|
|
break;
|
|
case 12:
|
|
m=14;
|
|
break;
|
|
|
|
}
|
|
h=(d+(13*(m+1)/5)+K+K/4+5-J)%7;
|
|
switch(h)
|
|
{
|
|
case 0:
|
|
h=6;
|
|
break;
|
|
case 1:
|
|
h=7;
|
|
break;
|
|
case 2:
|
|
h=1;
|
|
break;
|
|
case 3:
|
|
h=2;
|
|
break;
|
|
case 4:
|
|
h=3;
|
|
break;
|
|
case 5:
|
|
h=4;
|
|
break;
|
|
case 6:
|
|
h=5;
|
|
break;
|
|
}
|
|
return h;
|
|
}
|
|
|
|
}
|
|
//显示指定年月的月历
|
|
void MonthCalendar(int y, int m, int d)
|
|
{
|
|
printf("日\t一\t二\t三\t四\t五\t六")//\t制表符
|
|
int ofday=DaysInMonth(y,m);//获取每个月有多少天
|
|
int first_day = dayOfWeek(y, m, 1); //获取每月1号是周几
|
|
int ofday = daysInMonth(y, m); //获取一个月有多少天
|
|
int count = first_day;
|
|
for (int i = 0; i <= ofday; i++)
|
|
{
|
|
//使日期能对齐对应的星期
|
|
if (i == 0)
|
|
{
|
|
for (int j = 0; j < count % 7; j++)
|
|
{
|
|
printf("\t");
|
|
}
|
|
}
|
|
else
|
|
{
|
|
printf("%2d\t", i);
|
|
count++;
|
|
}
|
|
|
|
//循环打印一周后换行
|
|
if (count % 7 == 0)
|
|
{
|
|
printf("\n");
|
|
}
|
|
}
|
|
printf("\n");
|
|
}
|
|
|
|
//这个函数用于显示指定年份 year 的全年日历
|
|
void YearCalendar(int y)
|
|
{
|
|
int i = 0;
|
|
for (i = 1; i <= 12; i++)
|
|
{
|
|
|
|
MonthCalendar(y, i, day);
|
|
printf("\n");
|
|
}
|
|
|
|
}
|
|
|
|
//这个函数用于验证给定的日期是否有效
|
|
int isTureDate(int y, int m, int day)
|
|
|
|
int main(void)
|
|
{
|
|
int y,m,d,a;
|
|
|
|
printf("1.查询对应年份的日历\n");
|
|
printf("2.查询对应日期的星期");
|
|
printf("3.查询对应年份是否为闰年\n");
|
|
printf("4.退出\n");
|
|
|
|
scanf("%d",&a);
|
|
switch(a)
|
|
case 1:
|
|
scanf("%d",&y);
|
|
YearCalendar(y);
|
|
case 2:
|
|
scanf("%d %d %d",&y,&m,&d);
|
|
dayOfWeek(y,m,d);
|
|
case 3:
|
|
scanf("%d",&y);
|
|
isLeapyear(y);
|
|
case 4:
|
|
default :
|
|
printf("输入错误请重新输入。")
|
|
|
|
|
|
}
|