UIT2024_Calendar/stu2024/计科2401孙美琪.c
2024-12-07 16:23:34 +08:00

369 lines
5.4 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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;
}