Вводится число Т – порядковый день в году. Определить номер месяца М и дня недели D,
соответствующих Т. (Например, если Т=365. то М=12, а D=31).
Задачу нужно решить с использованием оператора выбора.
C/C++
Очередная задача по C++
Прошу прощения за то, что посоветую не идею-фикс, а идею фикции. Сознаю, что следующее может обернуться говнокодом, и за это тоже приношу извинения.
Задачу нужно решить с использованием оператора выбора? А что, если трансформировать оператор выбора в линейный блок? Для этого в условии выбора указывается константа, та же константа значится в первой ветви 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.
Если есть желание, предлагаю Вам все оптимизации внести самостоятельно. Дерзайте!
Задачу нужно решить с использованием оператора выбора? А что, если трансформировать оператор выбора в линейный блок? Для этого в условии выбора указывается константа, та же константа значится в первой ветви 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.
Если есть желание, предлагаю Вам все оптимизации внести самостоятельно. Дерзайте!
Примерно так :)
switch(T){
case 1: M=1;D=1;break;
case 2: M=1;D=2;break;
....
case 365: M=12;D=31;break;
}
switch(T){
case 1: M=1;D=1;break;
case 2: M=1;D=2;break;
....
case 365: M=12;D=31;break;
}
Эдуард Борзенко
долго) лучше кинуть в вектор например первые порядковые номера каждого месяца и потом делать T - lower_bound
Babon Колчанов
https://code-live.ru/solutions/pascal/76/
Не пособит ли решению задачи готовое решение на языке Паскаль? Правда, оно без оператора выбора. Но можно проанализировать алгоритм.
Не пособит ли решению задачи готовое решение на языке Паскаль? Правда, оно без оператора выбора. Но можно проанализировать алгоритм.
✓ Изменения коснутся только констант внутри оператора выбора.
✓ Константы 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 31 и 32 остаются неизменными!!!
✓ Остальные константы следует ИНКРЕМЕНТИРОВАТЬ.