БлогNot. Неделя с двумя понедельниками :)

Неделя с двумя понедельниками :)

Вышло так в связи с переездом 30-го апреля на 28-е. Если работа зависит от дня недели, то весело, как мне. Зато потом чуть не неделя одних суббот.

Судя по моему календарику, в этом году 247 рабочих дней и 118 выходных + праздничных.

Отнимите от количества рабочих дней пусть даже 20 дней 4-недельного оплачиваемого отпуска (а у многих больше) и получите соотношение 227 к 138, то есть, почти 40% бездельных дней, прямо как в моём шуточном "расследовании" о том, сколько мы работаем на самом деле.

А кто будет на бомбёжки Сирии и чемпионаты по футболу президенту зарабатывать?

Учитывая, что "загнивающий Запад" давно поговаривает о 4-дневной рабочей неделе, пора и в нашем заповеднике её вводить. Отпуска, конечно, нужно отменить, тем более, что при достижении final level они становятся явно не нужны, Юрьев день же в царской России в итоге был отменён!..

В общем, сколько в году дней с понедельника по четверг включительно?

Найти это не сложней, чем количество чёрных пятниц, и формулу наверняка можно вывести сложности O(1), только лень. А перебором, конечно, минутное дело.

Получать день недели "стандартно" через <ctime>, мне кажется, имеет смысл только в том случае, если вы уверены, для какого интервала лет вам это нужно.

Скажем, стандартный пример вот отсюда теоретически должен работать для дат с 1900 года, практически же он в моём Studio объявил пятницей взятый для пробы понедельник 21 октября 1940.

В общем, локаль для старых дат - бяка, старого доброго Зеллера никто не отменял.

Мы его здесь ещё упростим, чтобы была в блоге getWeekDay на C++, а программка получится такой:

//Visual Studio 2015
#include <iostream>
using namespace std;

unsigned int getWeekDay (unsigned int d, unsigned int m, unsigned int y) {
 //День недели, без проверки корректности даты
 if (m < 3) { m += 12;  --y; }
 unsigned int N1 = (26 * (m + 1)) / 10;
 unsigned int N2 = (125 * y) / 100;
 unsigned int N3 = d + N1 + N2 - (y / 100) + (y / 400) - 1;
 return N3 % 7; //0==Вс,1==Пн...,6==Сб
}

unsigned int count (unsigned int year) { 
 //Сколько в году year дней с Пн по Чт включительно
 unsigned int cnt = 0;
 int mondays[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };
 if ((year % 4 == 0) && (year % 100 != 0) || (year % 400 == 0)) mondays[1] = 29;
 int wkd = getWeekDay (1,1,year);
 for (unsigned int m = 1; m <= 12; m++) {
  for (unsigned int d = 1; d <= mondays[m - 1]; d++) {
   if (wkd>0 && wkd<5) cnt++;
   wkd = getWeekDay(d, m, year);
  }
 }
 return cnt;
}

int main() {
 cout << count(2018); //209
 cin.ignore();
 return 0;
}

Видно, что в текущем году 209 дней с week day от понедельника до четверга включительно. Это более 57% рабочих дней, то есть, отдыха остаётся даже больше (около 43% дней), а скрепы соблюдены :)

Ну да ладно, у меня-то не 4-дневка, пора дальше за дела, а то понедельник завтра :)

27.04.2018, 17:36 [1984 просмотра]


теги: c++ ошибка маразм числа дата алгоритм время

К этой статье пока нет комментариев, Ваш будет первым