Базовый курс. Занятие №2
Второе занятие по 0-му блоку базового курса.
Необходимо изучить следующие главы.
Глава 12. Примитивные типы данных
Глава 13. Контекст исполнения кода
Глава 14. Объектная техника
Глава 15. Сервисные средства по написанию кода
Также нужно выполнить домашнее задание, текст которого доступен на странице.
В этой же теме необходимо написать отчет о выполнении задания.
ps. Участники курса без доступа в мастер-группу отчитаться по домашним заданиям не получиться.
— залогиньтесь.
Если не активировали токен — посмотрите видео-инструкцию (видео N5)
Если вы залогинены, у Вас активирован токен доступа, но вы все равно видите эту запись —напишите нам на e-mail поддержки.
1 Задание
Думал будет добавление элементов, а оказалось зацикливание
2 Задание
Получилось 50 на 50 (
А. «010» + «010» будет строка “010010” оказалось “010010”
Б. «010» ++ «010» будет ошибка оказалось “01010”
В. «010» – «010» + 1 будет 1 оказалось 1
Г. «010» +- «010» + 1 будет 1 оказалось “010-101”
3 задание
Начислено = 1000;
Выплачено = 2000;
Промежуточная = 0;
// 1 вариант
Промежуточная = Начислено;
Начислено = Выплачено;
Выплачено = Промежуточная;
// 2 вариант
Начислено = Начислено + Выплачено;
Выплачено = Начислено – Выплачено;
Начислено = Начислено – Выплачено;
1. Как оказалось цикл бесконечный. Изначально так не думал
2. А и В варианты – тут все понятно. Б и Г вычислил только с помощью Табло
3.Как решить зачачу без использования промежуточной переменной остается загадкой)
Отгадка будет в решении :)
1. Как я и думал: Бесконечный цикл, на каждом проходе добавляющий в массив новый элемент со значением «Ложь».
2. Результат оказался немного неожиданным.
3. // С использованием переменной
Переменная = Начислено; // 1000
Начислено = Выплачено; // 2000
Выплачено = Переменная; // 1000
// Без использования переменной
Начислено = Начислено + Выплачено; // 1000 + 2000 = 3000
Выплачено = Начислено – Выплачено; // 3000 – 2000 = 1000
Начислено = Начислено – Выплачено; // 3000 – 1000 = 2000
Судя по всему очень сильно отстаю.
Бесконечный цикл оказался неожиданностью.
Во втором задании ошиблась со значением варианта Г, думала что – “010” будет преобразовано к 10, а потом сложится с единицей, и только потом будет преобразовано в строку.
Третья задача затруднений не вызвала.
Задание сделал, не догадался как сделать без дополнительной переменной. Пытался через функции сделать.
Отстаю :о(((( Тем не менее:
1. Просто.
2. Г смотрела в Табло.
3. С использованием промежуточной переменной – элементарно. Без нее:
а = а + в;
в = а – в;
а = а – в;
По-моему, несовсем корректно, т.к. в явном виде я промежуточную переменную не определила, но в ее роли выступает “а” (см. первую строку).
> но в ее роли выступает «а»
C точки зрения выделения памяти все же будет 2 переменных.
1 и 2 задачки проблем не вызвали, а в 3-ей до обмена без вспомогательной переменной не додумался.
1) в уме решил, что просто цикл пройдет и количество элементов в массиве не увеличится, т.к. не задано количество элементов в массиве при вызове конструктора. В отладчике моя версия не подтвердилась – сам оператор Счетчик = Счетчик +1 не выполняется при передачи в качестве параметра методу “Добавить”, поэтому цикл получается бесконечным.
2) Мой результат:
1. 20
2. 20
3. 1
4. 1
Как на самом деле:
1. “010010”
2. “01010”
3. 1
4. “010-101”
3) С использованием промежуточной переменной:
1. Все ясно
2. Не додумался..
Продолжаю догонять…
1. Зацикливание, один из примеров “переоптимизации” решения на мой взгляд.
2. С лидирующими нулями интересные вещи, правда, пока не могу придумать реальный пример подобного использования, да и при чтении подобного кода на понимание должно уходить больше времени, нежели при написании Число(СтроковаяПеременная)
3.
А = 1000; Б =2000;
С = А; А = Б; Б = С;
или
А = 1000; Б =2000;
А = А + Б;
Б = А – Б;
А = А – Б;
Я так понял, что методы ожидают параметры и совершенно не готовы работать с операторами?
Верно, операторы при передаче параметров нельзя выполнять.
Интересно, что конструкция:
Массив=Новый Массив;
Счетчик=0;
Пока Счетчик<1000 цикл
Массив.Добавить(Счетчик=1+Счетчик);
КонецЦикла
тоже не работает.
Скорее всего, в методах операцию присваивания выполнить невозможно (только сравнения).
1. Зацикливается. Создается бесконечный одномерный массив, все элементы которого “Ложь”.
Если исправить так:
<code>Счетчик = 0;
М = Новый Массив;
Пока Счетчик < 1000 Цикл
М.Добавить();
Счетчик = Счетчик +1;
КонецЦикла;</code>
то создается одномерный массив из 1000 элементов со значением “Неопределено”
2. А. «010010»
Б. «01010»
В. 1
Г. «010101»
3. Вариант 1:
<code>Промежуточное = Начислено;
Начислено = Выплачено;
Выплачено = Промежуточное;</code>
Вариант 2:
<code>Начислено = Начислено + Выплачено;
Выплачено = Начислено – Выплачено;
Начислено = Начислено – Выплачено;<code>
1. Выпонил.
2 и 3 Нет.
2-3. А попытки выполнения были? :)
Задание выполнил.
1. В коде произойдет зацикливание, так как значение переменной Счетчик не будет меняться.
2. Ошибся в преобразовании “010” – “010” + 1.
3.Решил только с использованием промежуточной переменной
Ход решения:
Задачка 1
Прочел код, смутил метод «.Добавить». Не вспомнил, что б в курсе давалось описание данного метода. Полез в синтакс-помощник, чтобы понять, что добавляет данный метод: «Новый элемент в массив или новые измерения массива»? Синтакс-помощник подсказал, что новый элемент.
Далее накидал табличку, по которой выходило, что в результате выполнения кода будет создан массив (1,2,3,…….,1000)
Но, отладчик упорно утверждал, что выражение «Счетчик = Счетчик +1» имеет булевское значение Ложь. И соответственно результатом выполнения данного кода будет бесконечное заполнение массива значением Ложь.
Начал пересматривать видеоуроки, потом перечитывать описание метода Добавить , но так и не нашел ответа из-за чего так происходит L.
Хорошая задачка на внимательность
«010» + «010» // два значения типа Строка будут склеены, результат = «010010»
«010» ++ «010» // сначала будет выполнена унарная операция, в результате которой тип второго значения будет преобразован в Число равное 10, далее действует правило: типы элементов выражения преобразуются к типу первого элемента. Соответственно результат: значение типа Строка равная «01010»
«010» – «010» + 1 // т.к. для типа Строка операция «-» не возможна, то оба строковых элемента будут преобразованы в тип, который поддерживает операцию «-», результат = 0, после чего к числовому значению 0 будет прибавлено числовое значение 1, итоговый результат = 1
«010» +-«010» +1 // сначала будет выполнена унарная операция, в результате которой тип второго значения будет преобразован в Число равное -10, далее действует правило: типы элементов выражения преобразуются к типу первого элемента. Соответственно результат: 010-101
Первый вариант сложностей не вызвал, т.к. описывался в видеоуроках:
Начислено = 1000
Выплачено = 2000
ВременноеЗнч = Начислено // 1000
Начислено = Выплачено // 2000
Выплачено = ВременноеЗнч //1000
Второй вариант по началу вызвал ступор, сначала, почему то начал идти деление:
A=x
B=y
A= x*y/x //иксы сократятся в результате A=x
B= y*x/y // игрики сократятся в результате B=y
Ошибку понял, когда зашил алгоритм в программу.
Потом уже пошёл через сложение и всё получилось:
A=1000
B=2000
A=A+B // 3000
B=A-B // 1000
B=A-B // 2000
1. Думал, что подвох в ошибке метода, добавления в массив. После запуска кода понял,что получается вечный цикл. Проверил на табло, в массив бесконечно добавляется значение Ложь.
2. Угадал только с третим результатом
3. Нач=1000;
Вып=2000;
ДПМ;
ДПМ=Нач;
Нач=Вып;
Вып=ДПМ;
Без доп. переменной не догнал (
Первая задача, для меня не понятно почему знак = в данном случае лог. оператор.
Вторая задача интересная особенно с ++ и — “010” + (+1)*”010″ + 1, сначало умножение получаем число, далее по первому операнду сравнения получаем строку.
Третью задачу решил через функцию с передачей переменных по значению
&НаСервере
процедура Обмен(начислено,выплачено,знач нач,знач вып)
вып = нач;
начислено = Выплачено;
выплачено = вып;
КонецПроцедуры // ()
&НаСервере
процедура Обмен(начислено,выплачено,знач нач,знач вып)
вып = нач;
начислено = Выплачено;
выплачено = вып;
КонецПроцедуры // ()
>для меня не понятно почему знак = в данном случае лог. оператор
См. решение этого задания.
На подножку вагона
С циклом все ясно – сколько ни складывай – все равно ложь
а вот тут я над собой прикололся )
так вот думалось
А. «010» + «010» = «010010»
Б. «010» ++ «010»= «010010»
В. «010» – «010» + 1 = 1
Г. «010» +- «010» + 1 = 1
А так вышло
010010
01010
1
010-101
в видео упоминалась задачка
третью часть пытался придумать не для цифр…
не а – ничего не придумалось без классической временной переменной.
Только например так для любого типа – хотя массив это та же временная переменная
А=1000;
Б=2000;
М = Новый Массив;
М.Добавить(А);
М.Добавить(Б);
А=М[1];
Б=М[0];
Сообщить(А);
Сообщить(Б);
Наступил на грабли. Пошаговая отладка приведенного кода убедительно показала, что внутри скобок метода “Добавить” осуществляется не вычисление значения выражения (как я предположил), а выполнение операции сравнения (интересно это справедливо для всех методов или нет?). Таким образом, счетчик не увеличивается, и мы попадаем в “вечный” цикл, добавляющий в массив элемент «Ложь».
Эта задача наглядно продемонстрировала методы неявной типизации для строк. Вариант «А» – конкатенация без вариантов, остальные варианты проверял с помощью инструмента «Табло». При анализе результатов проверки вариантов Б-Г подумал, где это можно применить на практике. Пока ничего не пришло на ум. -:))
Решение с использованием промежуточной переменной элементарно, тем более Евгений в «теории» подробно разобрал этот алгоритм. Мое внимание привлек второй вариант (без использования второй переменной). Сначала подумал, что здесь должна применяться какая-то конструкция с использованием «перестановок слагаемых», а затем практически сразу появилась идея использовать процедуру с передачей параметров по значению, что и было реализовано. Функция получает два параметра «Знач Начислено» и «Знач Выплачено». В теле функции: «Начислено=Выплачено» и «Возврат Начислено». В вызывающей процедуре «Выплачено=Начислено». Строго говоря, второй вариант хоть и не использует промежуточную переменную, но все-таки приходится применять некую промежуточную конструкцию в виде функции с передачей параметров по значению. Посмотрю, как будет решен этот вариант в видое-разборе задания.
P.S. Хотелось бы скачать 1 модуль курса, чтобы выходные посвятить его изучению. Дайте, пожалуйста, ссылку.
P.P.S. Хоть и группа виртуальная, но ее влияние ощущается, когда видишь только, что выложенное задание и через час уже 30-40 комментариев, то автоматически садишься за выполнение. Не хочется быть в числе отстающих. Для себя я решил – комментарии других участников читаю только после того, как выложил свой отчет.
> Хотелось бы скачать 1 модуль курса, чтобы выходные посвятить его изучению.
Сейчас проводим незначительное обновление материалов первого блока. К выходным его выложим.
>комментарии других участников читаю только после того, как выложил свой отчет
Это правильная стратегия обучения.
1 Выражение «Счетчик=Счетчик+1» система принимает за логическую операцию, как следствие счетчик не увеличивается и выхода с цикла не будет
Подскажите, есть ли в системе специальный логический (чтобы однозначно интерпретировался как логический) оператор равенства?
2) А и В решил правильно Б и Г разобрался только через табло
3) const= f(x,y)
X=f(const,y)
Y=f(x,const)
>специальный логический (чтобы однозначно интерпретировался как логический) оператор равенства
Нет, только “=”, который может интерпретироваться по разному.