369 lines
5.4 KiB
C
369 lines
5.4 KiB
C
#include <stdio.h>
|
||
void Monthhead(int month)
|
||
{
|
||
|
||
printf("%s\n",(month==1)?"Jan":(month==2)?"Feb":(month==3)?"Mar":(month==4)?"Apr":(month==5)?"May":(month==6)?"Jun":(month==7)?"Jul":(month==8)?"Aug":(month==9)?"Sep":(month==10)?"Oct":(month==11)?"Nov":"Dec");
|
||
return;
|
||
}
|
||
void dayHead()
|
||
{
|
||
printf(" Sun Mon Tue Med Thu Fri Sat\n");
|
||
return;
|
||
}
|
||
int firstDay(int year)
|
||
{
|
||
int b=(year-1)*365+(year-1)*400+(year-1)*4-(year-1)*100+1;
|
||
return b%7;
|
||
}
|
||
int Week6(int year,int month)
|
||
{
|
||
int w,c,y;
|
||
int day=1;
|
||
if(month<3)
|
||
{
|
||
month+=12;
|
||
year--;
|
||
}
|
||
c=year/100;
|
||
y=year%100;
|
||
w=(c/4-2*c+y+y/4+13*(month+1)/5+day-1)%7;
|
||
return w;
|
||
}
|
||
int Week(int year,int month,int day)
|
||
{
|
||
int w,c,y;
|
||
if(year<=1582&&month<=10&&day<15)
|
||
{
|
||
if(month<3)
|
||
{
|
||
month+=12;
|
||
year--;
|
||
}
|
||
day-=4;
|
||
c=year/100;
|
||
y=year%100;
|
||
w=(c/4-2*c+y+y/4+13*(month+1)/5+day-1)%7;
|
||
}else{
|
||
if(month<3)
|
||
{
|
||
month+=12;
|
||
year--;
|
||
}
|
||
c=year/100;
|
||
y=year%100;
|
||
w=(c/4-2*c+y+y/4+13*(month+1)/5+day-1)%7;
|
||
}
|
||
|
||
return w;
|
||
}
|
||
int isLeapYear(int year)
|
||
{
|
||
return (year%4==0&&year%100!=0)||year%400==0;
|
||
|
||
}
|
||
int DayMonth(int year,int month)
|
||
{
|
||
|
||
if(month==2)
|
||
{
|
||
if(isLeapYear(year))
|
||
{
|
||
return 29;
|
||
}else{
|
||
return 28;
|
||
}
|
||
}else if(month==4||month==6||month==9||month==11){
|
||
return 30;
|
||
}else{
|
||
return 31;
|
||
}
|
||
}
|
||
void printCalendar3(int year)
|
||
{
|
||
int first=firstDay(year);
|
||
int month,day;
|
||
for(month=1;month<=9;month++)
|
||
{
|
||
printf("\n");
|
||
Monthhead(month);
|
||
dayHead();
|
||
for(day=1;day<=first;day++)
|
||
printf(" ");
|
||
int dayMonth=DayMonth(year,month);
|
||
for(day=1;day<=dayMonth;day++)
|
||
{
|
||
printf("%4d",day);
|
||
if((day+first)%7==0)
|
||
{
|
||
printf("\n");
|
||
}
|
||
}
|
||
if((day+first)%7!=0)
|
||
{
|
||
printf("\n");
|
||
}
|
||
first=(first+dayMonth)%7;
|
||
}
|
||
for(month=10;month<=12;month++)
|
||
{
|
||
int i;
|
||
|
||
|
||
day=1;
|
||
if(month==10)
|
||
{
|
||
int a[21]={1,2,3,4,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31};
|
||
Monthhead(month);
|
||
dayHead();
|
||
|
||
int first2=Week(year,month,day);
|
||
for(i=1;i<=first2;i++)
|
||
printf(" ");
|
||
for(i=0;i<21;i++)
|
||
{
|
||
printf("%4d",a[i]);
|
||
if((i+first2+1)%7==0)
|
||
{
|
||
printf("\n");
|
||
}
|
||
}
|
||
if((i+first2)%7!=0)
|
||
{
|
||
printf("\n");
|
||
}
|
||
first2=(first2+21)%7;
|
||
continue;
|
||
}
|
||
printf("\n");
|
||
int first3=Week(year,month,day);
|
||
Monthhead(month);
|
||
dayHead();
|
||
for(i=1;i<=first3;i++)
|
||
printf(" ");
|
||
int dayMonth;
|
||
if(month==11){
|
||
dayMonth=30;
|
||
}else if(month==12){
|
||
dayMonth=31;
|
||
}
|
||
for(i=1;i<=dayMonth;i++)
|
||
{
|
||
printf("%4d",i);
|
||
if((i+first3)%7==0)
|
||
{
|
||
printf("\n");
|
||
}
|
||
}
|
||
if((i+first3)%7!=0)
|
||
{
|
||
printf("\n");
|
||
}
|
||
first3=(first3+dayMonth)%7;
|
||
|
||
|
||
}
|
||
printf("\n");
|
||
}
|
||
void printCalendar(int year)
|
||
{
|
||
int first=firstDay(year);
|
||
int month,day;
|
||
for(month=1;month<=12;month++)
|
||
{
|
||
Monthhead(month);
|
||
dayHead();
|
||
for(day=1;day<=first;day++)
|
||
printf(" ");
|
||
int dayMonth=DayMonth(year,month);
|
||
for(day=1;day<=dayMonth;day++)
|
||
{
|
||
printf("%4d",day);
|
||
if((day+first)%7==0)
|
||
{
|
||
printf("\n");
|
||
}
|
||
}
|
||
if((day+first)%7!=0)
|
||
{
|
||
printf("\n");
|
||
}
|
||
first=(first+dayMonth)%7;
|
||
}
|
||
}
|
||
long int f(int year,int month)
|
||
|
||
{
|
||
|
||
if(month<3) return year-1;
|
||
|
||
else return year;
|
||
|
||
}
|
||
|
||
long int g(int month)
|
||
|
||
{
|
||
|
||
if(month<3) return month+13;
|
||
|
||
else return month+1;
|
||
|
||
}
|
||
|
||
long int n(int year,int month,int day)
|
||
|
||
{
|
||
|
||
return 1461L*f(year,month)/4+153L*g(month)/5+day;
|
||
|
||
}
|
||
|
||
int w(int year,int month,int day)
|
||
|
||
{
|
||
|
||
return(int) ((n(year,month,day)%7-621049L%7+7)%7);
|
||
|
||
}
|
||
|
||
int date[12][6][7];
|
||
|
||
int day_tbl[ ][12]={{31,28,31,30,31,30,31,31,30,31,30,31},{31,29,31,30,31,30,31,31,30,31,30,31}};
|
||
|
||
int Double(int year)
|
||
{
|
||
|
||
int sw,leap,i,j,k,wd,day;
|
||
|
||
char title[]="SUM MON TUE WED THU FRI SAT";
|
||
|
||
sw=w(year,1,1);
|
||
|
||
leap=(year%4==0&&year%100!=0)||year%400==0;
|
||
|
||
for(i=0;i<12;i++)
|
||
|
||
for(j=0;j<6;j++)
|
||
|
||
for(k=0;k<7;k++)
|
||
|
||
date[i][j][k]=0;
|
||
|
||
for(i=0;i<12;i++)
|
||
|
||
for(wd=0,day=1;day<=day_tbl[leap][i];day++)
|
||
|
||
{
|
||
|
||
date[i][wd][sw]=day;
|
||
|
||
sw=++sw%7;
|
||
if(sw==0) wd++;
|
||
|
||
}
|
||
|
||
printf("\n================== The Calendar of Year %d==================\n",year);
|
||
|
||
for(i=0;i<6;i++)
|
||
|
||
{
|
||
|
||
for(wd=0,k=0;k<7;k++)
|
||
|
||
wd+=date[i][5][k]+date[i+6][5][k];
|
||
|
||
wd=wd?6:5;
|
||
|
||
printf("%2d %s %2d %s\n",i+1,title,i+7,title);
|
||
|
||
for(j=0;j<6;j++)
|
||
{
|
||
|
||
/*printf(" ");*/
|
||
|
||
for(k=0;k<7;k++)
|
||
|
||
if(date[i][j][k])
|
||
|
||
printf("%5d",date[i][j][k]);
|
||
|
||
else printf(" ");
|
||
|
||
printf(" ");
|
||
|
||
|
||
for(k=0;k<7;k++)
|
||
|
||
if(date[i+6][j][k])
|
||
|
||
printf("%5d",date[i+6][j][k]);
|
||
|
||
else printf(" ");
|
||
|
||
printf("\n");
|
||
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
void choiceCalendar(int year)
|
||
{
|
||
|
||
int choose;
|
||
while(1){printf("1.<2E><><EFBFBD><EFBFBD>\n2.˫<><CBAB>\n");
|
||
scanf("%d",&choose);
|
||
switch(choose){
|
||
case 1: if(year!=1582)
|
||
{
|
||
printCalendar(year);
|
||
}else if(year==1582){
|
||
printCalendar3(year);
|
||
}
|
||
break;
|
||
case 2:Double(year);
|
||
break;
|
||
default:
|
||
printf("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><EFBFBD><EFBFBD>\n");
|
||
break;
|
||
}break;
|
||
}
|
||
}
|
||
|
||
int main()
|
||
{
|
||
int choice,year,month,day;
|
||
while(1)
|
||
{
|
||
printf("1.ij<><C4B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>\n2.<2E><><EFBFBD>ڼ<EFBFBD>\n3.<2E><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>\n4.<2E>˳<EFBFBD><CBB3><EFBFBD><EFBFBD><EFBFBD>\n");
|
||
printf("ѡ<EFBFBD>ĸ<EFBFBD>!\n");
|
||
scanf("%d",&choice);
|
||
switch(choice){
|
||
case 1:printf("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:\n");
|
||
scanf("%d",&year);
|
||
choiceCalendar(year);
|
||
break;
|
||
case 2:printf("<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ij<EFBFBD><EFBFBD>ij<EFBFBD><EFBFBD>ij<EFBFBD><EFBFBD>(<28>ո<EFBFBD><D5B8><EFBFBD><EFBFBD><EFBFBD>):\n");
|
||
scanf("%d %d %d",&year,&month,&day);
|
||
int w=Week(year,month,day);
|
||
printf("%d\n",w);
|
||
break;
|
||
case 3:printf("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:\n");
|
||
scanf("%d",&year);
|
||
if(isLeapYear(year)){
|
||
printf("YES\n");
|
||
}else{
|
||
printf("NO\n");
|
||
}
|
||
break;
|
||
case 4: return 0;
|
||
break;
|
||
default:printf("<EFBFBD><EFBFBD>Чѡ<EFBFBD><EFBFBD>\n");
|
||
break;
|
||
|
||
}
|
||
}
|
||
return 0;
|
||
|
||
}
|