编写万年历C语言高手进
发布网友
发布时间:2022-04-23 05:26
我来回答
共1个回答
热心网友
时间:2023-11-04 22:02
#include <stdio.h>
#include <stdlib.h>
#define TRUE 1
enum{Sunday, Monday, Tuesday, Wednesday,
Thursday, Friday, Saturday};/*0,1,2....*/
int M_GetYear(void);
void M_PrintMonthNum(int year);
void M_PrintMonth(int month, int year);
char *M_MonthName(int month);
int M_MonthDays(int year, int month);
int M_IsLeapYear(int year);
int M_YeFirstMonthDay(int year, int month);
void M_BlankUnit(int weekday);
int main(void)
{
int year;
year = M_GetYear();
M_PrintMonthNum(year);
getch();
}
/*************************************************
函数名称:M_GetYear
函数功能:输入一个年份
被本函数调用的函数清单:无
函数返回值:(int)
*************************************************/
int M_GetYear(void)
{
int year;
while(TRUE)
{
printf("(大于1900)请输入年份 : ");
scanf("%d", &year);
if(year > 1900)/*计人最多活106岁*/
{
return year;
}
}
}
/*************************************************
函数名称:M_PrintMonthNum
函数功能:调用每个月份
被本函数调用的函数清单:M_PrintMonth
输入参数:year
函数返回值:(void)
**************************************************/
void M_PrintMonthNum(int year)
{
int month;
for(month = 1; month <= 12; month++)
{
M_PrintMonth(month, year);
printf("\n");
}
}
/*************************************************
函数名称:M_PrintMonth
函数功能:打印万年历
被本函数调用的函数清单:M_MonthName,M_YeFirstMonthDay
,M_BlankUnit..
调用本函数的函数清单:M_PrintMonthNum
输入参数:month, year
函数返回值:(void)
**************************************************/
void M_PrintMonth(int month, int year)
{
int weekday, ndays, day;
printf(" %s", M_MonthName(month));/*打印开头一行的月份*/
printf("\n Su Mo Tu We Th Fr Sa\n");
ndays = M_MonthDays(year, month);
weekday = M_YeFirstMonthDay(year, month);
M_BlankUnit(weekday);
for(day = 1; day <= ndays; day++)
{
printf(" %2d", day);
if(weekday == Saturday)/* 是星期六就打印换行*/
{
printf("\n");
}
weekday = (weekday + 1) % 7;/* 计算是星期几*/
}
if(weekday != Sunday)
printf("\n");
}
/*************************************************
函数名称:MonthName
函数功能:返回每个月份的英文
调用本函数的函数清单:M_PrintMonth
输入参数:month
函数返回值:(char)
**************************************************/
char *M_MonthName(int month)
{
char *name[] = {
"Illegal month",
"January", "February", "March",
"April", "May", "June",
"July", "August", "September",
"October", "November", "December"
};
return (month < 1 || month > 12) ? name[1] : name[month];
}
/*************************************************
函数名称:M_MonthDays
函数功能:返回每个月份的天数
被本函数调用的函数清单:IsLeapYear
调用本函数的函数清单:M_PrintMonth, M_YeFirstMonthDay
输入参数:year, month
函数返回值:(int)
**************************************************/
int M_MonthDays(int year, int month)
{
switch(month)
{
case 2 :
if(M_IsLeapYear(year))/* 如果是闰年*/
{
return 29;
}
return 28;
case 4 : case 6 : case 9 : case 11 :
return 30;
default :
return 31;
}
}
/*************************************************
函数名称:IsLeapYear
函数功能:返回是否是闰年的bool值
调用本函数的函数清单:M_MonthDays
输入参数:year
函数返回值:(int,返回bool值1或0)
**************************************************/
int M_IsLeapYear(int year)
{
return (year % 4 == 0 && year % 100 != 0) || year % 400 == 0;
}
/*************************************************
函数名称:M_YeFirstMonthDay
函数功能:年份第一个月第一天是星期几,开头enum
从Sunday(0开始),则从(weekday + 1) %7,weekday
是过几天后,能推出几天后就是星期几了,后面依次类推
被本函数调用的函数清单:M_MonthDays
调用本函数的函数清单:M_PrintMonth
输入参数:year, month
函数返回值:(int)
**************************************************/
int M_YeFirstMonthDay(int year, int month)
{
int i, weekday;
weekday = Monday;
for(i = 1900; i < year; i++)
{
weekday = (weekday + 365) % 7;
if(M_IsLeapYear(i))/* 如果是闰年就加1*/
{
weekday = (weekday + 1) % 7;
}
}
for(i = 1; i < month; i++)
{
weekday = (weekday + M_MonthDays(year, i)) % 7;
}
return weekday;
}
/*************************************************
函数名称:M_BlankUnit
函数功能:年份第一个月第一天星期几就要空几个空格
调用本函数的函数清单:M_PrintMonth
输入参数:weekday
函数返回值:(void)
**************************************************/
void M_BlankUnit(int weekday)
{
int i;
for(i = 0; i < weekday; i++)
{
printf(" ");
}
}