C万年历

#include<stdio.h>
int IsLeapYear(int year)//判断该年是否为闰年 
{
	if( (year%4==0&&year%100!=0) || (year%400 ==0 ) )
	{
		return 366;
	}
	else 365;
}



int fun(int year)//用于计算每年第一天是星期几的公式的一部分 
{
	int sum=0;
	if(year>2011)
	{
		while(year>2011)
		{
			year--;
			if(year%4==0&&year%100!=0||year%400==0) sum+=2;
			else sum+=1;
		}
		return (sum+6)%7;
	}
	
	while(year<2011)
	{
		if(year%4==0&&year%100!=0||year%400==0) sum-=2;
		else sum-=1;
		year++;
	}
	return 6+sum%7;
	
	
}



int Isfirstday(int y)//计算每年第一天是星期几	 
{
	int w=fun(y);
	if(w==0) return 7;
	else return w;
}




int IsMonth(int y,int m)//计算每一个月有多少天 
{
	if(m==1||m==3||m==5||m==7||m==8||m==10||m==12)return 31;
	if(m==4||m==6||m==9||m==11)return 30;
	if(m==2)
	{
		if(IsLeapYear(y)==1)return 29;
		else return 28;
	}
}


int main()
{
	int y,i,j,k;					//y表示年份
									//i,j,k用于控制循环次数 
	printf("你想看的年份:");
	scanf("%d",&y);
	printf("\n---------------------%d 年 年 历-------------------------\n",y);
	
	
	int fd=Isfirstday(y); 			//fd表示每年第一天是星期几 
	
	int day1,day2,date1,date2;		//day1表示在奇数月份中具体天数是几号
									//date1表示在奇数月份中具体天数是星期几
									//day2表示在偶数月份中具体天数是几号
									//date2表示在偶数月份中具体天数是星期几 
	date1=fd;						//一月份的第一天就是fd。 
	
	
	
	for(i=1;i<=6;i=i+1)
	{
        printf(" %d月	                         %d月           \n",2*i-1,2*i);
        printf(" Sun Mon Tue Wed Thur Fri Sat    Sun Mon Tue Wed Thur Fri Sat\n");		
	
		day1=day2=1;
        date2=(date1+IsMonth(y,2*i-1))%7;
        
        if(date1<=6){
        for(j=0;j<date1;j++)			//每个奇数月的第一天是星期几,就要空出几组空格组(排版问题)。 
            printf("    ");
       }else if(date1==7){
       	
	   }
     
	       
        while(day1<=IsMonth(y,2*i-1))
        {
            printf("%4d",day1);			//打印出每一天具体是几号,对应在第一行的星期几。 
            day1++;
            date1=(date1+1)%7;			//打印完了,date1要更新 
            
            if(date1%7==0||day1>IsMonth(y,2*i-1))
			{
                if(date1%7==0)   printf("    ");//奇数月的某一周输出完了,接下来打印偶数月对应的那一周的数字 
              
			    else							//奇数月与偶数月相隔4个空格 
				{
					for(k=0;k<8-date1;k++)
						printf("    ");
				}
           
           
           
           
		        for(j=0;j<date2;j++)	//每个偶数月的第一天是星期几,就要空出几组空格组(排版问题)。
                    printf("    ");
           
		        while(day2<=IsMonth(y,2*i))
                {
                    printf("%4d",day2);	//打印出每一天具体是几号,对应在第一行的星期几。 
                    day2++;
                    date2=(date2+1)%7;
                    if(date2%7==0)		//这一周打印完了,就退出打印偶数月的while循环,继续打印奇数月下一周的数字 
					{
                        break;
                    }
                }
              printf("\n");
            }
        }
        
        
        
        
        
       if(day1>IsMonth(y,2*i-1)&&day2<=IsMonth(y,2*i))//当奇数月打印完,且偶数月还没打印完时,继续打印偶数月的 
		{
            printf("                                ");//32格 
            while((day2<=IsMonth(y,2*i)))
			{
                printf("%4d",day2);					   
                day2++;
                date2=(date2+1)%7;
                if(date2%7==0)
					printf("\n");
            }
        }
        date1=date2;			//上一个偶数月的date2加一以后(“加一”在while循环里已经有了)就是下个奇数月的date1 
	    printf("\n\n");
	}
}
发布了122 篇原创文章 · 获赞 14 · 访问量 6162

猜你喜欢

转载自blog.csdn.net/weixin_44001521/article/details/103974109