Базовый курс. Решение ДЗ №3

Представляем решение третьего домашнего задания.

К сожалению, у Вас недостаточно прав для просмотра этой записи. Если Вы еще не залогинены на сайте
залогиньтесь.

Если не активировали токен — посмотрите видео-инструкцию (видео N5)

Если вы залогинены, у Вас активирован токен доступа, но вы все равно видите эту запись —
напишите нам на e-mail поддержки.

комментариев 20 на “Базовый курс. Решение ДЗ №3”

  1. Для ТекущийГод=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;
    КонецЕсли;

    Сообщить(Строка(ТекущийГод)+” – “+ВсеДни);
    КонецЦикла;     

  2. Пробовал еще сделать более оптимальным путем – через подсчет дней в граничных неделях, но что-то не срастается. Более простой вариант:

    День =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; КонецЕсли; Начало = Начало + День;  КонецЦикла;  Сообщить(“Рабочих дней: ” + (РабочихДней – ПраздниковВГоду) ); КонецЦикла;

    • опять  два раза вставился ответ :(
      А именно та часть, что вставлена через клипбоард.

  3. Обработку скачал, но она не выводит сообщения. 8( У всех выводит?

    • Возможно вывод был закомментарен.
      В целях экспериментов производительности (урок №5 решения ДЗ).

  4. Ярослав 15.04.2011 в 03:00

    Спасибо в паре мест ступил и написал лишний ненужный текст, разбор  очень помог.
    правд непонятно зачем привязываться к неделям это не совсем верно.

  5. Решение красивое, но ИМХО – классика 3-и цикла Год\Месяц\День …  а проверку на праздники однозначно как у Евгения.

    • Тимур 05.05.2011 в 20:31

      А почему это 3 цикла –  “классика”?

  6. <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>

  7. Друмов Александр 13.04.2011 в 12:56

    В решении сказанно что более простым способом получения кол-ва недель было бы использование НеделяГода(Дата(Год,12,31)) – но ведь при этом вернется кол-во недель с неполными неделями. Например для Год = 2011 результат будет 53 а для Год = 2012 – 54.

    • Да, спасибо за замечание.
      Правильный алгоритм такой:
      КоличествоНедель = НеделяГода(НачалоНедели(Дата(Год, 12, 31))-1);

      • Друмов Александр 13.04.2011 в 13:39

        Так тоже не получается, для Год = 2012 результат будет 53.

        • Совершенно верно, спасибо.
          Проблема в том, что могут две неполных недели: с начала и конца года.
          В таком случае указанный вариант вообще не применим.

  8. Ай-яй-яй, совсем не догадался вынести из условия в цикле проверку на праздники. Действительно, можно же было сделать три вычитания, если эти дни попадают на будни. Это минус. Но то, что я решил задачу в лоб – это сделано осозанно, в данной конкретной задаче нет никакой надобности изобретать какие-либо алгоритмы, по большому счету, количество рабочих дней, при условии, что таблица праздников гарантированно не будет меняться, вообще можно рассчитать заранее и использовать константы.

  9. Откуда  можно скачать ваше решение, что бы не набирать. Хочется “поковыряться”.

    • Выложил обработку прямо в этой записи.

  10. В варианте ДЗ который я скачал не было ничего про структуру, поэтому в решении ничего нету связанного со структурой. Я скачал все ДЗ, они будут меняться еще чтоли?

    • В решении представлена старая версия задания (июнь 2010 года). Сейчас раздел со структурой перенесен в 4-ое задание.
      Изменение в текущих заданиях возможны, но только в части более точной формулировки.

  11. У вас в видео задание несколько отличается от доступного к скачиванию со страницы
    https://mg.spec8.ru/1cdevbase-homeworks/
    Вот скрин ДЗ http://www.imagepost.ru/?v=893/13.jpg скаченного от туда. Нет куска про структуру. И собственно в решение структура так и не была использована.
    Но это всё мелкие шероховатости. Решение понравилось.

    • >Нет куска про структуру
      Он будет в следующем задании. Так как универсальные коллекции мы еще не рассматривали.