如何用C++打印月历

按下面的要求
2.20 (OJ112)打印某月的日历
问题描述 给定两个正整数year及month,打印当月的日历。
输入 输入数据有若干行。每行上有两个正整数year及month对应一种情形。
输出 对于每一种情形,先输出“Case #:”(#为序号,从1起),然后输出“year年month月”,换行,“Sun Mon Tue Wed Thu Fri Sat”,换行,日历内容,换行。
输入样例
2008 2
2009 2
2010 2
输出样例
Case 1: 2008年2月
Sun Mon Tue Wed Thu Fri Sat
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23

/* 输入的年份月份有一个为0 就跳出循环,否则可以一直输入年份和月份并输出月历*/

#include <iostream>
using namespace std;

/*得到所输入年月的第一天是星期几0~6*/
int getdate(int y,int m);

/*判断所输入的是否是闰月,是则返回1,否则返回0*/
int leap(int y);

/*打印输入月份月历表*/
void print(int y,int m);

int main()
{
int y,m;
int i=1;
cout<<"输入年份和月份:"; //这句话不想要可以删掉,只是作为提示.
while(cin>>y>>m)
{
if(y==0||m==0) { cout<<"over"<<endl;break;}
cout<<"Case "<<i<<":";
print(y,m);
i++;
cout<<"输入年份和月份:"; //这句话不想要可以删掉,只是作为提示.
}
return 0;
}

int getdate(int y,int m)
{
int w=(y+(y-1)/4-(y-1)/100+(y-1)/400)%7;
int days=0;
switch(m)
{
case 12: days+=30;
case 11: days+=31;
case 10: days+=30;
case 9: days+=31;
case 8: days+=31;
case 7: days+=30;
case 6: days+=31;
case 5: days+=30;
case 4: days+=31;
case 3: if(leap(y)) days+=29;
else days+=28;
case 2: days+=31;
case 1: days+=0;
}
w=(w+days)%7;
return w; /*返回输入月份1号的星期*/
}

void print(int y,int m)
{
int w=getdate(y,m);
cout<<y<<"年"<<m<<"月"<<endl;

int month[12]={31,28,31,30,31,30,31,31,30,31,30,31};
if(leap(y)) month[1]=29;

cout<<"Sun\tMon\tTue\tWed\tThu\tFri\tSat"<<endl;
int i,j;
for(i=0;i<w;i++) cout<<"\t";

for(i=w,j=1;j<=month[m-1];i++,j++)
{
if(i%7==0) cout<<endl;
cout<<j<<"\t";
}
cout<<endl;
}

int leap(int y)
{
if((y%4==0&&y%100!=0)||y%400==0) return 1;
return 0;
}
温馨提示:答案为网友推荐,仅供参考
第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();
}
}
}