永发信息网

如何用C++打印月历

答案:4  悬赏:50  手机版
解决时间 2021-04-02 03:34
按下面的要求
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
最佳答案


#include <iostream>
using namespace std;


int getdate(int y,int m);


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

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、可以用公式 ((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;  }
//自己改下 #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(); } } }
#include void main(void) { int i,day,m; printf("请输入打印月的天数:"); scanf("%d",&day); printf("请输入这个月开始的一天属于星期几(1=星期日,2=星期一...):"); scanf("%d",&m); for(i=1;i<=m;i++) printf(" "); for(i=1;i<=day;i++) { printf("%5d",i); m++; if (m%7==0) printf("\n"); } printf("\n&穿窢扁喝壮估憋台铂郡quot;); }
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
手机相机app软件哪个
"费长房缩不尽相思地,女娲氏补不完离恨天."出
阳历55年9月9日生日阴历是几号
郑州何思雨,身高164,体重1O5
协易冲床速比控上的50hz和60hz是什么意思
法院承认的借款利息是多少
老塘地址在什么地方,想过去办事
山东韩氏家谱字辈?
被小猫k了一下
(司马)徽字德操,颍川阳翟人。尝有人妄认徽猪
铝和氯化铜反应
如何区别各种短语?
这个肮脏的世界告诉我除了自己谁也靠不住,连
美术就是绘画这句话对吗?
企业可以从职工工资中扣减哪些项目?
推荐资讯
人到底是活在时间里还是活在空间里
第三届“99公益日”什么时候正式启动?
2011新疆网络管制
我怀第一胎是女孩现在怀二胎特别能吃怀的会是
小米4的65寸和小米4A65寸有什么区别
机器炒原味瓜子的方法
博弈大师安装后测速失败进不去怎么处理
大专都有什么计算机专业?
梨苹果共20个,每苹果1元共花了40元,苹果和
酒后纵火罪量刑
吉利领克CMA构架是谁研发的
NB-IOT智能烟感器有哪些优点?
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?