我怎样才能找到这个月某一天的所有日期?

时间:2010-09-01 12:24:50

标签: c

我必须在C中编写一个程序,该程序以一天的名义返回本月所有日期。

例如,如果输入为“星期日”,则输出应为:5,12,19,26(星期日将是本月的天数。)

有人知道怎么做吗?我已经尝试了很多。

3 个答案:

答案 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)从输入中取一个字符串(工作日名称)(使用scanfgets

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)了解当月的天数。要做到这一点:

  • 将1放入tm_mday {0} tm_isdst tm <{1}}
  • 复制结构
  • 在副本中增加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步所示的数字。