Домашнее задание №3 базового курса
Третье задание по 0-му блоку базового курса.
Для выполнения рекомендуется изучить следующие главы 0-го блока.
Глава 11. Программный код
Глава 12. Примитивные типы данных
Глава 13. Контекст исполнения кода
Глава 14. Объектная техника
Глава 15. Сервисные средства по написанию кода
Глава 16. Основные объекты конфигурации.
Глава 17. Виды учета.
К сожалению, у Вас недостаточно прав для просмотра этой записи. Если Вы еще не залогинены на сайте — залогиньтесь. Если Вы оплачивали курс, у Вас активирован токен доступа, Вы залогинены, но Вы видите эту запись — напишите нам на e-mail поддержки.
ДЗ сделал. Циклом.
Ну цикл то по годам конечно все равно нужен =)
можно наверное без циклов решить
КолвоДнейВГоду-КолвоПолныхНедель*2-ВНеполныхНеделяхСмотримВыходныеДни-УсловиеПоВхождениюНужныхДатВВыходные
Задание выполнил. Но на 100% уверен, что Евгений предложит что-то совершенно другое.
ДЗ 3 сделано.
А что покажут мастера? ;)
ДЗ№3 сделано. Проблем не было.
ДЗ №3 сделано, интересное задание – с не терпение жду Ваше решения, Евгений.
ДЗ №3 выполнено :)
ДЗ №3 сделано
Проверку на праздничный день сделал так
в начале цикла по годам
М = Новый Массив;
М.Добавить(Дата(ТекГод, 1, 1));
М.Добавить(Дата(ТекГод, 2, 23));
М.Добавить(Дата(ТекГод, 3, 8));
и вцикле по дням
ЭтоПраздник = М.Найти(ДеньГода);
Если ЭтоПраздник = Неопределено Тогда
КвоРабочихДней = КвоРабочихДней +1;
КонецЕсли;
Мой результат:
2 010 год – 258 рабочих дней
2 011 год – 258 рабочих дней
2 012 год – 259 рабочих дней
2 013 год – 259 рабочих дней
2 014 год – 260 рабочих дней
2 015 год – 259 рабочих дней
2 016 год – 258 рабочих дней
2 017 год – 258 рабочих дней
2 018 год – 258 рабочих дней
2 019 год – 259 рабочих дней
думал, что я перемудрил в решении, но судя по другим комментариям, все мыслили примерно в одинаковом направлении ))
Задание выполнено, результат – такой же, как у mtv911.
Собрал Високосные года. В неделе 2 выходных. В году Х недель. Не забыл про 1 и последнюю неделю .
Посмотрел на какой день недели выпали праздники.
Все сделал, только повозился с ключом структуры
ДЗ выполнил
При решении обошелся без перебора дней :)
Для этого нужно проанализировать первую и последнюю неделю на предмет наличия в них выходных дней, все промежуточные недели имеют по два выходных. Ну и дополнительно посмотреть не выпадают ли праздники на выходные.
В задании заинтересовала только возможность более компактной записи проверки даты на выходной. Написал так:
Если ДеньНедели(ТекДата) > 5
или (ДеньЧисло = 1 и МесяцЧисло = 1)
или (ДеньЧисло = 23 и МесяцЧисло = 2)
или (ДеньЧисло = 8 и МесяцЧисло = 3) Тогда
Можно было конечно проверять МесяцЧисло отдельным условием (МесяцЧисло <= 3), но вышеприведенный пример посчитал более удобочитаемым.
Из предыдущих постов не понял зачем нужно заморачиваться с ТЗ и как можно обойтись без циклов?
ДЗ выполнил. Проблем не возникло.
Домашнее задание выполнил.Мне нравиться построение ДЗ,чтобы эффективно его решить,нужно разобраться с предыдущим . Второе надо разобраться с некоторыми нюансами, на которых если их не знаешь теряешь кучу времени (Символы.НПП) ,особенно это актуально при переходе с 7.7 на 8х.
Закончил … пришлось немножко подумать … в итоге все встало на свои места … интересное задание! )
А можно давать задания со Звездочкой – повышенной сложности, по желанию?!..
Не будем забегать вперед, дождемся продвинутого курса : )
Сделал функцию без циклов. Очень за себя рад.
Прикольно !..
Наверняка – Гениально и просто?!.. ;))
Надеюсь САМ – додумался..
P.S.: Например 2 задание – уже знал решение БЕЗ промежуточной переменной..
В принципе просто. Полных недель в году одинаковое количество, остаются 1-2 дня в неполной неделе вот с ними думал.
А без переменной существует проблема переполнения, поэтому это просто фокус))
Наверняка ч/з – рекурсию, а эт ведь МЫСЛЬ !..
Сделал ч/з рекурсию, БЕЗ циклов – нааМНОГО мееедленнее..
Может поделимся мыслями?
В году 52 полных недели. 104 выходных дня. Остается 2 дня неполной недели. 1 января либо выходной либо празник – значит нерабочий. Итого 105 дней. Високосный год добавляет еще один день, нужно понять это выходной или нет. Ну и оставшиеся в праздника если попадает на выходной не считать.
Нет, всё-таки без “честного” календаря это чревато. Слишком много “если” надо учитывать. Например, 1900, 2000 и 2100 год делятся на 4. Но из них только 2000 является високосным, остальные нет.
кратен 4 и (не кратен 100 или кратен 400). Все по честному.
Так количество дней в году можно определить разностью дат начала и конца года, че заморачиваться то?
Может поделитесь с коллегами? Посмотрим, сравним результаты. Но прогонять буду до 2100 года.
Функция КоличествоРабочихДнейвГоду2(аГод)
тКолДнейВГоду = ДеньГода(Дата(аГод,12,31,0,0,0));
тКоличествоВыходных=105;//52недели*2 + 1 января
// Год високосный и 2 января тоже выходной
Если (тКолДнейВГоду>365) и (ДеньНедели(Дата(аГод,1, 2,0,0,0))>5) Тогда
тКоличествоВыходных=тКоличествоВыходных+1;
КонецЕсли;
тКоличествоВыходных=тКоличествоВыходных+?(ДеньНедели(Дата(аГод,2,23,0,0,0))>5,0,1);
тКоличествоВыходных=тКоличествоВыходных+?(ДеньНедели(Дата(аГод,3, 8,0,0,0))>5,0,1);
возврат тКолДнейВГоду-тКоличествоВыходных;
КонецФункции // КоличествоРабочихДнейвГоду2()
Чё – то рука не поднимается создать Структуру “ВыходныеДни” где ключем Год+номерГода, а значением РАБОЧИЕдни / их количество.
Или я, что – то не понял.
Придется поднять руку )
Абстрагируйтесь от названия.
Я здесь тоже не понял, подумал опечатка, поэтому в структуру ВЫХОДНЫЕдни помещал количество ВЫХОДНЫХ, а не РАБОЧИХ дней
ДЗ выполнил.
Задание выполнил. Хочется сравнить с эталоном.
По плану решение будет выложено со следующим заданием. Т.е. во вторник.
Домашнее задание выполнил. Проблем особых не было.
Затруднений не возникло.
Используется цикл по условию (НачПериода <= КонПериода) и в теле к НачПериода добавляем заветное 86 400.
Ждем-с эталонного решения.
Домашнее задание выполнила без затруднений.
Проблем с решением не возникло. Создал функцию, в которую в цикле передавал год. Внутри в цикле по конецгода перебирал даты, проверяя их.В итоге функция возвращала число рабочих дней. Потом в цикле заполнил структуру так:
ГодыСтруктура.Вставить(“Год”+Формат(Счетчик,”ЧГ=0”),КоличествоДней);
Задание сделал.
Все ок, жду решения…
пришлось чуток повозиться с ключом у структуры, а так все ок!)
мое определение праздничных дней:
Функция ЭтоПраздничныйДень(Месяц,День)
Возврат (День=1)и(Месяц=1) или (День=23)и(Месяц=2) или (День=8)и(Месяц=3);
КонецФункции // ЭтоПраздничныйДень()
В функцию не выносил, но решение аналогичное
Праздник = (День = 1 и месяц = 1) или (День=23 и Месяц=2) или (День=8 и Месяц=3);
Можно немного красивее, что ли:
ПраздничныеДни = Новый Массив;
ПраздничныеДни.Добавить(101);
ПраздничныеДни.Добавить(2302);
ПраздничныеДни.Добавить(803);
ДеньМесяцЧислом = День(АнализируемаяДата)*100 + Месяц(АнализируемаяДата);
НеПраздничныйДень = (ПраздничныеДни.Найти(ДеньМесяцЧислом) = Неопределено);
Мне понравилось решение. Я не догадался так сделать, потому использовал Лев(ТекДата, 5) = “01.01” и т. д.
ДЗ №3 – все ОК.
В любом случае интересно, как решат эксперты – ждем-с :)
борьба от 2 010 функцией Формат возможна …)
+1
Столкнулся с ДВУМЯ – Трудностями..
1. Простотой и Гениальностью.. ;))
2. В 2011 – 258 раб. дн., а НЕ 260 – даже вручную Пересчиатл.. :((
P.S.: Использовал ТЗ – вместо счетчика !..
У меня тоже получилось 258 раб дней в 2011 году.
А на счет ТЗ, незнаю.
С использованием ТЗ как миниму есть 2 варианта решения.
1. Сувать все потом свернуть по году
2. Искать в ТЗ строку с годом и увеличивать значение.
В первом случае (мое мнение) при большом количестве строк – потеря памяти и производительности.
Во втором – тот же счетчик, только больше хлопот.
К томуже надо еще и вструктру все это засунуть. -))
ЗаСУНУЛ и свернул, без промежуточных переменных..
В структуру, в любом случае – СУВАТЬ нуно !.. ;))
Роман Ильич, давайте не будем играть с русским языком, хорошо?
Для этого есть другие сайты.
Я конечно не “гуру”, но ТЗ лучше не использовать без особой необходимости. Вроде бы использование ТЗ достаточно ресурсоёмкое дело и снижает производительность приложения. Если я не прав, готов выслушать комментарии экспертов.
У меня получилось:
2010 год – 258 рабочих дней
2011 год – 258 рабочих дней
2012 год – 259 рабочих дней
2013 год – 259 рабочих дней
2014 год – 260 рабочих дней
2015 год – 259 рабочих дней
2016 год – 258 рабочих дней
2017 год – 258 рабочих дней
2018 год – 258 рабочих дней
2019 год – 259 рабочих дней
2020 год – 261 рабочих дней
Аналогично.
Точно такой же результат. Поздравляю, коллега!
При заполнении структуры была проблемма:
Ключ структуры вычислялся как “Год”+Строка(ТекГод),
а ТекГод : 2010 по 2020. При преобразовании в строку получался “2 010” год ( с разделителем триад) . Пришлось ТекГод сделать от 10 до 20, а ключ структуры вычислять как”Год20″+Строка(ТекГод)
Вместо Строка(ТекГод) я сделал Формат(ТекГод,”ЧГ=”)
т.е.
ВыходныеДни.Вставить(“Год_” + Формат(ТекГод,”ЧГ=”), РабочихДней)
Чтобы получилось как надо, надо у преобразованной строки удалить символ “Неразрывный пробел”.
будет нечто вроде «Год»+СтрЗаменить(Год(ТекДата), Символы.НПП, “”)
Зачем городить один костыль на другой. Лучше воспользоваться функцией Формат(), как подсказано в комментарии выше.
Формат(Год(ТекДата), “ЧГ = 0”)
//Для текущего года считаем количество рабочих дней
//Для простоты без праздников
//Определим последний день предыдущего года
ТекДата=НачалоГода(ТекущаяДата())-60*60*24;
КоличествоРабочихДней=0;
Пока ТекДата<=КонецГода(ТекущаяДата()) Цикл
//Прибавляем 1 день
ТекДата=ТекДата+60*60*24;
//Если день недели сб или вос, кол-во рабочих дней не меняем
Если ДеньНедели(ТекДата)6 И ДеньНедели(ТекДата)7 Тогда
КоличествоРабочихДней=КоличествоРабочихДней+1;
КонецЕсли;
КонецЦикла;
Я думаю ДеньНедели(ТекДата)>5 Тогда …..
Да, действительно…
Можно упростить условие
Если ДеньНедели(ТекДата)<6 Тогда увеличиваем количество рабочих дней
К тому же
Если ДеньНедели(ТекДата)6 И ДеньНедели(ТекДата)7 Тогда
наверное пропущен знак
;-)
У вас более экономичное решение… 1 цикл.
Все ОК.
//ТекДата = КонецДня(ТекДата) + 1;
Проблем с ДЗ №3 не было.
Вначале просто решил перебрать дни с 1 до 365 (366), но нет функции, которая вычисляет ДеньНедели по номеру дня в году.Пошел просто: два вложенных цикла и счетчик.
Не забываем о секундах при работе с датой() :-)))
про секунды всегда надо помнить. особенно про 23:59:59
При чем здесь 23:59:59?!..
Моно и начало дня использовать – главное увеличивать на 60*60*24..
а я перебирал дни начиная с Дата(“20100101”) и прибавлял по 86400 секунд.
В задаче стоял вопрос об отсчете 10 лет от текущей, а не жестко заданной строкой дате!
День недели прекрасно определяется процедурой ДеньНедели() в независимости от порядкового номера дня в году.