输入年份并输出当年的日历

要求:用调用函数实现,每个函数完成一个功能;

思路:
1. main函数中只出现输入年份,和打印年份月数的函数;
2. 输入年份函数;
3. 打印年份日历函数:用循环实现1-12月的打印,调用月份打印函数
4.打印月份函数
5. 返回月数名称的函数
6. 计算year的month的天数的函数
7. 计算year的month的第一天是星期几的函数
8.判断year是否是闰年
9. 打印某月的第一天以前的空格数;
 

#include<stdio.h>
#include<stdbool.h>

int enter_year(void);//输入年份函数
_Bool leap_year(int year);//判断是否为闰年函数
void print_calendar(int year); //打印日历函数
void print_month(int month);//打印月份名称函数
int days_num(int year,int month);//返回该月天数函数
void print_week(void);//打印周一到周日
int firstday(int year,int month);//返回该月第一天是周几函数
void print_space(int year,int month);//空格缩进函数

int main()
{
//	while(1)
//	{
		print_calendar( enter_year() );
//	}

	return 0;
}


int enter_year(void)//输入年份函数,并返回输入值
{
	printf("please enter the year:");
	int year;
	scanf("%d",&year);
	printf("\n");

	return year;
}

_Bool leap_year(int year)//判断是否为闰年函数
{
	if( (year%400 == 0) || (year%4==0 && year%100!=0) )
		return true;
	else 
		return false;
}

void print_calendar(int year)//打印年份日历函数
{
	int i;
	int j;
	int count;

	for(i=1; i<=12; i++)
	{
		print_month(i);
		print_week();
		print_space(year,i);
		               
                count=firstday(year,i)+1;

		for(j=1; j<=days_num(year,i); j++)
		{
			printf("%-2d  ",j);//左对齐,宽度为2 
                                            
			if( count%7 == 0 && j!=days_num(year,i) )//避免某月最后一天也正好换行
			{
				printf("\n");
                                //count=0;
			}	
                        count ++;
		}
                printf("\n");
	}
}

void print_month(int month)//打印月数名称函数
{
	switch(month) 
	{
		case 1:printf("          JANUARY:\n");
		       break;
		case 2:printf("          FEBRUARY:\n");
		       break;
		case 3:printf("           MARCH:\n");
		       break;
		case 4:printf("           APRIL:\n");
		       break;
		case 5:printf("            MAY:\n");
		       break;
		case 6:printf("            JUNE:\n");
		       break;
		case 7:printf("            JULY:\n");
		       break;
		case 8:printf("           AUGUST:\n");
		       break;
		case 9:printf("          SEPTMBER:\n");
		       break;
		case 10:printf("         OCTOBER:\n");
		       break;
		case 11:printf("         NOVEMBER:\n");
		       break;
		case 12:printf("         DECEMBER:\n");
		       break;
		default : 
		       break;
	}
}

int days_num(int year,int month)//返回该月天数函数
{
	switch(month)
	{
		case 2:if( leap_year(year) )
		       {
		       		return 29;	
		       }
		       else 
			       return 28;
			break;
		case 1:
		case 3:
		case 5:
		case 7:
		case 8:
		case 10:
		case 12:
			return 31;
			break;
		case 4:
		case 6:
		case 9:
	        case 11:
			return 30;
			break;
		default : 
			break;
	}

}

void print_week(void)//打印周日到周一
{
	printf("Mon Tue Wen Thu Fri Sat Sun\n");
}

int firstday(int year,int month)//该月第一天是周几函数
{
	if(month==1 || month==2)//判断是否为1、2月
	{
		year--;
		month+=12;
	}
	return ( (1+2*month+3*(month+1)/5+year+year/4-year/100+year/400)%7 );
	//0-6 一到日
}

void print_space(int year,int month)//空格缩进函数
{
	int i=0;
	while(i<firstday(year,month))
	{
		printf("    ");
                i++;
	}
}


输入年份并输出当年的日历

输入年份并输出当年的日历