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

Второе занятие по 0-му блоку базового курса.

Необходимо изучить следующие главы.
Глава 12. Примитивные типы данных
Глава 13. Контекст исполнения кода
Глава 14. Объектная техника
Глава 15. Сервисные средства по написанию кода

Также нужно выполнить домашнее задание, текст которого доступен на странице.

В этой же теме необходимо написать отчет о выполнении задания.

ps. Участники курса без доступа в мастер-группу отчитаться по домашним заданиям не получиться.

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

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

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

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

  1. Дмитрий 26.01.2011 в 15:31

    1. В резульатате выполнения кода произойдет бесконечное заполнение массива значением Ложь.
    2. В результатах некоторых выражений получил не то значение которое ожидал, но алгоритм понял.
    3.
    3.1: С 3ей переменной
    Перем3 = Начислено
    Начислено = Выплачено
    Выплачено = Перем3
    3.2 Без 3ей переменной
    Начислено = Начислено + Выплачено
    Выплачено = Начислено – Выплачено
    Начислено = Начислено – Выплачено

  2. 1) Я думаю, что в данном случае это будет бесконечный цикл, в котором будут добавляться в массив элементы со значением “Ложь”
    2)
    А) “010010”
    Б) “010010”
    В) и Г) кажется, что это вообще должно выдавать синтаксическую ошибку
    3) С использованием промежуточной переменной:
    записываем в промежуточную переменную значение 1-й переменной, потом в 1-ю – значение 2-й, потом во 2-ю – значение промежуточной
    без промежуточной переменной:
    <code>
    Начислено = Формат(Начислено,”ЧГ=0″) +”;”+ Формат(Выплачено,”ЧГ=0″) ;
    Выплачено = Лев(Начислено, Найти(Начислено, “;”)-1) ;
    Начислено = Прав(Начислено, стрдлина(Начислено) – Найти(Начислено, “;”));
    </code>
    Или сделать то же самое с использованием структуры
    <code>
    Начислено = Новый Структура(“Начислено,Выплачено”,Выплачено,Начислено);
    Выплачено = Начислено.Выплачено ;
    Начислено = Начислено.Начислено ;
    </code>

  3. Харитонов Алексей 26.01.2011 в 11:32

    А еще вопрос – На решение всех ДЗ будет даваться один вечер? Или нет?

  4. Харитонов Алексей 26.01.2011 в 11:31

    1. Цикл зацикливается, но почему пока не понял видимо из решения ДЗ пойму.
    2. Некоторые проверки по таблу дали неожиданный результат.
    3. Начислено = 1000;
    Выплачено = 2000;
    ВремПерем = Начислено;
    Начислено = Выплачено;
    Выплачено = Начислено;
     
    Без переменной пока не могу придумать но видимо из решения узнаю.

  5. Задание выполнил.
    Как вариант решения последней задачи:

    Начислено = 1000;
    Выплачено = 2000; 
     
    Начислено = Строка(Выплачено) + “~” + Строка(Начислено);
     
    Выплачено = Число(Сред(Начислено, Найти(Начислено,”~”)+1));
     Начислено = Число(Лев(Начислено,  Найти(Начислено,”~”)-1));

  6. Давыдяк Сергей 26.01.2011 в 06:52

    1.  Происходит зацикливание.  Связано это с тем, что параметром функции массива Добавить может быть только значение или выражение, в нашем случае это выражение равное ЛОЖЬ, как результата счетчик не наращивается и происходит зацикливание.
    2. Изначально правильно угадал только ответ В, все остальные разобрал только проверив через “Табло”.
    3. Вариант с промежуточной переменной не вызвал затруднение, второй вариант вызвал затруднение, подсмотрел его уже в сделанных отчетах.

  7. 1. Цикл вечный, массив содержит значения Ложь
    2. Первый случай понятен = “010010”, второй дал интересный результат “01010”,
    причем если изменить значение первого символа на неравный “0”, то
    результат совпадет с первым. Третий преобразовывает число по первым операндам “0100101”,
    четвертый то же интересен, знак “-” замещает “0” второго операнда (“010-10”), если лидирующий “0”
    второго операнда меняем, например на “1”, то “010-010
    3. Вариант 1:
    Врем = Начислено;
    Начислено = Выплачено;
    Выплачено = Врем;
    Вариант 2:
    Через функцию с использованием передачи параметра по значению

  8. Максим Ефимов 26.01.2011 в 04:35

    1. зацикливание, так как не идет увеличение счетчика
    2.
    А. «010» + «010» = “010010”
    Б. «010» ++ «010» = “01010”
    В. «010» – «010» + 1 = 1
    Г. «010» +- «010» + 1 =  “010-101”
    3.
    С использованием промежуточной переменной:
    Если Начислено = 1000 и Выплачено = 2000 Тогда
    СтВыплачено = Выплачено;
    Выплачено = Начислено;
    Начислено = СтВыплачено;
    КонецЕсли;
    Без ее использования:
    Если Начислено = 1000 и Выплачено = 2000 Тогда
    Выплачено = Выплачено + Начислено;
    Начислено = Выплачено – Начислено;
    Выплачено = Выплачено – Начислено;
    КонецЕсли;

  9. 1. Сама постановка задания “к чему приведет выполнение данного программного кода” изначально вызвала оправданные подозрения.  Понятно, что значение Счетчик в цикле не изменялось. Но добросовестно проверил :)
    2. Не все было понятно. После анализа в отладчике ситуация прояснилась.  Смутило непривычное  использование ++, +-
    В версии 7.7 привык явно преобразовывать в число, строку… Какие правила здесь – пока не знаю.
    3. Что касается третьего задания, то его решение с использованием промежуточной переменной упоминалось в видео. Хотя, я бы сходу так и решил (при возникновении реальной надобности).
    Решение без переменной сразу не придумалось :(

  10. 1. Бесконечный цикл.
    2. “010010” – строка;  “01010” – строка;  1 число; вот с пунктом Г (трудность), хотя отладчик говорит “010-101” тип срока
    3. с переменной
    Выплачено = 2000;
    Начислено = 1000;
    ПромПерем;
    Начислено = Выплачено;
    ПромПерем = Выплачено – Начислено;
    Выплачено = ПромПерем;

    без переменной
    Выплачено = 2000;
    Начислено = 1000;
    Начислено = Выплачено;
    Выплачено = Выплачено – Начислено;

  11. 1. Непонятно.  не понял как пользоваться отладчиком.
    2.Г не понял почему получилось так.
    3.  сделал.
    Как  вывести сообщение с текстом и значением?
     
     
     

    • >Непонятно. не понял как пользоваться отладчиком.
      См. решение задания.
      Если вопросы останутся, прошу в мастер-группу.

  12. 1)  вечный цикл.
    2)Интуиция немного подвела. Уяснил для себя, что унарные операции в 8.2 преобразуют к числу.
    3) Тут все понятно. 10 класс, вторая четверть.
     

  13. 1. Цикл
    2. Не отгадал устно.
    3. Решил. Описаний уже много написали.

  14. 1. Произойдет зацикливание, при этом в массив “М” будут добавляться элементы “Ложь”.
    2. А: “010” + “010” = “010010”
       Б: “010” ++ “010” = “01010”
       В: “010” – “010” + 1 = 1 (число)
       Г: “010” +- “010” + 1 = “010-101”
    Сначала правильно ответил только на “А”, после чего пришлось пересмотреть уроки, посвященные порядку выполнения операций. Теперь стало ясно, почему результат именно такой.
    3. С использованием промежуточной переменной все просто и понятно. Без использования – к сожалению, сам не догадался, пришлось подсмотреть у участников:
     А = А + Б;
     Б = А – Б;
     А = А – Б;
    Способ, конечно, интересный, но уж больно тяжело читать такой код.

  15. Первый решил
    Второй через отладчик разобрался
    Третий – обычно все делается второпях, использую через промежуточную переменную, решение не используя промежуточную – красивое, но это больше наверное к алгоритмистике относится чем к 1С. Но в багаж возьму.

  16. Федор 25.01.2011 в 14:58

    1. Зацикливание.
    2. 
    А. “010010”
    Б. “01010”
    С. 1
    Д. “010-101”

    3.<code>
    &НаКлиентеНаСервереБезКонтекста
    Процедура  ЗаменаДвухПеременнхСИспользованиемТретейПреременной(А, Б)
     С = А;
     А = Б;
     Б = С;
    КонецПроцедуры

    &НаКлиентеНаСервереБезКонтекста
    Процедура  ЗаменаДвухПеременнхБезИспользованиемТретейПреременной(А, Б)
     А = А + Б;
     Б = А – Б;
     А = А – Б;
    КонецПроцедуры
    </code>

  17. Patio-5Element 25.01.2011 в 13:25

    1. Бесконечный цикл
    2. Запутался с Б и Г. Через отладку все стало понятно.
    3.1
    Начислено = 1000;
    Выплачено = 2000;
    ВрПеременная = Выплачено;
    Выплачено = Начислено;
    Начислено = ВрПеременная;
    3.2
    Начислено = 1000;
    Выплачено = 2000;
    Начислено = Начислено + Выплачено;
    Выплачено = Начислено – Выплачено;
    Начислено = Начислено – Выплачено;

  18. Задание выполнено
     1)с массивом устно не догадался что цикл бесконечный
    2) со строками без отладчика в основном не угадал, до сих пор не пойму принципа
    3) с доп переменной понятно, без доп. например:
    А=1000
    Б=2000
    А=А+Б  //3000
    Б=А-Б  //1000
    А= А-Б //2000

  19. Виктор Вахненко 25.01.2011 в 11:10

    1)  Пока Ложь < 1000 Цикл …. КонецЦикла – вечный цикл, поскольку Ложь, после преобразования в число, равно нулю.
    2)Примеры Б и Г были интересны. Уяснил для себя, что унарные операции “+” и “-” приводят к преобразованию своего операнда к типу Число.
    3) Задание выполнено двумя способами.

    • 1) задание немного неправильно понимаешь: у тебя не происходит присваивания переменной Счетчик, внутри метода Добавить происходит лишь сравнение (0=0+1 которое ложь).  а зацикливает потому что выполняется условие 0<1000, т.к.  вначале Счетчик определили как =0, а в нутри цикла никакого его изменения не происходит

      • Все правильно говорите.

        ps. Проверьте почту, есть вопрос по оформлению документов.

      • Виктор Вахненко 26.01.2011 в 14:14

        Да действительно немного запутался. Спасибо.

  20. 1е и 3е задание решил, во втором запутался, с отладчиком разобрался.

  21. Елена 25.01.2011 в 10:53

    1) бесконечный цикл с добавлением в массив значения Ложь;
    2) ошиблась в “г”;
    3) с промежуточной переменной:
    Пром = Перем1;
     Перем1 = Перем2;
     Перем2 = Пром;
    без:
    Перем1 = Перем1 + Перем2;
     Перем2 = Перем1 – Перем2;
     Перем1 = Перем1 – Перем2;

  22. Задание выполнено
    1.Зацикливание;
    2.Испытывую трудности с ++ и -+;
    3.Начислено=1000, Выплачено=2000
    ВремПерем=1000
    Начислено=Выплачено
    Выплачено=ВремПерем.
    Второй вариант
    Начислено=Начислено+Выплачено;
    Выплачено=Начислено-Выплачено;
    Начислено=Начислено-Выплачено.

  23. п. 1. Бесконечный цикл, в массив добавляются значения Ложь.
    п. 2.
    А. конкатенция 2 строк, результат “010010”
    Б. 2 операнд “+”-м приводится к Число, результат “01010”
    В. разность первых двух операндов 0, 0+1 = 1, результат 1.
    Г. второй операнд “-“-м приводится к Число, результат “010-101”, тот же, что и для “010”+-10+1
    п. 3.
    <code>
    А = Начислено;
    Начислено = Выплачено;
    Выплачено = А;
    </code>
    Никогда не понимал, зачем решать такие задачи, но
    <code>
    Начислено = Выплачено+Начислено;
    Выплачено = Начислено – Выплачено;
    Начислено = Начислено – Выплачено;
    </code>

  24. 1)Заполнение элементов массива значением ЛОЖЬ в беконечном цикле.
    2) А=”010010″; Б=”01010″; С=1; Д=”010-101″;
    3) С промежуточной переменной
    А=Пром; А=В; В=Пром;
    Без промежуточной переменной
    А=А+В; В=А-В; А=А-В;
    Первый вариант быстрее, второй требует меньше памяти.

  25. 1. Анализ разошёлся с отладчиком
    2. А. Строка + строка,  табло подтвердило.
    Б. Строка + число, ошибся, но понял почему
    В.  Число-Число, табло подтвердило
    Г. Строка+ (-(Число)), ошибся, но понял почему
    3. вариаент 1
    Н = 10; В=20; ПП =Н; Н=В; В=ПП;
    вариант 2
    Н = 10; В=20; Н = В+Н; В=Н-В; Н=Н-В;

  26. 1. В первом задании получается “вечный” цикл, т.к. счетчик не увеличивается, я бы изменил так:
    <code>
    Счетчик  = Счетчик + 1;
    М.Добавить(Счетчик);
    </code>
    2. Второе задание повеселило, т.к. ошибался, но с помощью отладчика разобрался.
    3. Третье решил легко, но описывать не стану внизу уже приведено достаточно примеров.

  27. 1) На первый взгляд кажется, что будет добавлена тысяча элементов со значением “ложь”. При отладке выясняется, что просто вычисляется выражение “Счетчик = Счетчик +1”, а значение счетчика не меняется. То есть

    получается вечный цикл.
    2) Только в первом случае получился ожидаемый результат. Вывод – если может быть выполнено преобразование строки к числу, оно выполняется.
    3)
    Процедура МеняемЗначенияСПромежуточнойПеременной()
    СохранимЗначениеНачислено=Начислено;
    Начислено=Выплачено;
    Выплачено=СохранимЗначениеНачислено;
    КонецПроцедуры
    Процедура МеняемЗначения() //Зовем на помощь арифметику
    Начислено=Начислено+Выплачено;
    Выплачено=Начислено-Выплачено;
    Начислено=Начислено-Выплачено;
    КонецПроцедуры

  28. Гуляев Алексей 25.01.2011 в 08:08

    Почитал отзывы других пользователей все стало на свои места, в 2.Г.
    Все-таки М.Г. хорошая задумка!!!

  29. Решено.

  30. Не запуская программу ошибался в первом и втором задании.  Третье решил. Отладчик помог разобраться в подводных камнях.

  31. Taranov-SI 25.01.2011 в 06:53

    Дополнительно к моему коментарию по 1 пункту:
    В синтаксис – помощнике для массива Добавить в качестве параметра ЗНАЧЕНИЕ, а не “Логическоевыражение” или “выражение” , поэтому вычисляться ничего не будет

  32.  
     

    Сначала воспринял Счетчик = Счетчик +1 как операцию присвоения из чего и сделал неправильные выводы. После запуска процедуры обнаружил, что цикл бесконечный. С помощью точки останова и табло обнаружил, что массив заполнен значениями ЛОЖЬ и тогда до меня дошло, что это операция не присваивания, а логическая операция сравнения.
    Полученный в уме результат немного отличался от результата в табло, но проанализировав ошибки, разобрался в логике операций конкатенаций и неявного преобразования:

    “010”+”010″  выполняется присоединение двух одинаковых строк
    “010”++”010″  сначала преобразуется  +”010″ в число 10, далее строки и обратно преобразованного в строку 10
    “010”-“010″+1 т.к. минус для строк не определен строки преобразуются к числу и получаем 10-10+1=1
    010″+-“010″+1 первым выполняется -“010” и получаем число -10, далее операция т.к. самое левое значение строка и соответственно числа -10 и 1 преобразуются в строки и получаем строку 010-101.

    Третий пункт был для меня самым легким и решение было найдено быстро:

    Вариант с использованием промежуточной переменной: прм=а; а=в; в=прм;
    Без переменной: а=а+в; в=а-в; а=а-в;

  33. по первому пункту все ясно:
    условие Счетчик= Счетчик +1, которое не может быть истынным, поэтому бесконечный цикл.
    по второму пункту жду разъяснений:)
    по третьему: решение с доп. переменной все просто, а вот без нее пришлось поломать голову, интересная задачка:
    Начислено = Начислено + Выплачено
    Выплачено = Начислено – Выплачено
    Начислено = Начислено – Выплачено

  34. Задание выполнено.
    1. Не сразу поняла о бесконечности цикла.
    2. Сразу о поведении программы не догадалась. Спасибо уже отписавшимся.
    3. Тут все понятно.

  35. Выполнено.
    1. В уме не понял подвоха, в отладке нашел :)
    2. Угадал 3 из 4. Никогда не буду так писать – наверняка в разных релизах платформы по-разному может происходить преобразование, лучше явно вызывать Число() для чисел.
    3. Для числовых переменных сделал, для остальных не стал – задачка еще из школьной информатики.

  36. Пункт 1.
    выражение (Счетчик = Счетчик + 1) имеет булеский тип и равно Ложь, т.е. значение Счетчика не меняется, поэтому цикл не закончится.
    Пункт 2.
    На первых трех выражениях проблем не возникло
    а. “010” + “010”, Строка + Строка, получаем “010010”
    б. “010” ++”010″, сначала +”010″ преобразуется в число 10, а затем к строке “010” + 10, получаем строку “01010”
    б. “010” – “010” + 1, здесь в первой операции  происходит преобразование к числу, и получается ноль, затем +1. Итог Число 1.
    А вот с четвертым возникло затруднение, немного подумав, решил, что итогом будет строка однако вычислил ее не совсем верно. Предположил, что будет “010101”. В отладчике получилось “010-101”. Того что знак числа, тоже попадет в строку,  как-то не сообразил.
    Пункт 3.
    Начислено = 1000;
    Выплачено = 2000;
    1. С использованием промежуточной переменной
    Врем = Начислено;
    Начислено = Выплачено;
    Выплачено = Врем;
    2. Без промежуточной переменной
    для чисел все довольно просто
    Начислено = Начислено + Выплачено;
    Выплачено = Начислено – Выплачено;
    Начислено = Начислено – Выплачено;
    но захотелось чего-то универсального.
    Определяем функцию
    сначала была такая мысль
    Функция ПоменятьЗначения(Ссылка, знач Значение1)
    однако немного помучишись, все же решил добавить третий параметр
    Функция ПоменятьЗначения(Ссылка1, знач Значение1, Ссылка2)
    Ссылка1 = Значение2;
    Возврат Значение1;
    КонецФункции
    Но фактически это аналог первого варианта, только в качестве временной переменой выступает второй параметр функции.
    Затем на просторах интернета нашел информацию, что это можно сделать при помощи функции XOR. Даже дается пример кода для языка С. Но каким образом это сделать для переменных не булевского типа на 1С так и не понял.

  37. Павел Конов 24.01.2011 в 23:08

    1. бесконечный цикл
    2.  Если для А Б В принцип еще более или менее понятен то Г лично для меня загадка, надеюсь пересмотр видео решит вопросы.
    3. Можно решить математически а можно через функцию. Вариант через функцию проверил на числах строках и булевых выражениях.
     
    &НаКлиенте
    Функция Замена(Первый1,Второй1,Знач Первый11)
    Первый1=Второй1;
    Второй1=Первый11;
    КонецФункции
    &НаКлиенте

    Процедура Команда1()
    Первый=60;
    Второй=100;
    Первый=Первый+Второй;
    Второй=Первый-Второй;
    Первый=Первый-Второй;
    сообщить(первый);
    сообщить(второй);
    сообщить(“========”);
    Первый=60;
    Второй=100;

    Замена(Первый,Второй,Первый);
    сообщить(первый);
    сообщить(второй)

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

  38. 1, 3 – Решено.
    2   – Познавательно.

  39. 1.бесконечный цикл
    2.без отладчика в)  не угадала
    3.классика

  40. Задание выполнено.
    1) явно зацикливание, внутри метода не бывает присваиваний, только сравнения.
    2) тут немного не продумала с ++, потом поняла
    3) вопрос с третьей переменной вообще не возникло, а вот без переменной. нашла в инете стандартные решения (например, вот страничка http://ips.ifmo.ru/courses/course1/chC/l1/)
    все конечно хорошо, но решила немного поломать голову.
    вот мое решение:

    Начислено = Строка(Начислено) + Строка(Выплачено);
    Выплачено = Сред(Начислено, 1, СтрДлина(Начислено) – СтрДлина(Строка(Выплачено)));
    Начислено = Сред(Начислено, СтрДлина(Выплачено)+1);
    Начислено = Число(Начислено);
    Выплачено = Число(Выплачено);