首先构思好框架
使用好*printf()*就OK了。
万年历的本质就是所要输出的时间距离起始点的差值。然后计算出几号是星期几。因为一个星期是七天。所以需要对7求余。
而总天数的时间择需要考虑闰年、平年的状况。
是否闰年
int leapy(int year)
{ int flg = 0;
if((year%4==0 && year%100!=0)||year%400==0)
flg = 1;
return flg;
}
下面为距190101的用天数
int total(int year,int month)
{
int sum = 0;
int yeard=0, monthd=0, yi, mi;
for(yi=first;yi<year;yi++)//计算年
{
if(leapy(yi))
yeard +=366;
else
yeard +=365;
}
if(month>1&&leapy(year))//根据是否闰年计算月
{
for(mi=0;mi<month-1;mi++)
{
monthd +=isleap[mi];
}
}
else
{
for(mi=0;mi<month-1;mi++)
{
monthd +=notleap[mi];
}
}
sum = yeard+monthd;
return sum;
}
因为所需月份为当前输出月份。所以只需要计算到当前月的上一月即可。
然后将代码进行整理组合。考虑闰年、平年的输出。源码如下。
//万年历,以1900年1月1日为起始点。
/*思路总结:方法为所需时间与起始点时间相差的天数,
而差值中并不包括计算时间所在月份。该月份是输出月份,所以不包含其中。例如:计算20080606 只需要计算到20080531即可。然后输出06月份的日历。并且标记06这天
*/
#include <stdio.h>
#define first 1900
void title();
void format();
void star(); //格式化界面
int leapy(int year); //判断是否为闰年
int total(int year,int month); //输入月距起始点天数
int isleap[]={31,29,31,30,31,30,31,31,30,31,30,31};
int notleap[]={31,28,31,30,31,30,31,31,30,31,30,31};
int main()
{
int year, month, day, temp, i, prt;
printf("请输入时间合适如(19000101):");
scanf("%4d%2d%2d",&year,&month,&day);
printf("%d年%d月%d日\n",year,month,day);
temp = total(year,month)%7;
format();
if(leapy(year))
prt=isleap[month-1];
else
prt=notleap[month-1];
int tt;
tt=7-temp;
for(i=0;i<temp;i++)
{
printf("\t\t");
}
for(i=1;i<=prt;i++)
{
if(i==day)
{
//标记当前输入时间
printf("\033[31m%d\t\t\033[0m",i);
}
else
{
printf("%d\t\t",i);
if(i==tt||(i-tt)%7==0)//7天一换行
{
printf("\n");
}
}
}
printf("\n");
star();
return 0;
}
void title()
{
printf("\t\t\t\t\t\t万年历\n");
}
void star()
{
printf("******************************"
"**************************\n");
}
void format()
{
title();
star();
printf("Mon.\tTue.\tWed.\tThur.\tFri."
"\tSat.\tSun.\n");
}
int leapy(int year)
{
int flg = 0;
if((year%4==0 && year%100!=0)||year%400==0)
flg = 1;
return flg;
}
int total(int year,int month)
{
int sum = 0;
int yeard=0, monthd=0, yi, mi;
for(yi=first;yi<year;yi++)//计算年
{
if(leapy(yi))
yeard +=366;
else
yeard +=365;
}
if(month>1&&leapy(year))//根据是否闰年计算月
{
for(mi=0;mi<month-1;mi++)
{
monthd +=isleap[mi];
}
}
else
{
for(mi=0;mi<month-1;mi++)
{
monthd +=notleap[mi];
}
}
sum = yeard+monthd;
return sum;
}