Посчитать день месяца

Есть задача, нужно посчитать день месяца имея:

  1. Год
  2. Месяц
  3. Номер недели в месяце
  4. Номер дня в неделе

Даты меньше 2021 года не учитываются в задаче.

Пример: При подаче 2021 год, Август, Первая неделя, Вторник результат будет 3

Думал использовать strptime(), но она не работает с номером недели в месяце. Поэтому, наверно, сначала, нужно посчитать номер недели в году из входных данных, но тут я застрял. Помогите, пожалуйста. Можно, наверно даже, и так посчитать, без strptime()


Ответы (1 шт):

Автор решения: Sergey

Воспользуемся структурой

struct tm {
   int tm_sec;    /* Seconds (0-60) */
   int tm_min;    /* Minutes (0-59) */
   int tm_hour;   /* Hours (0-23) */
   int tm_mday;   /* Day of the month (1-31) */
   int tm_mon;    /* Month (0-11) */
   int tm_year;   /* Year - 1900 */
   int tm_wday;   /* Day of the week (0-6, Sunday = 0) */
   int tm_yday;   /* Day in the year (0-365, 1 Jan = 0) */
   int tm_isdst;  /* Daylight saving time */
};

объявленной в <time.h>. Выясним время (time_t) начала первого дня интересуещего нас месяца:

struct tm wrk;
struct tm *first_day;
time_t tt;

wrk.tm_year = year; // Год нам задан
wrl.tm_mon = mon;   // Тоже известен
wrk.tm_mday = 1;    // Начало месяца

/* 
Функция mktime() преобразует временную структуру с разбивкой, выраженную как местное время, в представление календарного времени. Функция игнорирует значения, предоставленные вызывающей стороной в полях tm_wday и tm_yday.
*/

tt = mktime(&wrk);


/*
Теперь, с помощью функции localtime() можно выполнить обратное действие - из времени начала первого дня месяца получить день недели этого дня.
*/
first_day = localtime(tt);

/*
В поле first_day->tm_wday содержится именно то, что нам и нужно - номер (0-6) дня недели первого числа заданного года и месяца.

В месяце может быть от 4-х до 6-и недель. Вычислим СМЕЩЕНИЕ воскресенья 
в первой неделе месяца, относительно первого числа. 
*/

int wd_offset;
wd_offset = -first_day->tm_wday; // Обратите внимание на знак "минус"!


/*
Теперь берём номер недели, умножаем на 7 и прибавляем смещение
*/

day_of_moon = 7 * week_num + wd_offset;

Как-то так, приблизительно :-)

→ Ссылка