# include <math.h>
void printmonth(int m)
void printhead(int m)
int daysofmonth(int m)
int firstday(int y)
int year,weekday
void main()
{
int i
printf("请输入年份:")
scanf("%d",&year)
weekday=firstday(year)
printf("\n\n")
printf(" %d年\n",year)
for(i=1i<=12i++)
{
printmonth(i)
printf("\n")
}
printf("\n\n")
}
void printmonth(int m) //打印每月日历
{
int i,days
printhead(m)
days=daysofmonth(m)
for(i=1i<=daysi++)
{
printf("%5d",i)
weekday=(weekday+1)%7
if (weekday==0) printf("\n ")
}
}
void printhead(int m) //打印每月的日历头(判定起始位置)
{
int i
printf("\n%d月 日 一 二 三 四 五 六\n",m)
printf(" ")
for(i=0i<weekdayi++)
printf(" ")
}
int daysofmonth(int m) //每月的天数
{
switch (m)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:return 31
case 4:
case 6:
case 9:
case 11:return 30
case 2:if (((year%4==0 &&year%100!=0)||year%400==0))
return 29
else
return 28
default: return 0
}
}
int firstday(int y) //判断某年元旦是星期几
{
double s
s=floor(year-1+(year-1)/4.0-(year-1)/100.0+(year-1)/400.0+1)
return (int)s%7
}
/*稍微改了下对齐格式,加了注释
*/
/*
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
}
1、功能要求 :
1)输入任一年将显示出该年的所有月份日期,对应的星期
2)注意闰年情况
其显示格式要求如下:
1)份:中文英文都可以,
2)下一行显示星期,从周日到周六,中英文都可以
3)下一行开始显示日期从1号开始,并按其是周几实际情况与上面的星期数垂直对齐
2、例程:
#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} //每个月的天数,最后一个是闰年2月
printf("Please enter the year: ")
scanf("%d",&year) //输入年份
while(Year_Start < year) //计算从公元1年1月1日到你所查询年份前一年的天数,是为了以后确定这一年的第一天是星期几
{
if( IsLeapYear( Year_Start ) ) //确定一年的天数,闰年为366天,一般为365天
Per_Year_Days = 366
else
Per_Year_Days = 365
Year_days = Year_days + Per_Year_Days
Year_Start++
}
for( temp = 1 temp <=12 temp++ ) //循环输出每个月的日历
{
switch( temp )
{
case 1:
printf(" January(%d)\n",year) //如 January(2008)
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 //计算这个月第一天是星期几
printf("Mon Tue Wed Thu Fri Sat Sun\n")
if( i != 0 )
for( temp_i = 0 temp_i < i temp_i++) //第一天不是星期一,在前面补空格,本来的空格少了,我加了两个
printf(" ")
day = 1
if( IsLeapYear(year) && temp == 2) //闰年的2月
while( day <= month_day[12] )
{
if( day >1 )
if( Year_days % 7 == 0 ) //如果不是1号且昨天是星期天,输入回车, 换行
printf("\n")
if( day >= 10 ) //如果大于或等于10号则输出日期并加2个空格,小于10号输出日期并加3个空格
printf("%d ",day) //开始没想到这几行是干嘛用的,只要一个输出就好嘛,后来才想到是用来调整格式的
else //只是他并没有调整好,我做了下修改,现在很整齐了
printf("%d ",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 ",day)
else
printf("%d ",day)
Year_days++
day++
}
printf("\n")
if( getch() == 'q' ) //输入q退出程序
exit(0)
}
getch()
}
int IsLeapYear( int year ) //判断是否为闰年
{
if ((year %4 == 0) && (year % 100 != 0) || //年份能被4整除且不能被100整除 或者 能被400整除的为闰年
(year % 400 == 0) )
return 1
else
return 0
}