搞了半天终于弄出来了,下面我来说一下我的思路
我以2019年一月一日,星期二,为基准,将整个程序分为6子部分
1:主函数:主要负责输入年份,比较输入的年份和2019的大小,
2-4:主要的功能实现块,其中有一部分最主要的可以单独写为一个函数,让其他部分调用,可以减小代码行数。
5:该函数块主要由switch组成,调用后打印星期号
6:该函数块主要判断年份是否为闰年,是则输出1,否则0.
整个程序主要功能块由3个函数组成,但它们的思路都一样,我就介绍其中一种
函数由形参传入年份,首先定义一系列需要的变量,先计算该年份到2019年的天数day,需要用到闰年判断,从而根据天数得到该年1月1日的星期xq,用循环打印12个月,循环体内,先调用xingqi打印函数打印星期号,开始已经定义了tap全局变量,所有函数通用。由于闰年平年不同,需要用闰年判断函数修改2月的天数。
修改完后开始打印天数,先判断星期变量 xq的值,如果不等于1,则不能直接打印,否则排列不好,先将xq赋值给l,通过循环打印多个空格,当l=1时,空格已经足够,可以打印天数了,
若打印星期变变量xq=7,则需要将其置一,换行,并用continue结束一次循环;由于1-9;10-30的位数不同,1-9需要加一个空格,当月数打印完毕后换行,跳出天数打印循环。继续下一月的循环。
下面我就公布一下源代码吧
#include<stdio.h>
int R=0;
int tap[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
const int Rest_year=2019;
void xingqi(int i)
{
switch(i)
{
case 1:printf("星期一 ");break;
case 2:printf("星期二 ");break;
case 3:printf("星期三 ");break;
case 4:printf("星期四 ");break;
case 5:printf("星期五 ");break;
case 6:printf("星期六 ");break;
case 7:printf("星期七\n");break;
default :break;
}
}
int ren(int year)//闰年判断,若是,输出1,否输出0
{
if(0==year%4)
if(0!=year%100||0==year%400)
return 1;
return 0;
}
void rupn(int y)//若年数小于2019,
{ int bs; //必要的变量定义
int day=0;
int xq,yue;
int fg,l=1,k=y;
printf("\n\n\n\n%d 年日历\n",y);//计算该年到2019年的天数,
for(;y<2019;y++)
{
if(1==ren(y)) //闰年则天数为366,平年则为365
day=day+365;
else day=day+365;
}
y=k;//在天数计算时,已经将y变成2019,需要回到初始值
xq=2-day%7;
if(xq<0) xq=7+xq;//判断该年的一月一日为星期几
l=xq;
//--------------------------------------------------
for(yue=1;yue<=12;yue++) //以月打印
{ l=xq;
printf(" %d 月\n",yue); //显示月号
for(bs=1;bs<8;bs++)///打印星期号
xingqi(bs);
//--------------------------------------------------
if(1==ren(y))
tap[2]=29; //如果该年为闰年则2月为29天,否则为28天
else tap[2]=28;
//-------------------------------------------
for(fg=1;fg<=tap[yue];fg++) //以日打印
{ if(1!=l)
for(;l>1;l--) printf(" ");//初始星期不为星期一,则从星期一到初始输出都为空格
//---------------------------------------------
//
if(xq==7) //值为星期天,打印换行,并将星期置一
{printf("%d\n",fg);xq=1;continue;}
if(fg<10)printf(" %d ",fg);
else printf("%d ",fg);xq++;//打印一次星期加一次
if(fg==tap[yue])printf("\n\n");//月份打印完,换行
}
}
}
//------------------------------------------------
void rudw(int y)//大于2019
{ int s=y;
int day=0;
int xq,yue,bs,fg,l;
printf("\n\n\n\n%d 年日历\n",y);
for(;s>2019;s--)
if(1==ren(s))
day=day+366;
else day=day+365;
xq=2+day%7;
if(xq==7) xq=1;
l=xq;
for(yue=1;yue<=12;yue++)
{ //---------------------------------
printf(" %d 月\n",yue);
for(bs=1;bs<8;bs++)
xingqi(bs);
l=xq;
//-------------------------------------
if(1==ren(y))
tap[2]=29;
else tap[2]=28;
//---------------------------------------
for(fg=1;fg<=tap[yue];fg++) //以日打印
{ if(1!=l)
for(;l>1;l--) printf(" ");//初始星期不为星期一,则从星期一到初始输出都为空格
//---------------------------------------------
//
if(xq==7) //值为星期天,打印换行,并将星期置一
{printf("%d\n",fg);xq=1;continue;}
if(fg<10)printf(" %d ",fg);
else printf("%d ",fg);xq++;//打印一次星期加一次
if(fg==tap[yue])printf("\n\n");//月份打印完,换行
}
}
}
void rudy(int y)//等于2019
{
int xq=2;
int l=xq;
int yue,fg,bs;
printf("\n\n\n\n%d 年日历\n",y);
for(yue=1;yue<=12;yue++)
{ //--------星期打印-----------------------
printf(" %d 月\n",yue);
for(bs=1;bs<8;bs++)
xingqi(bs);
l=xq;
//--------------------------------------------
for(fg=1;fg<=tap[yue];fg++) //以日打印
{ if(1!=l)
for(;l>1;l--) printf(" ");//初始星期不为星期一,则从星期一到初始输出都为空格
//---------------------------------------------
//
if(xq==7) //值为星期天,打印换行,并将星期置一
{printf("%d\n",fg);xq=1;continue;}
if(fg<10)printf(" %d ",fg);
else printf("%d ",fg);xq++;//打印一次星期加一次
if(fg==tap[yue])printf("\n\n");//月份打印完,换行
}
}
}
int main()
{ printf("Please Enter The Day:");
int year;
scanf("%d",&year);
if(year<Rest_year)
rupn(year);
else if (year==Rest_year)
rudy(year);
else
rudw(year);
return 0;
}