2020-07-08

C语言实例——万年历

首先构思好框架
2020-07-08_第1张图片
使用好*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;
}


你可能感兴趣的:(笔记)