有关开始使用C构建日历程序的建议

时间:2018-07-05 10:15:14

标签: c linux calendar

我正在我学校的一个实践项目中,该项目是构建一个类似于Linux或Mac命令行中的日历的C程序。该程序不必实现日历所具有的所有方法,但应为这些参数产生相同的输出

$ cal -m 11 2010
$ cal -m 13 2011
$ cal -m mar 2012
$ cal -m maRc 2013
$ cal -m MARCH 2014
$ cal -m MARCHY 2015
$ cal -m 5
$ cal 18
$ cal 2018
$ cal

我将如何处理?有什么建议可以开始吗?

我将非常感谢您的帮助。

1 个答案:

答案 0 :(得分:6)

这是一个很好的挑战,如果您从最初的原则着手,这将是非常困难的。您要求提供建议,所以我很乐意为您提供一些建议。

首先,编写代码以完全显示日历。您可能希望它看起来像这样:

Su Mo Tu We Th Fr Sa
 1  2  3  4  5  6  7
 8  9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30

对于您的第一个实现,假设每月的第一天是星期日。对于您的第一个实现,要么将月份的长度固定为30天,要么将其作为命令行参数。确保代码可以使用28、29、30或31天的月份。

第一个子问题显然仅涉及一些精心选择的循环和printf调用。但这会让您忙一阵子,特别是如果您是初学者。

接下来,弄清楚如何使它在几个月的工作时间(每月的第一天不是星期日)工作。您可能需要使它看起来像这样:

Su Mo Tu We Th Fr Sa
          1  2  3  4
 5  6  7  8  9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30

同样,这显然只涉及循环和printf调用。再次(现在),将第一天指示硬连线或从命令行传递。确保它适用于所有七个可能性。根据您编写第一个程序(假定星期天的程序)的方式,您可能可以进行一些增量修改,但是如果没有干净的方法来添加此可变性,请不要害怕丢掉所有东西,重新开始。

最后,我们进入困难的部分。 (但是,如果您尽管前面的工作很辛苦,也不必担心太多-下一步很难以其他方式完成。)显然,要制作一个 real 日历程序,我们将必须停止繁琐的工作,开始计算实际月份的实际长度以及该周的开始日期。

没有函数(至少在C和Unix中)直接告诉您给定月份中有多少天。没有功能可以直接告诉您每月的第一天。

对包含每个月中天数的12个元素的数组进行硬连线很简单,尽管您显然必须在years年中对2月进行一些特殊的操作。 (有关准确计算哪些年份是leap年的提示,请参见here。但是,如何确定一个月的星期几开始呢?这与“我如何找到给定日期的星期几?”是相同的问题,其中日期是1月1日或2月1日,或者您正在工作的月份。我认为有两种通用方法可以解决此问题:

  1. 首先要解决。我要解决此问题的算法是一个叫做“ Zeller's congruence”的老栗子,尽管也有一些其他栗子。旧的C FAQ listquestion 20.31中有几个。

  2. 让机器进行脏工作。要查找给定日期的星期几,请在struct tmtm_yeartm_mon字段中构造一个包含所需日期的tm_mday。 (请记住,tm_mon是基于0的,而tm_year是基于1900的。)12:00分别填充tm_hourtm_mintm_sec: 00用0或-1填充tm_isdst。致电mktime。输出时,tm_wday将包含该日期的星期几。

最后,如果您到此为止,您可以担心命令行输入格式。如果是我,我就满足于解析

cal 7 2018

接受月份和年份为整数。如果您想接受您提到的所有其他变体,那将是一定程度的繁琐,繁琐的工作。有很多方法可以做到这一点。我会让您发现一些对您有用的技术。

最后,作为额外的信用挑战(这是一个真正的挑战!),正如Bathsheba在评论中建议的那样,请尝试使您的程序执行与标准Unix / Linux相同的操作{如果以以下方式调用{1}}命令

cal