万年历
要求:
代码:
#include<stdio.h>
#define DATE_HEADER " Sun Mon Tues Wed Thur Fri Sat"
int y,m,d;
int monthd[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int is_leap_year(int y);
int get_yearday(int y);
int get_weekday(int y,int m,int);
int get_monthdays(int y,int m);
int get_day(int y,int m,int);
void print(int y,int m);
int main()
{
printf("请输入年份和月份,以逗号隔开");
scanf("%d,%d",&y,&m);
print(y,m);
return 0;
}
int is_leap_year(int y)
{
if(y%400==0 || (y%4==0 && y%100!=0)){
return 1;
}else{
return 0;
}
}
int get_yearday(int y)
{
int y1=y-1900;
int d1,d2,d3;
int dd;
if(is_leap_year(y)){
d1=(y1/4-1);
d2=d1*366;
d3=(y1-d1)*365;
dd=d1+d2+d3-1;
}else{
d1=(y1/4)*366;
d2=(y1-(y1/4))*365;
dd=d1+d2;
}
return (dd);
}
int get_monthdays(int y,int m)
{
if(is_leap_year(y) && m==2){
return 29;
}else {
return monthd[m];
}
}
int get_day(int y,int m,int d)
{
int yd=get_yearday(y);
int md=0;
int i;
if(is_leap_year(y)){
monthd[2]=29;
if(m>2){
for(i=0;i<m;i++){
md=md+monthd[i];
}
md=md+1;
}else if(m==2){
md=monthd[1]+1;
}else if(m==1){
md=1;
}
}else {
for(i=0;i<m;i++){
md=md+monthd[i];
}
md=md+1;
}
return (md+yd);
}
int get_weekday(int y,int m,int d)
{
int weekd=get_day(y,m,1)%7;
int weekday1[7]={0,1,2,3,4,5,6};
return weekday1[weekd];
}
void print(int y,int m)
{
printf("%s\n", DATE_HEADER);
int first=get_weekday(y,m,1);
int days=get_monthdays(y,m);
int i,j;
for(i = 0; i < first; i++) {
printf(" ");
}
printf("%6d", 1);
if(first == 6)
printf("\n");
for(i = 1; i < days; i++)
{
printf("%6d", i + 1);
if((first + i) % 7 == 6 || i + 1 == days){
printf("\n");
}
}
}