首先看 getYear 函数。这个函数的功能只是输入年份数据,可以直接用 Python 的基本 语句实现,无需分解为新的功能模块。具体代码如下:

    接着考虑 firstDay 函数的设计。这个函数的功能是计算 year 年 1 月 1 日是星期几,因为年历是按星期来组织每一天的显示位置的,而只要知道 1 月 1 日的显示位置,其后所有日期的显示位置也就确定了。

    在 calendar 程序的规格说明中说明了,我们以 1900 年 1 月 1 日(星期一)作为基准日, 只要算出 year 年 1 月 1 日距离基准日的天数,就能知道这一天是星期几。因为从基准日开 始,过 1 天是星期二,过 2 天是星期三,…,过 6 天是星期日,过 7 天又是星期一,…。一 般地,过 n 天是星期(n+1)%7(值为 0 表示星期天)。

    其中 k 是从 1900 到 year(不含)之间的闰年个数。

    看上去闰年个数 k 还不清楚如何求得,我们按惯例假设一个新函数 leapyears()能够

    返回所需的 k。于是可以设计 firstDay 函数如下:

    函数体的第一行用于打印年份信息,接下去是打印 12 个月的日历的 for 语句。打印每个月 的日历需要知道该月 1 日是星期几。printCalendar 的参数 w 是前面算出来的 1 月 1 日 的星期信息,2 月到 12 月的 1 日则由 oneMonth 函数返回至此,我们完成了第二层设计, 可以用图 4.8 中的结构图表示到目前为止的设计结果。注意,为简明起见,图中省略了各模 块之间的界面数据。

    图 4.8 calendar 程序的第二层结构图