判断是否为闰年:
(year%4==0&&year%100!=0)||year%400==0)
计算闰年数
[(Y-1)/4] - [(Y-1)/100] + [(Y-1)/400] , [...]取整符号
计算某年第一天是星期几【法一】
ayas = y-1 + (y-1)/4 + (y-1)/400 - (y-1)/100 + D(D为所求那年剩余天数);ayas/7 的余数
反正挺麻烦的,直接记蔡勒公式叭
计算星期几
蔡勒(Zeller)公式。即w=y+[y/4]+[c/4]-2c+[26(m+1)/10]+d-1
w:星期;
c:世纪-1;
y:年份后两位;
m:月(m大于等于3,小于等于14,即在蔡勒公式中,某年的1、2月要看作上一年的13、14月来计算,比如2003年1月1日要看作2002年的13月1日来计算);
d:日;[ ]代表取整,即只要整数部分。
以2049年10月1日(100周年国庆)为例,用蔡勒(Zeller)公式进行计算,过程如下:
蔡勒(Zeller)公式:w=y+[y/4]+[c/4]-2c+[26(m+1)/10]+d-1
=49+[49/4]+[20/4]-2×20+[26× (10+1)/10]+1-1
=49+[12.25]+5-40+[28.6]
=49+12+5-40+28
=54 (除以7余5)
即2049年10月1日(100周年国庆)是星期5。
课本答案:利用字符串指针数组
#include<stdio.h>
#include<conio.h>
void calendar(int year,int mouth,int day,int fir_d);
void main()
{
//输入年份与月份
int year,month;
printf("Enter year & month:");
scanf("%d %d",&year,&month);
static char *months[]={"January","February","March",\
"April","May","June","July","August","Septrmber",\
"October","November","December"};
//处理平闰年2月天数不同
int days[12]={31,0,31,30,31,30,31,31,30,31,30,31};
if((year%4==0 && year%100!=0 )||(year%400==0)) days[1]=29;
else days[1]=28;
//蔡勒(Zeller)公式。即w=y+[y/4]+[c/4]-2c+[26(m+1)/10]+d-1 ;所求月份第一天是周几
int w,y,c,m;
if(month < 3) y=year-1;
else y=year;
c = y/100;
y = y%100;
m = month;
w = y + y/4 + c/4 - 2*c + 26*(m+1)/10;
int fir_d = w%7;
//输出日历头
printf("\t\t %s %d\n",months[month-1],year);
printf("---------------------------------------------------\n");
printf("Mon\tTue\tWed\tThu\tFri\tSat\tSun\t\n");
int day = days[month-1];
int i,j=1;
while(j<fir_d){
printf("\t");
j++;
}
for(i=1;i<=day;i++){
printf("%d\t",i);
if((i+fir_d-1)%7 == 0)
printf("\n");
}
}
输出某年的日历:
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
//获取某一个月的最大天数
int monthday(int,int );
//判断闰年 ,是返回1,不是返回0
int isleapyear(int );
int main()
{
int year,month,days,weekday;
int i,d;
printf("please input the year:\n");
scanf("%d",&year);
days = year-1+(year-1)/400+(year-1)/4-(year-1)/100;//计算某年第一天是星期几
for(month=1;month<=12;month++)
{
printf("\t\t****%d年--%d月****\n",year,month);
printf("sun\tmon\ttues\twed\tthur\tfir\tsat\t\n");//表头
i = 1; d = 1;
weekday = (days + 1)%7; //求星期几
while(i<=weekday) //输出前面的空格
{
printf("\t");
i++;
}
//
while(d<=monthday(month,year)) //输出一个月日期
{
weekday = (days + 1)%7;
if(weekday==6) //最后一个是星期六,输出之后要换行
printf("%d\n",d);
else //不是星期六的输出后不换行
printf("%d\t",d);
if(d==monthday(month,year)) //一个月天数输出结束
printf("\n");
d++;
days++;
}
}
}
int monthday(int month,int year)
{
switch(month)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
return 31;break;
case 4:
case 6:
case 9:
case 11:
return 30;break;
case 2:
if(isleapyear(year))
{
return 29;//闰年29天
break;
}
else
{
return 28;
break;
}
}
}
int isleapyear(int year)
{
if((year%4==0)&&(year%100!=0)||(year%400==0))
return 1;
else
return 0;
}
输出指定某年某月的日历:
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
//获取某一个月的最大天数
int monthday(int,int );
//判断闰年 ,是返回1,不是返回0
int isleapyear(int );
int main()
{
int year,month,days,weekday;
int i,d;
printf("please input the year:\n");
scanf("%d %d",&year,&month);
days = year-1+(year-1)/400+(year-1)/4-(year-1)/100;//计算某年第一天是星期几
printf("\t\t****%d年--%d月****\n",year,month);
printf("--------------------------------------------------\n");
printf("sun\tmon\ttues\twed\tthur\tfir\tsat\t\n");//表头
i = 1; d = 1;
weekday = (days + 1)%7; //求星期几
while(i<=weekday) //输出前面的空格
{
printf("\t");
i++;
}
//
while(d<=monthday(month,year)) //输出一个月日期
{
weekday = (days + 1)%7;
if(weekday==6) //最后一个是星期六,输出之后要换行
printf("%d\n",d);
else //不是星期六的输出后不换行
printf("%d\t",d);
if(d==monthday(month,year)) //一个月天数输出结束
printf("\n");
d++;
days++;
}
printf("--------------------------------------------------\n");
}
int monthday(int month,int year)
{
switch(month)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
return 31;break;
case 4:
case 6:
case 9:
case 11:
return 30;break;
case 2:
if(isleapyear(year))
{
return 29;//闰年29天
break;
}
else
{
return 28;
break;
}
}
}
int isleapyear(int year)
{
if((year%4==0)&&(year%100!=0)||(year%400==0))
return 1;
else
return 0;
}