if (day < 1 || day > 31) {
printf(\, day); return 0; }
return 1; break; case 6:
if (day < 1 || day > 30) {
printf(\, day); return 0; }
return 1; break; case 7:
if (day < 1 || day > 31) {
printf(\ return 0; }
return 1; break; case 8:
if (day < 1 || day > 31) {
printf(\ return 0; }
return 1; break; case 9:
if (day < 1 || day > 30) {
printf(\ return 0; }
return 1; break; case 10:
if (day < 1 || day > 31) {
printf(\ return 0; }
return 1; break; case 11:
if (day < 1 || day > 30) {
printf(\ return 0; }
return 1; break; case 12:
if (day < 1 || day > 31) {
printf(\ return 0;
, day); , day); , day); , day); , day); , day); }
return 1; break; default: break; return 0; } } /**
* 以下函数返回一个包含当前年 月 日的整型数组 */
int* CurrentCal() { time_t nowtime;
struct tm *timeinfo; time(&nowtime);
timeinfo = localtime(&nowtime); int cal[3];
cal[0] = timeinfo->tm_year + 1900; cal[1] = timeinfo->tm_mon + 1; cal[2] = timeinfo->tm_mday; return cal; } /**
* 以下函数打印年历,以月为单位,分成四行打印,每行打印三个月 */
void PrintCalendar(int year) { int i;
for (i = 0; i < 4; ++i) { switch (i) { case 0:
//打印第1行,1-3月的月历
printf(\March\\n\);
printf(
\--------------------\\n\); printf(
\Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa\\n\);
PrintCommonCalendar(year, 1); break; case 1:
//打印第2行,4-6月的月历
printf(\June\\n\);
printf(
\--------------------\\n\); printf(
\Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa\\n\);
PrintCommonCalendar(year, 2); break; case 2:
//打印第3行,7-9月的月历 printf(
\September\\n\); printf(
\--------------------\\n\); printf(
\Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa\\n\);
PrintCommonCalendar(year, 3); break; case 3:
//打印第4行,11-12月的月历 printf(
\December\\n\);
printf(
\--------------------\\n\); printf(
\Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa\\n\);
PrintCommonCalendar(year, 4); break; default: break; } } } /**
* 打印出给定年,给定行的3个月的月历。 */
void PrintCommonCalendar(int year, int row) {
int mfOfWeek, mfDays; //mfOfWeek表示该行第1个月的1号是周几,mfDays表示第1个月的天数
int msOfWeek, msDays; //mfOfWeek表示该行第2个月的1号是周几,mfDays表示第2个月的天数
int mtOfWeek, mtDays; //mfOfWeek表示该行第3个月的1号是周几,mfDays表示第3个月的天数 switch (row) { case 1:
mfOfWeek = DayOfWeek(year, 1, 1); mfDays = 31;
msOfWeek = DayOfWeek(year, 2, 1); msDays = 28;
mtOfWeek = DayOfWeek(year, 3, 1); mtDays = 31;
PrintOneQuarter(year, mfOfWeek, mfDays, msOfWeek, msDays, mtOfWeek,
mtDays, row); break; case 2:
mfOfWeek = DayOfWeek(year, 4, 1); mfDays = 30;
msOfWeek = DayOfWeek(year, 5, 1); msDays = 31;
mtOfWeek = DayOfWeek(year, 6, 1); mtDays = 30;
PrintOneQuarter(year, mfOfWeek, mfDays, msOfWeek, msDays, mtOfWeek,
mtDays, row); break; case 3:
if (year == 1752) {
Print1752_3Quarter(); break; }
mfOfWeek = DayOfWeek(year, 7, 1); mfDays = 31;
msOfWeek = DayOfWeek(year, 8, 1); msDays = 31;
mtOfWeek = DayOfWeek(year, 9, 1); mtDays = 30;
PrintOneQuarter(year, mfOfWeek, mfDays, msOfWeek, msDays, mtOfWeek,
mtDays, row); break; case 4:
mfOfWeek = DayOfWeek(year, 10, 1); mfDays = 31;
msOfWeek = DayOfWeek(year, 11, 1); msDays = 30;
mtOfWeek = DayOfWeek(year, 12, 1); mtDays = 31;
PrintOneQuarter(year, mfOfWeek, mfDays, msOfWeek, msDays, mtOfWeek,
mtDays, row); break; default: break; } } /**
* 以下函数打印一个季度,也即是在同一行上的3个月的月历。 *
* 打印方式肯定是从上到下,从左到右依次打印。 *
* 每月至多有6周,至少有5周;第1周、第5周和第6周(如果有第6周)是需要特殊处理 * 的三个周,因为这3周并不一定总是有7天。 */ void PrintOneQuarter(int year, int mfOfWeek, int mfDays, int msOfWeek, int msDays, int mtOfWeek, int mtDays, int row) {
int mfDay = 1, msDay = 1, mtDay = 1; //对已经打印的天数记数 int i, j;
char space = 32;
//如果要打印的是1-3月的月历,则应该判断一下该年的2月是29天不是29天 if (row == 1) {
if ((year < 1753 && year % 4 == 0) || (year >= 1753 && ((year % 4 == 0
&& year % 100 != 0) || year % 400 == 0))) { msDays = 29; } }
for (i = 0; i < 6; ++i) { if (i == 0) {
//输出第一个月的第一周 if (mfOfWeek > 0) {
printf(\, 3 * mfOfWeek, space); }
for (j = mfOfWeek; j < 7; ++j) { printf(\, mfDay); mfDay++; }
//输出第二个月的第一周
printf(\, 3 * msOfWeek + 1, space); for (j = msOfWeek; j < 7; ++j) { printf(\, msDay); msDay++; }
//输出第三个月的第一周
printf(\, 3 * mtOfWeek + 1, space); for (j = mtOfWeek; j < 7; ++j) { printf(\, mtDay); mtDay++; }
continue; }
//打印2-4周 if (i < 4) { printf(
\