试题 算法提高 任意年月日历输出

题目描述
已知2007年1月1日为星期一。
设计一函数按照下述格式打印2007年以后(含)某年某月的日历,2007年以前的拒绝打印。
为完成此函数,设计必要的辅助函数可能也是必要的。其中输入为年分和月份。

注意:短线“-”个数要与题目中一致,否则系统会判为错误。

样例输入

2010 9

样例输出
在这里插入图片描述
思路:先算出输入的这一年的1号是星期几,然后算出这一月的1号是星期几,然后用格式控制输出即可。

#include <bits/stdc++.h>
using namespace std;
int judge(int year)//闰年判断 
{
	if(year%400==0||(year%4==0&&year%100!=0))
	 return 1;
	 else
	 return 0;
	
}
int main()
{    int i,year,month,d=1;//d表示当前是星期几 
	 cin>>year>>month;  //输入年year 月monrh 
	 for(i=2007;i<year;i++)
	  { if(judge(i))
	     d=(d+366)%7;
	     else
	     d=(d+365)%7;
	  } //循环完毕后d就变为year这一年的1月1日是星期几 
	 for(i=1;i<month;i++)
	 { 	switch(i)
	 	{ case 2: if(judge(year)) d=(d+29)%7; else d=(d+28)%7;break;
	 	  case 4:
		  case 6:
		  case 9:
		  case 11:d=(d+30)%7; break; 	
	 	  default:d=(d+31)%7; break;
	 	}	
	 } //循环完毕后d就变为month这个月1号是星期几 
	 int count=1,sum,flag=0,j;//count计数  sum表示这个月总共多少天 flag标志变量 
	 switch(month)//计算这个月有多少天 
	 	{ case 2: if(judge(year)) sum=29; else sum=28;break;
	 	  case 4:
		  case 6:
		  case 9:
		  case 11:sum=30; break; 	
	 	  default:sum=31; break;
	 	}
	 	if(month>=10)
	 	printf("Calendar %d-%d\n",year,month);
		else 	printf("Calendar %d-0%d\n",year,month);
	printf("---------------------\n");//打印日历头部 
	printf(" Su Mo Tu We Th Fr Sa\n");
	printf("---------------------\n");
	 for(i=0;i<d;i++)//如果这个月1号不是星期日  每次打印3个空格
	 printf("   ");// 直到找到应该写入1号的正确星期位置 
	 for(i=d;i<=6;i++)//从1号开始打印第一行 
	 printf("%3d",count++);
	 printf("\n");
	 for(i=1;i<=4;i++)//剩下可能3行或4行 最多不超过4行 
	   { for(j=0;j<7;j++)
	   	  { printf("%3d",count++);//每行打印7个数 
	   	    if(count>sum)//如果数到该月份的总天数之后 
	   	    {flag=1;break;//标记为1 跳出 停止打印 
	   	    }
	   	  }
	   	  printf("\n");
	   	  if(flag)//如果该月份所有天数已经打印完毕 
	   	  break;//跳出 
	   }
	 	printf("---------------------\n");//打印底部 
	  return 0;
	
} 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

乔梦圆的博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值