c语言的小作业:输出万年历 同一季节输出在一行上

使用了蔡勒公式(是一个计算星期的公式,随便给一个日期,就能用这个公式推算出是星期几):

 (不过这个公式只能对于1582年10月4日之后的日子使用,这其中有一个有趣的小故事,感兴趣的读者可以百度一下)

#include<stdio.h>
using namespace std;
int year;
int search(int m,int d)//查询这一天是星期几的公式 
{
	int tmpy=year;
	if(m<3)
	{
		tmpy-=1;
		m+=12;
	}
	int c=tmpy/100;
	int y=tmpy-100*c;
	//w=y+[y/4]+[c/4]-2c+[26(m+1)/10]+d-1
	return (y+y/4+c/4-2*c+26*(m+1)/10+d-1+7*100)%7;
}
int check()
{
	if(year%4==0&&year%100!=0||year%400==0)	return 1;
	else return 0;
}
signed main()
{
	    int a[12]={31,28,31,30,31,30,31,31,30,31,30,31};
	   	printf("请输入要查询的年份:");
		scanf("%d",&year);
	    printf("\n\n\n%8d年的日历为\n\n\n",year);
	    printf("=========================================================\n\n\n\n");
	    if(check)	a[1]=29;	//检查是不是闰年 
	    for(int i=1;i<=4;i++)	//按照季节 输出 
	    {						//m1,m2,m3分别判断这三个月的星期 
	    	int m1=search((i-1)*3+1,1),m2=search((i-1)*3+2,1),m3=search((i-1)*3+3,1);
	    	printf("%15d月%30d月%30d月\n",(i-1)*3+1,(i-1)*3+2,(i-1)*3+3);
	    	printf("Sun Mon Tue Wed Thu Fri Sat     ");
	    	printf("Sun Mon Tue Wed Thu Fri Sat     ");
	    	printf("Sun Mon Tue Wed Thu Fri Sat     \n");
	    	int d1=1,d2=1,d3=1;
	    	for(int j=1;j<=6;j++)//一个月最多显示六行 
	    	{
	    		for(int k=0;k<m1;k++)
   				printf("    ");
	    		for(;m1<7;m1++)
				{
	    			if(d1<=a[(i-1)*3+0])	printf("%-4d",d1++);
	    			else					printf("    ");
						
				}
				m1=0;
				printf("    ");
				for(int k=0;k<m2;k++)
   				printf("    ");
   				
				for(;m2<7;m2++)
				{
	    			if(d2<=a[(i-1)*3+1])	printf("%-4d",d2++);
	    			else					printf("    ");
						
				}
				m2=0;
				printf("    ");
				for(int k=0;k<m3;k++)
   				printf("    ");
				for(;m3<7;m3++)
				{
	    			if(d3<=a[(i-1)*3+2])	printf("%-4d",d3++);
	    			else					printf("    ");
						
				}
				m3=0;
				printf("\n");
			}
		}

}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值