main(){int
a,b,c,d,e,f,i,j,k,n,m,yearprintf("input
the
year:\n")
scanf("%d",&year)
//输入数据的初始化;b=yearc=year%4d=year/4e=d*1461+c*365f=e%7j=f
//初始化Year年的第一天的星期m=jprintf("***%d年的日历***\n",year)for(a=1a<=12a++)
//函数的主要部分,主要实现日历的打印部分
{
if(a==1||a==3||a==5||a==7||a==8||a==10||a==12)k=31
else
if(a==4||a==6||a==9||a==11)k=30
else
if((year%4==0&&year%100!=0)||(year%400==0))k=29
else
k=28
printf("%d月份\n
STAT
SUN
MON
TUE
WED
THUR
FRI\n",a)
m=j
if(m<=5)m=m+1
else
m=m-6
for(n=1n<=mn++)printf("
")
for(i=1i<=ki++,j++)
{if(j==7)j=0
if(i<10)printf("
%d",i)
else
printf("
%d",i)
if(j==5)printf("\n")
}
printf("\n\n\n")
}}
/*稍微改了下对齐格式,加了注释
*/
/*
1、闰年的算法:
如果某年能被4整除但不能被100整除,
或者能被400整除,
则该年是闰年.
用表达式表示就是
(year
%4
==
0
&&
year%100
!=
0)
||
(year%400
==
0)
2、计算某一天是星期几:
已知1900年的1月1号为星期一,
然后就可以用某一天和1900年的1月1号相差的天数对7取余来求星期,
本题是用的公元1年的1月1号作为基准
*/
#include
<stdio.h>
#include<conio.h>
#include<stdlib.h>
int
IsLeapYear(int)
//函数定义
void
main()
{
int
i
int
day
int
year
int
temp
int
temp_i
long
int
Year_days
=
0
int
Year_Start
=
1
int
Per_Year_Days
int
month_day[]={31,28,31,30,31,30,31,31,30,31,30,31,29}
printf("Please
enter
the
year:
")
scanf("%d",&year)
//输入年份
while(Year_Start
<
year)
//从公元1年开始执行while循环,
该年的一月一号为星期一
{
if(
IsLeapYear(
Year_Start
)
)
Per_Year_Days
=
366
//如果是闰年,
则一年有366天
else
Per_Year_Days
=
365
//如果不是闰年,
则一年有365天
Year_days
=
Year_days
+
Per_Year_Days
//Year_days为从公元1年到输入年份的前一年的天数的总和
Year_Start++
}
for(
temp
=
1
temp
<=12
temp++
)
//temp从1到12,
对应一年内12个月
{
switch(
temp
)
//用switch语句将temp和12个月对应起来
{
case
1:
printf("
January(%d)\n",year)
//一月
break
case
2:
printf("
February(%d)\n",year)
//二月
break
case
3:
printf("
March(%d)\n",year)
//三月
break
case
4:
printf("
April(%d)\n",year)
//四月
break
case
5:
printf("
May(%d)\n",year)
//五月
break
case
6:
printf("
June(%d)\n",year)
//六月
break
case
7:
printf("
July(%d)\n",year)
//七月
break
case
8:
printf("
August(%d)\n",year)
//八月
break
case
9:
printf("
September(%d)\n",year)
//九月
break
case
10:
printf("
October(%d)\n",year)
//十月
break
case
11:
printf("
November(%d)\n",year)
//十一月
break
case
12:
printf("
December(%d)\n",year)
//十二月
break
}
i
=
Year_days
%
7
//每个星期有7天,
故用每年的天数对7取余
printf("Mon\tTue\tWed\tThu\tFri\tSat\tSun\n")
if(
i
!=
0
)
//如果余数不为零
for(
temp_i
=
0
temp_i
<
i
temp_i++)
printf("\t")
//则打印空格(这里用\t代替空格,
更加美观),
空格数为i
day
=
1
//初始化day为1,
为下面的while循环做准备
if(
IsLeapYear(year)
&&
temp
==
2)
//如果输入的年份是闰年,
并且月份为2
while(
day
<=
month_day[12]
)
//day为一循环变量,
取值为1-365(闰年的话为1-366)
{
if(
day
>1
)
//如果天数大于一
if(
Year_days
%
7
==
0
)
//如果是星期日,
则换行
printf("\n")
if(
day
>=
10
)
printf("%d\t",day)
//打印天数+空格
else
printf("%d\t",day)
Year_days++
day++
}
else
//如果不满足"输入的年份是闰年,
并且月份为2"
while
(day
<=
month_day[temp-1])
{
if(
day
>
1
)
if(
Year_days
%
7
==
0
)
printf("\n")
if(
day
>=10
)
printf("%d\t",day)
else
printf("%d\t",day)
Year_days++
day++
}
printf("\n")
if(
getch()
==
'q'
)
//如果输入为q,
则退出程序
exit(0)
}
getch()
//每按一次键,
打印一个月份
}
int
IsLeapYear(
int
year
)
{
//判断是否是闰年,
是则返回1,
否则返回0
if
((year
%4
==
0)
&&
(year
%
100
!=
0)
||
(year
%
400
==
0)
)
return
1
else
return
0
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)