我正在我学校的一个实践项目中,该项目是构建一个类似于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
我将如何处理?有什么建议可以开始吗?
我将非常感谢您的帮助。
答案 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日,或者您正在工作的月份。我认为有两种通用方法可以解决此问题:
首先要解决。我要解决此问题的算法是一个叫做“ Zeller's congruence”的老栗子,尽管也有一些其他栗子。旧的C FAQ list在question 20.31中有几个。
让机器进行脏工作。要查找给定日期的星期几,请在struct tm
,tm_year
和tm_mon
字段中构造一个包含所需日期的tm_mday
。 (请记住,tm_mon
是基于0的,而tm_year
是基于1900的。)12:00分别填充tm_hour
,tm_min
和tm_sec
: 00用0或-1填充tm_isdst
。致电mktime
。输出时,tm_wday
将包含该日期的星期几。
最后,如果您到此为止,您可以担心命令行输入格式。如果是我,我就满足于解析
cal 7 2018
接受月份和年份为整数。如果您想接受您提到的所有其他变体,那将是一定程度的繁琐,繁琐的工作。有很多方法可以做到这一点。我会让您发现一些对您有用的技术。
最后,作为额外的信用挑战(这是一个真正的挑战!),正如Bathsheba在评论中建议的那样,请尝试使您的程序执行与标准Unix / Linux相同的操作{如果以以下方式调用{1}}命令
cal