程序设计导引及在线实践

Page 123

2004-10-16 Saturday 2004-10-17 Sunday 解题思路 这道题目使用的背景知识是闰年的定义和公历日历中一年 12 个月中每个月的日期数。 根据题目要求,所有涉及的数值都是用整数可以表示的。这个问题可以分解成两个彼此 独立的问题:一个是要求的那天是星期几,另一是要求的那天是哪年哪月那天。第一个问题 比较简单,知道 2000 年 1 月 1 日是星期几后,只要用给定的日期对 7 取模,就可以知道要 求的一天是星期几。第二个问题相对麻烦一些。我们用 year, month, date 分别表示要求的日 期的年、月、日。当输入一个整数 n 时,如果 n 大于等于一年的天数,就用 n 减去一年的天 数,直到 n 比一年的天数少(这时假设剩下天数为 m),一共减去多少年 year 就等于多少; 如果 m 大于等于一个月的天数,就用 m 减去一个月的天数,直到 m 比一个月的天数少(这 时假设剩下的天数为 k),一共减去多少个月 month 就等于多少;这时 k 为从当月开始逝去 的天数,k+1 就是要求的 date。这里减去一年的天数时要判断当年是否是闰年,减去一月时 要判断当月有几天。

1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23.

参考程序 #include <stdio.h> int type(int ); char week[7][10]={"Saturday", "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday"}; int year[2]={365,366}; //year[0]表示非闰年的天数,year[1]表示闰年的天数。 int month[2][12]={31,28,31,30,31,30,31,31,30,31,30,31,31,29,31,30,31,30,31,31,30,31,30,31}; //month[0]表示非闰年里每个月的天数,month[1]表示闰年里每个月的天数。 void main() { int days, dayofweek; //days 表示输入的天数,dayofweek 表示星期几。 int i = 0, j = 0; while (scanf("%d", &days) && days != -1) { dayofweek = days % 7; for(i = 2000; days >= year[type(i)]; i++) days -= year[type(i)]; for(j = 0; days >= month[ type(i) ][ j ]; j++) days -= month[ type(i) ][ j ]; printf("%d-%02d-%02d %s\n", i, j + 1, days + 1, week[dayofweek]); } } int type(int m){ //判断第 m 年是否是闰年,是则返回 1,否则返回 0。 if(m % 4 != 0 || (m % 100 == 0 && m % 400 != 0)) return 0; //不是闰年 else return 1; // 是闰年 } 实现中常见的问题 问题一:逻辑过于复杂,导致程序出错。

121


Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.