2d - - - - - -\,
mfDay, mfDay + 1, mfDay + 2, mfDay + 3, mfDay + 4, mfDay
+ 5, mfDay + 6, msDay, msDay + 1, msDay + 2, msDay
+ 3, msDay + 4, msDay + 5, msDay + 6, mtDay, mtDay
+ 1, mtDay + 2, mtDay + 3, mtDay + 4, mtDay + 5,
mtDay + 6); mfDay += 7; msDay += 7; mtDay += 7; continue; }
//打印第1个月的第5周或第6周
if (mfDays - mfDay > 6) { //未打印天数不少于7天时,能够占满1周,直接打印
printf(\- - - - - - \, mfDay, mfDay + 1, mfDay
+ 2, mfDay + 3, mfDay + 4, mfDay + 5, mfDay + 6); mfDay += 7;
} else { //未打印天数不足一周时,按以下方式打印 printf(\);
for (j = 0; j < 7; ++j) {
//有数据打印数据,没有数据用空格填充 if (mfDay <= mfDays) {
printf(\, mfDay++); } else {
printf(\); } } }
printf(\);
//打印第2个月的第5周或第6周 if (msDays - msDay > 6) {
printf(\, msDay, msDay + 1, msDay + 2,
msDay + 3, msDay + 4, msDay + 5, msDay + 6); msDay += 7; } else {
for (j = 0; j < 7; ++j) { if (msDay <= msDays) {
printf(\, msDay++); } else {
printf(\); } } }
printf(\);
//打印第3个月的第5周或第6周 if (mtDays - mtDay > 6) {
printf(\, mtDay, mtDay + 1, mtDay + 2,
mtDay + 3, mtDay + 4, mtDay + 5, mtDay + 6); mtDay += 7; } else {
for (j = 0; j < 7; ++j) { if (mtDay <= mtDays) {
printf(\, mtDay++); } } } }
printf(\); } /**
*特殊的1752年第3季度:7月8月9月 */
void Print1752_3Quarter() { char space = 32;
printf(\, space, space, space);
printf(\5 6 7 8 9 10 11 2 3 4 5 6 7 8 17 18 19 20 21 22 23\\n\);
printf(\29 30\\n\);
printf(\); printf(\); printf(\, space); } /**
* 打印指定月的月历 */
void PrintMonthlyCalendar(int year, int month) { int dayOfWeek = DayOfWeek(year, month, 1); switch (month) { case 1:
PrintMonthName(\, year);
PrintCommonMonthlyCalendar(dayOfWeek, 31); break; case 2:
PrintMonthName(\, year); if (year < 1753 && year % 4 == 0) {
PrintCommonMonthlyCalendar(dayOfWeek, 29); break;
} else if ((year % 4 == 0 && year % 100 != 0) || year % 400 ==
0) {
PrintCommonMonthlyCalendar(dayOfWeek, 29); break; }
PrintCommonMonthlyCalendar(dayOfWeek, 28); break; case 3:
PrintMonthName(\, year);
PrintCommonMonthlyCalendar(dayOfWeek, 31); break; case 4:
PrintMonthName(\, year);
PrintCommonMonthlyCalendar(dayOfWeek, 30); break; case 5:
PrintMonthName(\, year);
PrintCommonMonthlyCalendar(dayOfWeek, 31); break; case 6:
PrintMonthName(\, year);
PrintCommonMonthlyCalendar(dayOfWeek, 30); break; case 7:
PrintMonthName(\, year);
PrintCommonMonthlyCalendar(dayOfWeek, 31); break; case 8:
PrintMonthName(\, year);
PrintCommonMonthlyCalendar(dayOfWeek, 31); break; case 9:
PrintMonthName(\, year); if (year == 1752) { //特殊的1752-9 printf(
\20 21 22 23\\n24 25 26 27 28 29 30\); break; }
PrintCommonMonthlyCalendar(dayOfWeek, 30); break; case 10:
PrintMonthName(\, year);
PrintCommonMonthlyCalendar(dayOfWeek, 31); break; case 11:
PrintMonthName(\, year);
PrintCommonMonthlyCalendar(dayOfWeek, 30); break; case 12:
PrintMonthName(\, year);
PrintCommonMonthlyCalendar(dayOfWeek, 31); break; default: break; } } /**
* 以下函数的作用仅仅是将月名在水平方向上打印到月历的中间 */
void PrintMonthName(char *monthName, int year) { char space = 32; int preSpaces = 0;
preSpaces = (21 - strlen(monthName) - a - 1) / 2;
printf(\, preSpaces, space, monthName, year); printf(\); } /**
* 根据一个月的天数及该月有几天这两个参数,打印出该月的月历 */
void PrintCommonMonthlyCalendar(int dayOfWeek, int days) { int i, j, day = 1; char space = 32;
int weeks = (days + dayOfWeek) / 7 + 1; //计算出该月有几周 printf(\); printf(\, 3 * dayOfWeek, space); for (i = 0; i < weeks; ++i) { if (i == 0) { //打印第1周
for (j = dayOfWeek; j < 7; ++j) { printf(\, day); day++; }
continue; }
//打印第2周到倒数第2周 if (i < weeks - 1) {
printf(\, day, day + 1, day + 2, day
+ 3, day + 4, day + 5, day + 6); day += 7; continue; }
//打印最后一周 printf(\);
for (j = 0; j < 7; ++j) { if (day <= days) {
printf(\, day++); } }
printf(\); } } /**
* 打印给定的年、月、日是周几 */
void PrintDayOfWeek(int year, int month, int day) {
char *names[9] = { \, \, \, \, \,
\, \ };
int dayOfWeek = DayOfWeek(year, month, day); if (dayOfWeek == -1) { return; }
printf(\%s\\n\, year, month, day, *(names + dayOfWeek)); } /**
* 以下函数返回给定的年、月、日是周几 */
int DayOfWeek(int year, int month, int day) {
if ((year < 1752) || (year == 1752 && month < 9) || (year == 1752 && month
== 9 && day < 3)) {
return ((year - 1) + (year - 1) / 4 + CurrentDays(year, month, day) + 5)
% 7; }
if (year == 1752 && month == 9 && (day > 2 && day < 14)) { printf(\本万年历中没有%d-%d-%d这一天\\n\, year, month, day); return -1; }
if (year > 2199) {
year = (year - 1800) % 400 + 1800; }
return ((year - 1) + (year - 1) / 4 - (year - 1) / 100 + (year - 1) / 400
+ CurrentDays(year, month, day)) % 7; } /**
* 以下函数计算从给定年的1-1到month-day的天数 */
int CurrentDays(int year, int month, int day) {