Базовый курс. Решение ДЗ №3
Представляем решение третьего домашнего задания.
К сожалению, у Вас недостаточно прав для просмотра этой записи. Если Вы еще не залогинены на сайте
— залогиньтесь.
— залогиньтесь.
Если не активировали токен — посмотрите видео-инструкцию (видео N5)
Если вы залогинены, у Вас активирован токен доступа, но вы все равно видите эту запись —
напишите нам на e-mail поддержки.
Для ТекущийГод=2010 по 2020 Цикл
Рабочий=0;
Праздник=0;
Выходной=0;
КоличествоНедель = НеделяГода(Дата(Строка(ТекущийГод),12,31));
ВсеДни = (КоличествоНедель-2)*5;
Если ДеньНедели(Дата(Строка(ТекущийГод),01,01))=7 Тогда
ВыходныеПервойНедели=1;
Иначе
ВыходныеПервойНедели=2;
КонецЕсли;
РабочииПервойНедели = 8-ДеньНедели(Дата(Строка(ТекущийГод),01,01))-ВыходныеПервойНедели;
РабочииПоследнейНедели = ?(ДеньНедели(Дата(Строка(ТекущийГод),12,31))<=5,ДеньНедели(Дата(Строка(ТекущийГод),12,31)),5);
ВсеДни = ВсеДни+РабочииПервойНедели+РабочииПоследнейНедели;
Если ДеньНедели(Дата(Строка(ТекущийГод),01,01))=6 ИЛИ ДеньНедели(Дата(Строка(ТекущийГод),01,01))=7 Тогда
// это выходной
Иначе
ВсеДни = ВсеДни-1;
КонецЕсли;
Если ДеньНедели(Дата(Строка(ТекущийГод),02,23))=6 ИЛИ ДеньНедели(Дата(Строка(ТекущийГод),02,23))=7 Тогда
// это выходной
Иначе
ВсеДни = ВсеДни-1;
КонецЕсли;
Если ДеньНедели(Дата(Строка(ТекущийГод),03,08))=6 ИЛИ ДеньНедели(Дата(Строка(ТекущийГод),03,08))=7 Тогда
// это выходной
Иначе
ВсеДни = ВсеДни-1;
КонецЕсли;
Сообщить(Строка(ТекущийГод)+” – “+ВсеДни);
КонецЦикла;
Пробовал еще сделать более оптимальным путем – через подсчет дней в граничных неделях, но что-то не срастается. Более простой вариант:
День =86400;
Праздники = Новый Массив;
Праздники.Добавить(“0101”);
Праздники.Добавить(“0223”);
Праздники.Добавить(“0308″);
ЧислоПраздников = Праздники.Количество();
ГодНачала = Год(ТекущаяДата())+1;
Для Год = ГодНачала По ГодНачала + 10 Цикл
ПраздниковВГоду = ЧислоПраздников;
Для каждого Праздник Из Праздники Цикл
Если ДеньНедели(Дата(Строка(Формат(Год,”ЧГ=”))+Праздник))>5 Тогда
ПраздниковВГоду = ПраздниковВГоду – 1;
КонецЕсли;
КонецЦикла;
Начало = Дата(Год,1,1);
Конец = КонецГода(Начало);
РабочихДней = 0;
Пока Начало <= Конец Цикл
Если ДеньНедели(Начало) <=5 Тогда
РабочихДней = РабочихДней +1;
КонецЕсли;
Начало = Начало + День;
КонецЦикла;
Сообщить(“Рабочих дней: ” + (РабочихДней – ПраздниковВГоду) );
КонецЦикла;
День =86400; Праздники = Новый Массив; Праздники.Добавить(“0101”); Праздники.Добавить(“0223”); Праздники.Добавить(“0308″); ЧислоПраздников = Праздники.Количество(); ГодНачала = Год(ТекущаяДата())+1; Для Год = ГодНачала По ГодНачала + 10 Цикл ПраздниковВГоду = ЧислоПраздников; Для каждого Праздник Из Праздники Цикл Если ДеньНедели(Дата(Строка(Формат(Год,”ЧГ=”))+Праздник))>5 Тогда ПраздниковВГоду = ПраздниковВГоду – 1; КонецЕсли; КонецЦикла;
Начало = Дата(Год,1,1); Конец = КонецГода(Начало); РабочихДней = 0; Пока Начало <= Конец Цикл Если ДеньНедели(Начало) <=5 Тогда РабочихДней = РабочихДней +1; КонецЕсли; Начало = Начало + День; КонецЦикла; Сообщить(“Рабочих дней: ” + (РабочихДней – ПраздниковВГоду) ); КонецЦикла;
опять два раза вставился ответ :(
А именно та часть, что вставлена через клипбоард.
Обработку скачал, но она не выводит сообщения. 8( У всех выводит?
Возможно вывод был закомментарен.
В целях экспериментов производительности (урок №5 решения ДЗ).
Спасибо в паре мест ступил и написал лишний ненужный текст, разбор очень помог.
правд непонятно зачем привязываться к неделям это не совсем верно.
Решение красивое, но ИМХО – классика 3-и цикла Год\Месяц\День … а проверку на праздники однозначно как у Евгения.
А почему это 3 цикла – “классика”?
<code>
Для год=2010 По 2020 Цикл
колвоНедель = НеделяГода(Дата(Год,12,31));
РабДней = колвоНедель*5;
Если ДеньНедели(Дата(Год,01,01))<=5 Тогда
РабДней = РабДней – ДеньНедели(Дата(Год,01,01))+1;
ИначеЕсли ДеньНедели(Дата(Год,01,01))> 5 Тогда
РабДней = РабДней – 5;
КонецЕсли;
Если ДеньНедели(Дата(Год,12,31))<=5 Тогда
РабДней = РабДней -(5 – ДеньНедели(Дата(Год,12,31)));
КонецЕсли;
Если ДеньНедели(Дата(Год,01,01))<=5 Тогда
РабДней = РабДней -1;
КонецЕсли;
Если ДеньНедели(Дата(Год,02,23))<=5 Тогда
РабДней = РабДней -1;
КонецЕсли;
Если ДеньНедели(Дата(Год,03,08))<=5 Тогда
РабДней = РабДней -1;
КонецЕсли;
сообщить(“”+год+” – “+РабДней);
КонецЦикла;
</code>
В решении сказанно что более простым способом получения кол-ва недель было бы использование НеделяГода(Дата(Год,12,31)) – но ведь при этом вернется кол-во недель с неполными неделями. Например для Год = 2011 результат будет 53 а для Год = 2012 – 54.
Да, спасибо за замечание.
Правильный алгоритм такой:
КоличествоНедель = НеделяГода(НачалоНедели(Дата(Год, 12, 31))-1);
Так тоже не получается, для Год = 2012 результат будет 53.
Совершенно верно, спасибо.
Проблема в том, что могут две неполных недели: с начала и конца года.
В таком случае указанный вариант вообще не применим.
Ай-яй-яй, совсем не догадался вынести из условия в цикле проверку на праздники. Действительно, можно же было сделать три вычитания, если эти дни попадают на будни. Это минус. Но то, что я решил задачу в лоб – это сделано осозанно, в данной конкретной задаче нет никакой надобности изобретать какие-либо алгоритмы, по большому счету, количество рабочих дней, при условии, что таблица праздников гарантированно не будет меняться, вообще можно рассчитать заранее и использовать константы.
Откуда можно скачать ваше решение, что бы не набирать. Хочется “поковыряться”.
Выложил обработку прямо в этой записи.
В варианте ДЗ который я скачал не было ничего про структуру, поэтому в решении ничего нету связанного со структурой. Я скачал все ДЗ, они будут меняться еще чтоли?
В решении представлена старая версия задания (июнь 2010 года). Сейчас раздел со структурой перенесен в 4-ое задание.
Изменение в текущих заданиях возможны, но только в части более точной формулировки.
У вас в видео задание несколько отличается от доступного к скачиванию со страницы
https://mg.spec8.ru/1cdevbase-homeworks/
Вот скрин ДЗ http://www.imagepost.ru/?v=893/13.jpg скаченного от туда. Нет куска про структуру. И собственно в решение структура так и не была использована.
Но это всё мелкие шероховатости. Решение понравилось.
>Нет куска про структуру
Он будет в следующем задании. Так как универсальные коллекции мы еще не рассматривали.