C/C++

Очередная задача по C++

Вводится число Т – порядковый день в году. Определить номер месяца М и дня недели D,
соответствующих Т. (Например, если Т=365. то М=12, а D=31).
Задачу нужно решить с использованием оператора выбора.
  Прошу прощения за то, что посоветую не идею-фикс, а идею фикции. Сознаю, что следующее может обернуться говнокодом, и за это тоже приношу извинения.

  Задачу нужно решить с использованием оператора выбора? А что, если трансформировать оператор выбора в линейный блок? Для этого в условии выбора указывается константа, та же константа значится в первой ветви case и опущено ключевое слово «break».

switch (1)
{
case 1: if (T > 0 && T < 32) {M = 1; D = T;} //   Январь
case 2: if (T > 31 && T < 60) {M = 2; D = T - 31;} //   Февраль
case 3: if (T > 59 && T < 91) {M = 3; D = T - 59;} //   Март
case 4: if (T > 90 && T < 121) {M = 4; D = T - 90;} //   Апрель
case 5: if (T > 120 && T < 152) {M = 5; D = T - 120;} //   Май
case 6: if (T > 151 && T < 182) {M = 6; D = T - 151;} //   Июнь
case 7: if (T > 181 && T < 213) {M = 7; D = T - 181;} //   Июль
case 8: if (T > 212 && T < 244) {M = 8; D = T - 212;} //   Август
case 9: if (T > 243 && T < 274) {M = 9; D = T - 243;} //   Сентябрь
case 10: if (T > 273 && T < 305) {M = 10; D = T - 273;} //   Октябрь
case 11: if (T > 304 && T < 335) {M = 11; D = T - 304;} //   Ноябрь
case 12: if (T > 334 && T < 366) {M = 12; D = T - 334;} //   Декабрь
}


  Итого: 12 ветвей в операторе выбора. Код, конечно же, можно оптимизировать! Например, присваивание D = T поместить выше switch, а из первой ветви убрать. Тогда в остальных ветвях присваивание выражения можно укоротить: D -= const .

  Также можно поместить все константы в статический массив, а для наглядности написать inline-функцию, которая будет вызываться в каждой ветви case, замещая развернутое выражение. Функция должна обращаться к элементам массива по индексу и присваивать значения переменным M и D.

    Если есть желание, предлагаю Вам все оптимизации внести самостоятельно. Дерзайте!
Oiitimict ))))
Oiitimict ))))
16 172
Лучший ответ
Oiitimict ))))     КАК ВИДИТЕ, ФОРМАЛЬНО УСЛОВИЕ ВЫПОЛНЕНО: В РЕШЕНИИ ИСПОЛЬЗУЕТСЯ ОПЕРАТОР ВЫБОРА !!!
Oiitimict ))))   ✓   Отсутствие ключевого слова «break» заставляет процесс проходить по всем ветвям case, начиная с первой, фактически превращая оператор выбора в ЛИНЕЙНЫЙ БЛОК.
Oiitimict )))) *   Если возникнут нападки по поводу применения данного кода к ВИСОКОСНОМУ ГОДУ, то трансформация кода очень проста:
    ✓   Изменения коснутся только констант внутри оператора выбора.
    ✓   Константы 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 31 и 32 остаются неизменными!!!
    ✓   Остальные константы следует ИНКРЕМЕНТИРОВАТЬ.
Примерно так :)
switch(T){
case 1: M=1;D=1;break;
case 2: M=1;D=2;break;
....
case 365: M=12;D=31;break;
}
Иван Павленко
Иван Павленко
50 901
Эдуард Борзенко долго) лучше кинуть в вектор например первые порядковые номера каждого месяца и потом делать T - lower_bound
Babon Колчанов https://code-live.ru/solutions/pascal/76/

Не пособит ли решению задачи готовое решение на языке Паскаль? Правда, оно без оператора выбора. Но можно проанализировать алгоритм.