Базовый курс. Занятие №4

Приступайте к четвертому занятию базового курса.

ps. На этой странице не нужно отчитываться о выполнении ДЗ.

комментариев 9 на “Базовый курс. Занятие №4”

  1. Юрий Сартинский 17.10.2012 в 16:13
    Перем глОбед;
    Перем ВремяНачалаРаботы,ВремяОкончанияРаботы;

    Процедура ПростыеЧисла(Предел)
       
        Числа = Новый Структура();
       
        Числа.Вставить("Число" + 1,"Простое");
       
        МинимальныйЧет = 2;
       
        СчетчикПростыхЧисел = 1;
       
        Для Счетчик = МинимальныйЧет По Предел Цикл
           
            Если Счетчик%2 = 0 Тогда
                Числа.Вставить("Число" + Формат(Счетчик,"ЧГ=0"),"Непростое");        
                Продолжить;
            КонецЕсли;
           
            // для простого числа N нельзя найти такую пару чисел p и q
            // что, p * q = N
            Корень = sqrt(Счетчик);
            ЦелаяЧастьКорня = Цел(Корень);
            Если ЦелаяЧастьКорня = Корень Тогда
                Числа.Вставить("Число" + Формат(Счетчик,"ЧГ=0"),"Непростое");
                Продолжить;
            КонецЕсли;
           
            ЧислоПростое = Истина;
           
            Делитель = ЦелаяЧастьКорня;
            Пока Делитель >= МинимальныйЧет Цикл
               
                Если Счетчик%Делитель = 0 Тогда
                    Числа.Вставить("Число" + Формат(Счетчик,"ЧГ=0"),"Непростое");
                    ЧислоПростое = Ложь;
                    Прервать;
                КонецЕсли;
               
                Делитель = Делитель - 1;
               
            КонецЦикла;
           
            Если ЧислоПростое Тогда
                Числа.Вставить("Число" + Формат(Счетчик,"ЧГ=0"),"Простое");
                СчетчикПростыхЧисел = СчетчикПростыхЧисел + 1;
            КонецЕсли;
           
        КонецЦикла;
       
        Сообщить("Всего простых чисел " + СчетчикПростыхЧисел);
       
        // обращение к структуре
        Сообщить(Числа.Число591);
       
        ЗначениеСвойства = 0;
        Числа.Свойство("Число332",ЗначениеСвойства);
        Сообщить(ЗначениеСвойства);
       
    КонецПроцедуры


    Процедура ПередНачаломРаботыСистемы(Отказ)
       
        Если ТекущаяДата() < ВремяНачалаРаботы ИЛИ ТекущаяДата() > ВремяОкончанияРаботы Тогда
           
            Отказ = Истина;
            Предупреждение("Вход в систему сегодня возможен с " + ВремяНачалаРаботы + " по " + ВремяОкончанияРаботы + "!");
            Возврат;
           
        КонецЕсли;
       
        // выбор блюда
        Меню = Новый СписокЗначений;
        Меню.Добавить("Курица");
        Меню.Добавить("Рыба");
        Меню.Добавить("Мясо");
       
        РезультатВыбора = Неопределено;
        Пока РезультатВыбора = Неопределено Цикл
           
            РезультатВыбора = Меню.ВыбратьЭлемент("Выберите блюдо...",Меню[0]);
            Если Не РезультатВыбора = Неопределено Тогда
                глОбед.Вставить(0,РезультатВыбора);
            КонецЕсли;
           
        КонецЦикла;
       
        ПростыеЧисла(1000);
       
    КонецПроцедуры

    Процедура ПередЗавершениемРаботыСистемы(Отказ)
        ВремяЗавершенияРаботыСистемы = ТекущаяДата();
       
        Если Дата(Год(ВремяНачалаРаботы),Месяц(ВремяНачалаРаботы),День(ВремяНачалаРаботы),Час(ВремяЗавершенияРаботыСистемы),Минута(ВремяЗавершенияРаботыСистемы),Секунда(ВремяЗавершенияРаботыСистемы)) < ВремяОкончанияРаботы Тогда
           
            Если Вопрос("Рабочий день еще не завершен - хотите закрыть программу?",РежимДиалогаВопрос.ДаНет,,КодВозвратаДиалога.Нет) = КодВозвратаДиалога.Нет Тогда
                Отказ = Истина;
                Возврат;
            КонецЕсли;
           
        КонецЕсли;
           
    КонецПроцедуры

    глОбед = Новый Массив;

    ВремяНачалаРаботы = Дата(Год(ТекущаяДата()),Месяц(ТекущаяДата()),День(ТекущаяДата()),9,5,38);
    ВремяОкончанияРаботы = Дата(Год(ТекущаяДата()),Месяц(ТекущаяДата()),День(ТекущаяДата()),18,11,42);
  2. Еще вопрос, посмотрел бегло ответ daray19. В процедуре числа, в структуру добавляется последний элемент л1 = 1000, при этом “К” увеличивается постоянно и пример тестовый, л1=3, л2=1, (л1/л2)-Цел(л1/л2)=0, вернет истину и тогда счетчик “к” увеличится, хотя он уже отличен к этому времени от 0, и опустив этот факт в стуктуру добавился бы элемент, Число3,Непростое Хотя оно простое… Но единственное значение которое попадет в стуктуру Число1000, Непростое….

  3. При этом у меня вопрос, в цикле “Для” на последнем шаге когда Счетчик = 1000, при вставке Элемента Коллекции Стуктура с ключом “Число1 000” выдается сообщение об ошибке:”{МодульУправляемогоПриложения(104)}: Ошибка при вызове метода контекста (Вставить)
    СпецСтруктура.Вставить(СтрокаЧисло, “НеПростое”);
    по причине:
    Задано неправильное имя атрибута структуры”. При цикле по 999 значений ошибки нет, с чем связана данная ошибка? И как произвести поиск в Структуре по ключу содержащемуся в переменной “Х”?

    • Dobrenko Oleg 02.10.2012 в 08:55

      Проблема в неразрывном пробеле. Изучите эталонное решение.

  4. Перем глОбед;

    Функция ВременныеИнтервалы()
       
        МассивВремя = Новый Массив;
       
        МассивВремя.Добавить(Дата('00010101') + (ТекущаяДата()- НачалоДня(ТекущаяДата())));
        МассивВремя.Добавить('0001.01.01.09.05.38');
        МассивВремя.Добавить('0001.01.01.18.11.42');
       
        Возврат МассивВремя;    
    КонецФункции

    Функция ПроверкаВремениВходаВКонфигурацию()
       
        МассивВремя = ВременныеИнтервалы();
       
        Если МассивВремя[0] < МассивВремя[1]  Тогда
            Предупреждение ("Рано запускаем");
            глОбед = ВыборОбеда();
            //Возврат Истина;
        ИначеЕсли МассивВремя[0] > МассивВремя[2] Тогда
            Предупреждение("Поздновато уже, идите домой!");
            //Возврат Истина;
        КонецЕсли;
       
       
       
    КонецФункции // ПроверкаВремениВходаВКонфигурацию()

    Функция ПроверкаВремениВыходаИзКонфигурации()

        МассивВремя = ВременныеИнтервалы();
       
        Если МассивВремя[0] > МассивВремя[1] И МассивВремя[0] < МассивВремя[2] Тогда
            Если Вопрос("Вы уверены, что хотите закончить работу с программой в рабочее время?", РежимДиалогаВопрос.ДаНет) = КодВозвратаДиалога.Да Тогда
                Возврат Ложь;
            Иначе
                Возврат Истина;
            КонецЕсли;
        ИначеЕсли МассивВремя[0] > МассивВремя[2]Тогда
            Предупреждение("До завтра!");
            Возврат Ложь;
        КонецЕсли;

    КонецФункции

    Процедура ПередНачаломРаботыСистемы(Отказ)
       
        //Отказ = ПроверкаВремениВходаВКонфигурацию();
        Числа();
       
    КонецПроцедуры

    Функция ВыборОбеда()

        МассивБлюд = Новый Массив;
       
       
        СписокБлюд = Новый СписокЗначений;
        СписокБлюд.Добавить("Чай",,Ложь);
        СписокБлюд.Добавить("Кофе",,Ложь);
        СписокБлюд.Добавить("Борщ",,Ложь);
       
        Если СписокБлюд.ОтметитьЭлементы("Констуктор обеда!") Тогда
           
            Для каждого Элемент Из СписокБлюд Цикл
           
                Если Элемент.Пометка = Истина Тогда
               
                    МассивБлюд.Добавить(Строка(Элемент));   
           
                КонецЕсли;
            КонецЦикла;
           
            Возврат МассивБлюд;
           
        КонецЕсли;
        ВыборОбеда();
       
    КонецФункции


    Процедура ПередЗавершениемРаботыСистемы(Отказ)
       
        Отказ = ПроверкаВремениВыходаИзКонфигурации();        
       
    КонецПроцедуры

    Функция Числа()

        СпецСтруктура = Новый Структура;
       
        Для Счетчик = 1 По 1000 Цикл
           
            Если ПоискПростыхЧисел(Счетчик) Тогда
               
                СтрокаЧисло = "Число" + Строка(Счетчик);
                СпецСтруктура.Вставить(СтрокаЧисло, "Простое");
                       
           
            Иначе
                СтрокаЧисло = "Число" + Строка(Счетчик);
                СпецСтруктура.Вставить(СтрокаЧисло, "НеПростое");
               
            КонецЕсли;
           
        КонецЦикла;
        Сообщить(СпецСтруктура.Число591);
    КонецФункции // Числа()

    Функция ПоискПростыхЧисел(Счетчик)

        ФлагЧисла = Истина;
        Для Сч = 1 По Счетчик Цикл
            Если (Счетчик%Сч = 0) И (Счетчик <> Сч) И (Сч<>1) Тогда
           
                ФлагЧисла = Ложь; 
                Возврат ФлагЧисла;
               
            КонецЕсли;
       
        КонецЦикла;
        Возврат ФлагЧисла;
       
         

    КонецФункции // ПоискПростыхЧисел(Счетчик)()
  5. В процедурах ПередначаломРаботыСистемы и ПередЗавершением РаботыСистемы расположен код, проверяющий соответствие текущего времени рабочему:

    перем ДатаЗапуска;

    Процедура ПередНачаломРаботыСистемы(Отказ)
         ДатаЗапуска=ТекущаяДата();
         ДатаВ=Дата(1,1,1,0,0,0);  
      ВремяЗапуска=Дата(1,1,1,Час(ДатаЗапуска),Минута(ДатаЗапуска),Секунда(ДатаЗапуска));
           Если   ВремяЗапуска<Дата(1,1,1,9,5,38) или ВремяЗапуска>Дата(1,1,1,18,11,42)тогда
            Предупреждение("Работать нельзя!",5);
             Отказ=истина
           КонецЕсли;

         КонецПроцедуры


    Процедура ПередЗавершениемРаботыСистемы(Отказ)
        ДатаВыхода=ТекущаяДата();
        ВремяВыхода=Дата(1,1,1,Час(ДатаВыхода),Минута(ДатаВыхода),Секунда(ДатаВыхода));
        Если  НачалоДня(ДатаВыхода)=НачалоДня(ДатаЗапуска) и ВремяВыхода<Дата(1,1,1,18,11,42)
          Тогда
            Если Вопрос("Может ещё поработаем?",РежимДиалогаВопрос.ДаНет)= КодВозвратаДиалога.Да тогда
             Отказ=истина;
                   КонецЕсли;    КонецЕсли;
     КонецПроцедуры

    В процедуре ПриНачалеРаботыСистемы пользователю предоставляется выбор обеда, причем он не может ничего не выбрать, т.к. пока хотя бы один элемент не отемчен в цикле будет вновь и вновь вызываться окно выбора обедов, выбор обедов также сохраняется в массиве “Выбор”:

    Процедура ПриНачалеРаботыСистемы()
      Обеды = Новый СписокЗначений;
      Выбор=Новый массив;
      Обеды.Добавить("курица");
      Обеды.Добавить("рыба");
      Обеды.Добавить("мясо");
      ВыбранОбед=ложь;
      Пока Не ВыбранОбед цикл
           Обеды.ОтметитьЭлементы("Выберите обед");      
      Для каждого Строка из Обеды цикл
          Если Строка.Пометка Тогда
      ВыбранОбед= Истина;
      Выбор.Добавить(Строка.Значение);
        КонецЕсли;
      КонецЦикла;
    КонецЦикла;
    КонецПроцедуры

    В следующей процедуре создается структура “Числа”, в ней два цикла, один из которых вложенный:

    Процедура простое()
         к=0;
         Числа= Новый Структура ("Ключ, Значение");
         Для л1=1 по 1000 цикл
             Для л2=2 по л1 цикл
                 Если (л1/л2)-Цел(л1/л2)=0 тогда
                     к=к+1; КонецЕсли;
             КонецЦикла;
         КонецЦикла;
         Если к>1 тогда
             Числа.Вставить("Ключ", "Число"+л1);
             Числа.Вставить("Значение", "Не простое");
                          Иначе
            Числа.Вставить("Ключ", "Число"+л1);
            Числа.Вставить("Значение", "простое");
        КонецЕсли;
       
    КонецПроцедуры;