万年历算法的实现(3)

2019-04-22 22:11

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) {


万年历算法的实现(3).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:珠海农用无人机统防统治植保作业工作方案

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: