Как я могу узнать все даты данного дня в этом месяце? - PullRequest
4 голосов
/ 01 сентября 2010

Мне нужно написать программу на C, которая, учитывая название дня, возвращает все даты в этом месяце, когда этот день будет.

Например, если введено «воскресенье»«результат должен быть: 5,12,19,26 (какие дни будут в воскресенье в этом месяце.)

Кто-нибудь знает, как это сделать?Я много пробовал.

Ответы [ 3 ]

2 голосов
/ 01 сентября 2010

Вы можете использовать функцию time () для получения текущего времени.

Затем используйте функцию localtime (), чтобы получить структуру (struct tm) с информацией (год, месяц, день, ...) текущего времени.

Из "struct tm" получите tm_mday и tm_wday. Используйте эти поля для определения следующего или предыдущего воскресенья. например если tm_mday равен 12, а tm_wday равен 3 (среда), то теперь мы считаем, что 9-е число этого месяца - воскресенье (12-3 = 9). Из этого числа просто добавьте или вычтите 7, чтобы получить все остальные воскресенья.

1 голос
/ 01 сентября 2010

1) Возьмите строку (название дня недели) из ввода (используйте scanf или gets)

2) Преобразуйте его в число (найдите его индекс в таблице дней недели, используя цикл и strcmp), присвойте 0 воскресенью, 1 - понедельнику ...

3) Получить текущее время с помощью функции time и преобразовать его в tm struct с localtime function

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 struct
  • дублировать структуру
  • увеличение на 1 tm_mon в дубликате (посмотрите за последний месяц! В этом случае увеличьте tm_year на 1 и установите tm_mon в 1)
  • Преобразование опор стенда в time_t с помощью функции mktime и вычисление разницы (просто вычтите эти time_t значения), преобразование результата из секунд в дни (деление на 60 * 60 * 24)

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 дней.
Итак, просто - предположим, что у нас 28 дней в текущем месяце, если first_mday_of_given_wday больше 3, в противном случае вычислите число, как показано на 5-м шаге.

1 голос
/ 01 сентября 2010

Тебе тоже нужно это знать за данный год? Или это только в этом году? Если вам нужно знать его за какой-либо конкретный год, вы можете сделать перечисление «дней в месяц», имеющее один для високосных лет и один для не високосных.

Вам просто нужно знать, в какой день недели начался год (т. Е. «Понедельник», «вторник» и т. Д.)

По крайней мере, у вас будет 5 дат для любого месяца, поэтому вы можете иметь массив с фиксированной длиной целых чисел.

Вы знаете, что григорианский календарь повторяется каждые 400 лет, и что если год X начинается с дня "Y", то год X + 1 начинается с дня («Y» + 1)% 7, если x не високосный год, если это високосный год, он начинается с дня («Y» + 2). это может дать вам первую дату любого года, и, зная, сколько дней имеют все месяцы для любого данного года, вы можете легко узнать, с какой даты начинается этот месяц («понедельник» и т. д.).

Тогда все, что вам нужно сделать, это что-то вроде

int offset = 0;
int i;
while (myDate + offset != monthStartingDate) {
    offset++;
}
i = offset + monthStartingDate;

(myDate - номер дня недели, а monthStartingDate - номер дня недели для первого дня этого месяца)

когда вы выйдете из этого цикла, у вас будет первое вхождение, затем вы просто добавляете 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...