一年一度的万年历项目到了,想想去年的这个时候的我还是个菜鸟,没想到到了今天的我依然是个菜鸟 = =。有点尴尬哈哈哈~
废话不多说,简单的实现万年历是非常简单的,竖排输出,并不算太难。
下面就开始横板万年历的思路吧~
想打横板万年历首先要把正常万年历所需要的配料准备好。
一个数组存储每个月的天数
int days[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };
判断闰年函数
int leapYear(int year)
{
if ((year % 4 == 0) && (year % 100 != 0) || year % 400 == 0)
return 366;
else
return 365;
}
判断每年第一天是周几的函数
//注意scanf 2018 得到的是2017年(含2017年)的所有天数+1才是总天数
int firday_Of_Year(int yearNumber)
{
int daysNumber;
for (i = 0; i < yearNumber; i++)
daysNumber += year(i);//闰年函数求每年的天数并相加算出总天数
return (daysNumber + 1) % 7;//+1对7取余得到新年第一天是周几
}
根据总天数判断每个月的第一天是周几(由上个函数可以推测出来每个月第一天是周几)
//把之前年的所有天数加到一起
//并加到该月之前的上一个月的所有天数然后加一再对7取余
for (int j = 0; j < i; ++j)
totalDays = (totalyDays + days[j]);
week = (totalDays + 1) % 7; //当前月的1号是星期几
有了上面的的整体思路其实差不多已经可以做菜咯,咦,真香!
整体思路走向:大横排输出,假设我们现在两列的输出,我们首先要考虑的是每个月的第一周如何去完成,因为每个月的第一周
并不是从周日开始
但是我们知道每个月的第一天是周几啊~
剩下的事情就比较简单了,我们对7取余得到每月第一天是周几 实际上也就知道前面要由几天为空格了是吧,我们可以设置一个布尔变量,这个变量是判断是不是第一周,如果是第一周则需要打出相应数目的空格。
bool firstLine = true;
int length = 0;
int dayNumber = 1;
for (int j = 0; j < 6; ++j)//最多每个月的输出最多六行
{
for(week; (week % 7 != 0) || (week == 0); week++,begin++)
{
if (first)//第一个星期打印空格
{
for (int k = 0; k < week; ++k)
{
printf(" ");
}
firstLine = false;//打完后则不再需要
}
if (begin <= days[i])//打印各天
{
printf("%d",dayNumber);
}
else
{
printf(" ");
}
dayNumber++;
}
同理,打出下一个月的天数,当然这两者都要在一个大循环下进行,不得不说,横排的时间复杂度还是挺高的= =。
就此完毕!
之后改改的话,加入sacnf列数的话,再增加一个颜色函数,还可以变成这样
GAME OVER !