题目
- 编写程序,输入一个年份,打印该年份的日历,输出结果示例如题图所示。
思路
本题是对昨日的题的升级,原来是一次打印一个月,现在是横向一次打印两个月。首先要深刻理解打印规律是外层循环控制打印多少行、内层循环控制每一列打印什么。
代码
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
//返回输入日期距离年初的天数
int day_count(int y,int m,int d)
{
int i,days=0;
int a[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
for(i=0;i<m;i++)
{
days+=a[i];
}
days+=d;
if(m>2 && (y%4==0 && y%100!=0 || y%400==0))
{
days++;
}
return days;
}
//输入日期,返回当月的1日是周几,1~7对应周一至周日
int weekdays(int y1,int m1)
{
int d1=1,y2=2018,m2=2,d2=18,a,b,c=0,i,days,flag;
a=day_count(y1,m1,d1);
b=day_count(y2,m2,d2);
if(y1<y2)
{
for(i=y1;i<y2;i++)
{
if(i%4==0 && i%100!=0 || i%400==0)
{
c++;
}
}
days=b-a+(y2-y1)*365+c;
}else{
for(i=y2;i<y1;i++)
{
if(i%4==0 && i%100!=0 || i%400==0)
{
c++;
}
}
days=a-b+(y1-y2)*365+c;
}
if((y1<y2) || (y1==y2 && m1<m2) ||(y1==y2 && m1==m2 && d1<d2))
{
flag=(7-days%7)%7;
}else{
flag=days%7;
}
if(flag==0)
{
flag=7;
}
return flag;
}
//输入year和month打印横向两月日历
void month_print(int y,int m)
{
int h,i=1,j=1,k1,k2,flag=0,flag1=1;//flag用于记录是否为闰年
//i,j分别记录横向相邻两月的日期,h为用于计数的变量
//flag用于处理闰年,flag1用于让右侧1日前打印空格的语句只运行一次
int a[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
printf("| %d MON TUS WED THU FRI SAT SUN %3d MON TUS WED THU FRI SAT SUN |\n",m,m+6);
k1=weekdays(y,m);k2=weekdays(y,m+6);//k1,k2用于记录月份的第一天是周几
if(m==2)
{
flag=(y%4==0 && y%100!=0 || y%400==0);
}//处理闰年
printf("| ");
//打印左侧月份1日前面可能存在的空格
for(h=k1-1;h>0;h--)
{
printf(" ");
}
while(i<a[m] || j<=a[m+6])//打印主体开始
{
if(i!=1)
{
printf("| ");
}
for(;;i++,k1++)
{
if(i<=a[m]+flag)
{
printf("%4d",i);
}else{
printf(" ");
}
if(k1%7==0)
{
k1++;i++;
break;
}
}//左侧月份打印完一行
printf(" ");//打印间隔
if(flag1)
{
//打印右侧月份1日前可能存在的空格
for(h=k2-1;h>0;h--)
{
printf(" ");
}
flag1=0;
}
for(;;j++,k2++)
{
if(j<=a[m+6])
{
printf("%4d",j);
}else{
printf(" ");
}
if(k2%7==0)
{
k2++;j++;
printf(" |\n");
break;
}
}//右侧月份打完一行
}
}
int main()
{
int year,mon;
printf("please input the year whose calendar you want to know:");
while(fflush(stdin),scanf("%d",&year)!=EOF)
{
mon=1;
printf("|--------------------The Calendar of Year %d--------------------|\n",year);
while(mon<=6)
{
month_print(year,mon);
mon++;
}
printf("|-----------------------------------------------------------------|\n");
printf("please input the year whose calendar you want to know:");
}
system("pause");
}
运行结果

京公网安备 11010502036488号