我在C编程课中遇到了以下问题:
编写一个程序,提示用户输入一年,然后输出日历(全年)。
我不知道如何解决这个问题。我通常可以开始我的作业问题(这是一个可选的挑战问题),但我真的迷路了。我们已经完成了Deitel& amp;的1-10章。 Deitel(循环,数组,指针,I / O等),但我根本不知道如何处理它。任何提示或建议将不胜感激。
答案 0 :(得分:4)
它可以帮助您理解日历的数学。如果您的大学图书馆中没有精彩的图书Calendrical Calculations,他们可能会在 Software-Practice&经验。并请你的教授为图书馆索取这本书。
答案 1 :(得分:3)
一般来说,当你遇到像这样的大问题时,你想把它分解成更容易解决的小问题。
这是一个可能的小问题:如果您知道一个月中有多少天,以及该月的第一天是什么工作日,您可以输出该月的日历吗?
答案 2 :(得分:1)
最难的部分是确定一年中哪一天开始。
http://en.wikipedia.org/wiki/Calculating_the_day_of_the_week
但即使没有这方面的知识,当我第一次实施这个时,我使用了一个参考日期(例如,你知道今天,2010年1月11日是星期一),并从那里开始计算天数。 (请记住,闰年有额外的一天,闰年是每4年除了每100年除外400年除外。)
答案 3 :(得分:1)
此代码是否符合条件? : - )
char command[]="cal 2010";
sprintf(command,"cal %d",argv[1]);
system(command);
它假定路径中有 cal 的Unix机器。
答案 4 :(得分:1)
你需要在1月1日的第一天找到
然后打印日期。
转到https://sourceforge.net/projects/c-cpp-calender/
仔细阅读代码,你会理解它
答案 5 :(得分:0)
良好的开端可能是 localtime(3)和 mktime(3)功能。或者,您可以从头开始实施相关的日期算术。然后,简单地,生成日历的第一行(找到对应于1月1日的工作日,然后在正确的位置打印taht,然后打印一周的其余部分),然后打印除最后一行之外的所有行,然后打印最后一行线。
根据您是否希望按月分页日历,这可能会更好地按月而不是按年进行。
答案 6 :(得分:0)
好吧,先找出问题的算法部分 - 给定一年,找到1月1日的那一天。
在此之后,只需记下每个月的天数(将其存储在一个数组中,比如num_days[]
),并记下一年中的月数和几个月的字符串数组。 / p>
例如最外层循环遍历几个月。说,迭代for(i=0;i<NumMonths;++i)
。然后,对于每个月,打印字符串,例如month[i]
,然后换行。
然后,使用简单的标签打印Sun Mon Tue ...和另一个换行符。
然后使用Jan 1日对应(称之为FirstDay
),插入空格,并从那天开始。继续打印日期和换行符,直到您点击max_month[i]
31
(1月份)。存储上个月最后一天的日期名称,并重申将该日视为FirstDay
。
答案 7 :(得分:0)
你需要开始几件事。首先,您需要一个公式来计算输入的任何年份的1月1日的星期几。您还需要一个公式来确定年份是否为闰年。通过简单的Google搜索很容易找到这两个公式。您需要的第三个项目是一个简单的数组,其中包含非闰年12个月中每个月的天数。
一旦你掌握了这些东西,就可以确定一年中每个月的工作日。确保在闰年中占2月29日。从那里,您只需要创建一个功能,以一种与挂在墙上的日历类似的形式创建月历。首先尝试在纸上绘制所需的布局,然后将其用作模板以创建适当的格式语句。
答案 8 :(得分:0)
可以查看doomsday算法。这会让你有一些“厄运日”,就像1月31日是2008年的世界末日,也就是星期六。你可以从他们的
向后工作答案 9 :(得分:0)
基本上,有两种方法:
简单/实用的方式:解决任务,忘记其他一切。在这里,您可以查看mktime()
的文档(您将在下面找到基于mktime的示例..)。
科学/工程方式:学会了解它的工作原理!您可以从great wikipedia article about the gregorian calendar开始。阅读,理解它,编写实现基础算法的代码(已知,没有火箭科学,有可能)。这将大大提高你的技能(事实上,你真的应该做这样的事情,也许不是日历而是另一个话题,它会让你在理解所有事情方面有一个很大的飞跃)。
现在开始使用一些实用的代码。 mktime()
有一个很棒的功能:它知道日历细节,并且它接受例如日期“2010-01-60”并将其转换为2010年2月29日。但是,这只适用于1970年以后的日期。它不适用于早期日期(虽然我不是100%肯定,但它不应该'因为unix时间从1970年1月1日开始,但是尝试使用其他日期,可能mktime()
不限于unix时间。)
伪代码,每天打印一行(YYYY-MM-DD):
void print_cal( int year ) {
static char weekdays[] = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };
struct tm tm;
for( int day=0; day<365; ++day ) {
memset( &tm, 0, sizeof(tm) );
tm.tm_year = year - 1900;
tm.tm_mday = day;
mktime( &tm ); // modifies tm
printf( "%04d-%02d-%02d, %s\n", tm.tm_year, tm.tm_mon+1, tm.tm_mday, weekdays[tm.tm_wday] );
}
}
此代码忽略了闰年。你仍然需要调整它以适应闰年!结果还不是很漂亮,每天只有一行。
编辑:增加工作日的输出。