我必须在C中编写一个程序,该程序以一天的名义返回本月所有日期。
例如,如果输入为“星期日”,则输出应为:5,12,19,26
(星期日将是本月的天数。)
有人知道怎么做吗?我已经尝试了很多。
答案 0 :(得分:2)
您可以使用time()函数获取当前时间。
然后使用localtime()函数获取一个struct(struct tm),其中包含当前时间的信息(年,月,日,...)。
从“struct tm”获取tm_mday和tm_wday。使用这些字段确定下一个或上一个星期日。例如如果tm_mday是12,而tm_wday是3(星期三),那么我们现在认为本月9日是星期天(12-3 = 9)。从这个数字简单地加上或减去7得到所有其他星期日。
答案 1 :(得分:1)
你也需要了解一年?或者这只是今年?如果你需要知道任何一年,你可以做一个“每月一天”的枚举,一个用于闰年,一个用于非闰年。
你只需要知道一周中哪一天开始(即“星期一”,“星期二”等)
对于任何给定月份,您至少会有5个日期,因此,您可以拥有固定长度的整数数组。
你知道格里高利历每 400 年重复一次,如果一年X以日“Y”开始,则年X + 1将开始with day(“Y”+ 1)%7如果x不是闰年,如果是闰年,则以day(“Y”+ 2)开始。 这可能会给你任何一年的第一个日期,并知道任何一年的所有月份都有多少天,你可以很容易地得到那个月的开始日期(“星期一”等)。
然后,你所要做的就是
int offset = 0;
int i;
while (myDate + offset != monthStartingDate) {
offset++;
}
i = offset + monthStartingDate;
(myDate是星期几,dayStartingDate是该月第一天的星期几)
当你离开那个循环时,你会有第一个发生,然后,你只需要加7,直到我超出月界限。
你可以将每个i添加到数组中..
int res[5] = {0,0,0,0,0}
for ( ; i < daysOfMonth(month, year); i += 7) {
int res[i / 7] = i;
}
然后你就返回res。
哦,我不知道你能使用日期功能:P我认为练习的想法是练习C:P
答案 2 :(得分:1)
1)从输入中取一个字符串(工作日名称)(使用scanf
或gets
)
2)将其转换为数字(使用循环和strcmp
在工作日的表中找到它的索引),将0分配给星期日,将1分配给星期一......
3)获取time
函数的当前时间,并将其转换为tm
结构localtime
函数
4)从tm
struct计算给定工作日当月的第一天
first_mday_of_given_wday = (tm_struct.tm_mday + given_wday - tm_struct.tm_wday + 6) % 7 + 1
5)了解当月的天数。要做到这一点:
tm_mday
{0} tm_isdst
tm
<{1}} tm_mon
(注意上个月!在这种情况下,将tm_year
增加1并将tm_mon
设置为1)time_t
函数将booth strutcs转换为mktime
并计算差异(只减去这些time_t
值),将结果从秒转换为天(除以60 * 60 * 24)< / LI>
6)通过计算范围运行循环:
for (i = first_mday_of_given_wday; i <= num_days_in_month; i += 7) printf("%d, ", i)
在某些情况下可以省略第5步。我们知道一个月可以有28到31天。如果当月的假设日期29,30,31不能是给定的工作日,我们可以假设当前月份有28天。
如此简单 - 如果first_mday_of_given_wday
大于3,则假设我们当月有28天,否则计算第5步所示的数字。