第1个回答 推荐于2017-09-13
1、可以用公式
((year-1)+(year-1)/4-(year-1)/100+(year-1)/400+date)%7
计算任意一天是星期几。year是年份,date表示这天一年中的是第几天。
2、例程:
#include<iostream>
#include<string>
#include<iomanip>
using namespace std;
int day[12][42];
string month_name[12]={"一月","二月","三月","四月","五月","六月",
"七月","八月","九月","十月","十一月","十二月"};
bool leap(int year)//判断是否为闰年
{
if((year%4==0&&year%100!=0)||(year%400==0))
return 1;
else return 0;
}
void print()//输出
{
int i,j,k,s,d;
for(i=0;i<4;i++)
{
cout<<setw(12)<<month_name[i*3]<<setw(26)<<month_name[i*3+1]<<setw(26)<<month_name[i*3+2]<<endl<<endl;
for(k=0;k<3;k++)
{
printf("日 一 二 三 四 五 六");
if(k!=2)printf(" ");
else printf("\n");
}
for(j=0;j<6;j++)
{
for(k=0;k<3;k++)
{
for(s=0;s<7;s++)
{
d=day[i*3+k][j*7+s];
if(d)printf("%-3d",d);
else printf(" ");
}
printf(" ");
}
printf("\n");
}
printf("\n");
}
}
int main()
{
int i,j,year,monthw[12],date;
int day_number[12]={31,28,31,30,31,30,31,31,30,31,30,31};
while(scanf("%d",&year)!=EOF)
{
if(leap(year))day_number[1]=29;
else day_number[1]=28;
date=1;
for(i=0;i<12;i++)
{
monthw[i]=((year-1)+(year-1)/4-(year-1)/100+(year-1)/400+date)%7;//计算每个月第一天是星期几
date+=day_number[i];
}
memset(day,0,sizeof(day));
for(i=0;i<12;i++)
{
for(j=monthw[i];j<monthw[i]+day_number[i];j++)
{
day[i][j]=j-monthw[i]+1;
}
}
print();
}
return 0;
}
第2个回答 2010-04-08
//自己改下
#include<stdio.h>
//#include<windows.h>
int days[]={0,31,59,90,120,151,181,212,243,273,304,334,365};
int month[]={31,28,31,30,31,30,31,31,30,31,30,31};
char weekday[7][7]={"一","二","三","四","五","六","七"};
int week(int y,int m,int d)
{
int day=0;
day=days[m-1]+d-1;
return (y-1+(y-1)/4-(y-1)/100+(y-1)/400+day)%7;
}
void print()
{
puts("1.Week(查询某天是星期几)");
puts("2.Month(打印某月日历)");
puts("3.Calendar(打印某年日历)");
puts("4.Exit(退出)");
}
void printmonth(int y,int m)
{
int i,j,w;
w=(week(y,m,1)+1)%7;
puts(" SUN MON TUE WED THU FRI SAT");
for(i=1;i<=w;i++)
printf("%5c",' ');
for(j=i;j<i+month[m-1]+(m==2&&(y%4==0&&(y%100)||y%400==0));j++)
{
printf("%5d",j-i+1);
if(j%7==0)
puts("");
}
if((j-1)%7)
puts("");
}
int main()
{
int i,y,m,d,c;
char op[1];
print();
while(scanf("%d",&c)==1)
{
if(c==1)
{
do
{
puts("请输入年月日(XXXX,XX,XX)");
scanf("%d%d%d",&y,&m,&d);
printf("%4.4d年%2.2d月%2.2d日是星期%s,是否继续查询(Y/N)?\n",y,m,d,weekday[week(y,m,d)]);
scanf("%s",op);
}while(op[0]=='Y');
print();
}
if(c==2)
{
do
{
puts("请输入要打印的月份(XXXX)");
scanf("%d%d",&y,&m);
printf(" %4.4d年%2.2d月\n",y,m);
printmonth(y,m);
puts("是否继续打印(Y/N)?");
scanf("%s",op);
}while(op[0]=='Y');
print();
}
if(c==3)
{
do
{
puts("请输入要打印的年份(XXXX)");
scanf("%d",&y);
printf(" %4.4d\n",y);
for(i=1;i<=12;i++)
{
printf(" %2.2d月\n",i);
printmonth(y,i);
}
puts("是否继续打印(Y/N)?");
scanf("%s",op);
}while(op[0]=='Y');
print();
}
if(c==4)
{
puts("是否要真的退出(Y/N)?");
scanf("%s",op);
if(op[0]=='Y')
return 0;
else print();
}
}
}