横排万年历

一年一度的万年历项目到了,想想去年的这个时候的我还是个菜鸟,没想到到了今天的我依然是个菜鸟 = =。有点尴尬哈哈哈~

废话不多说,简单的实现万年历是非常简单的,竖排输出,并不算太难。

下面就开始横板万年历的思路吧~

想打横板万年历首先要把正常万年历所需要的配料准备好。

一个数组存储每个月的天数

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 !

猜你喜欢

转载自blog.csdn.net/qq_41722524/article/details/83789421