Базовый курс. Домашнее задание №2
Второе задание по 0-му блоку базового курса.
Для выполнения рекомендуется изучить следующие главы 0-го блока.
Глава 11. Программный код
Глава 12. Примитивные типы данных
Глава 13. Контекст исполнения кода
Глава 14. Объектная техника
Глава 15. Сервисные средства по написанию кода
К сожалению, у Вас недостаточно прав для просмотра этой записи. Если Вы еще не залогинены на сайте — залогиньтесь. Если Вы оплачивали курс, у Вас активирован токен доступа, Вы залогинены, но Вы видите эту запись — напишите нам на e-mail поддержки.
Задание выполнила. (Уже и решение почитала)
3. Использовала передачу Начислено по “Знач “:
Перем Начислено;
Процедура ПриСозданииНаСервере(…)
Начислено = 1000;
Выплачено = 2000;
Выплачено = поменятьЗначения(Начислено,выплачено);
КонецПроцедуры
функция ПоменятьЗначения(ЗНАЧ Нач,Выпл);
НАчислено = Выпл;
Выпл = Нач;
возврат Выпл;
КонецФункции
Что-то неправильно?
—–
Как люди вставляют в коммент свои большие тексты? Мне не дает воспользоваться буфером обмена…
Вообще буфер обмена должен работать.
Попробуйте другой браузер.
Второе не самое очевидное. За систематизированный материал о приоритетах операций – респект
Сделано.1. В отладчике не запускала во избежание зацикливания
2. “а”,”б”, “в” получилось, но долго вникала в “г” – никак не могла избавится от “лишнего” нолика перед минусом..
3. Без проблем оба способа: метод “треугольника” в первом случае и арифметика ( +, -, -) – во втором.
Задание выполнил.
1) Бесконечность цикла увидел только на отладке.
2) Без затруднений только расчет в уме не совпали с результатами в табло
3) Без буферной переменной не догадался как сделать.
Задание выполнил. 1) Проблем не возникло 2) с вариантом г разобрался только спомощью табло 3)без использования переменной были затруднения
Задание выполнил.
по первой части: все понятно
по второй части: были затруднения с выражениями, где содержалась операция “++” и “+-“, при помощи инструмента “Табло” все моменты были разобраны
по третей части: решил только первым способом, через буферную переменную.
Догоняю.
1. Цикл бесконечный, массив заполняется значениями “Ложь”
2. Затруднение вызвал только пункт Б, разобрался.
3. Не сразу получилось без использования переменной.
Домашнее задание сделал, комментарии прочитал, затруднений не возникло, только небольшое удивление :) поэтому свои решения и комментарии приводить не буду, потому, что сделать не как все невозможно.
1. По первому заданию сначала решил ответ будет 999, пригляделся решил что будет 1000. При проверке завис.
2. Все примеры решил с ошибками.
3.
&НаКлиенте
Процедура Команда1(Команда)
Если Объект.ПервыйСпособ=Истина тогда
//1. Способ
С=Объект.Начислено;
Объек.Начислно=Объект.Выпалчено;
Объект.Выплачено=С;
//2 Способ
иначе
Объек.Начислно=(Объект.Выплачено-Объек.Начислено);
Объект.Выплачено=Объект.Выплачено-Объект.Начислено;
Объек.Начислено=Объек.Начислно+Объект.Выплачено;
конецЕслИ;
КонецПроцедуры
Догоняю:
1. Проблем понять не составило, т.к. в массив будет добавляться результат сравнения, а цикл будет бесконечный, т.к. счетчик не увеличивается.
2. А. Б. В. проблем на доставили, а вот Г не ожидал что потеряется нолик и будет записан минус.
3. Не чтоб не было одинаково:
Начислено = Выплачено;
Выплачено = Число(Формат(Выплачено/Начислено,”ЧЦ=4; ЧС=-3; ЧВН=”));
Начислено = Выплачено; Выплачено = Число(Формат(Выплачено/Начислено,”ЧЦ=4; ЧС=-3; ЧВН=”));
Задание выполнено
1. Со счетчиком всё понятно, хотя изначально не предположил что это операция сравнения, но потом понял в чём подвох.
2. Интересно, никогда бы самостоятельно не заметил, сложность появилась со 2-ым и 4-ым, ну оно и понятно, а вообще задание очень интересное.
3. По третьему заданию уже отписались ни раз, лично моё мнение, я данной “возможностью” пользоваться не буду, в противном случае после меня будет трудно разобраться в написанном. Операция не прозрачна и не очевидна, но как пример вполне съедобна.
1. зацикливание подтвердилось, но прочитав комментарии, поняла, что не доглядела булево значение счетчика.
Никак не догадаюсь: как отличить “=” это операция присваивания или сравнения?
2. А и В были угаданы, с унарными операциями, даже после лекций туговато..
3. Начислено = Начислено + Выплачено
Выплачено = Начислено – Выплачено
Начислено = Начислено – Выплачено
Добрый вечер. По первому заданию – все было понятно сразу. Во втором задании во 2 и 4 примере ответила неправильно. Третье задание не вызвало проблем. Оказалось многие решили также.
1. При просмотре оператора понял, что в операторе Массив.Добавить(Счетчик = Счетчик +1); выражение Счетчик = Счетчик +1 по сути своей аналогично выражению Счетчик = Счетчик = Счетчик +1 , т.е. Счетчик=Ложь и не происходит инкрементирование номера элементов массива (но с записью такого вида познакомился недавно, при выполнении ДР №1 и сначала даже не понял в чем подвох может быть:) ).
2. а).”010″ + “010” – конкатенация строк = “010010”
б). “010” ++ “010” = “010”+10 – выполняется преобразование +”010″ в число 10 (т.е. выполняется унарная операция выполняется по приоритету раньше операции сложения), после чего выражение “010”+10 -(после повторного преобразования числа 10 в строку “10”) дает результат “01010”
в). “010” – “010” + 1 = 1, т.к. из-за неопределенности операции “минус” для строк система пытается преобразовать оба значения в число и получается выражение 10-10+1 = 1
г). “010” +- “010” + 1 = “010-101”, т.к. сначала из-за выполнения унарной операции минус получаем выражение “010”+-10+1, и так как первая в выражении стоит строка получаем “010-10″+1=”010-101”
3. Вариант переноса значений между двумя переменными с использовпанием промежуточной
Временно = Начислено;
Начислено = Выплачено;
Выплачено = Временно;
Вариант без использования промежуточной переменной
Начислено = Начислено + Выплачено;
Выплачено = Начислено – Выплачено;
Начислено = Начислено – Выплачено;
Добрый вечер.
Решения по ДС №2:
1. Подумал все просто и не обратил внимания на то, что счётчик не увеличивается, да к тому же элемент массива имеет булевый тип.
2. Совпал только пункт “В”. Остальные варианты познавательны.
3. С временной переменной легко, тем более что в 0-ом блоке это было. А вот без временной переменной идеального решения не нашел, в результате получитлся примитив:
Начислено = Начислено + Выплачено;
Выплачено = Начислено – Выплачено;
Начислено = Начислено – Выплачено;
А я все догоняю…
1. Самостоятельный вариант – в массив через каждый проход цикла
будет добавляться значение начиная с единицы и далее каждый раз
увеличивающееся на единицу и так пока не достигнет 1000 циклов…
Посмотрел через отладчик: выражение Счетчик = Счетчик + 1 принимает вместо
числового значения значение типа “булево” – я не понял, почему, ведь должен
был быть числовой тип…
Когда поставил выражение “Счетчик = Счетчик + 1” до “М.Добавить(Счетчик)” –
получил ожидаемый ранее результат..
в чем моя ошибка – буду смотреть в решении.
2. А. “010010” тип Строка ( в табло подтвердилось)
Б. “01010” тип Строка (сначала сработает знак “+”, стоящий перед строковым
“010”, превратив его в число 10, затем строка “010” преобразует число 10 в строку
“10” и получаем 01010 (в табло результат подтвердился, но в своих рассуждениях я все же сомневаюсь)
В. мой вариант – будет ошибка, так как операцию вычитания нельзя производить
над строковыми значениями (в табло получил число 1 – не понял почему, думал что операцию вычитания со строковыми значениями производить нельзя, то есть “010” – “010” должно было по моему мнению вызвать ошибку – я оказался не прав).
Г. тоже подумал. что будет ошибка, результат в табло выдал иное – (похоже, тему преобразования значений я совсем не понял)
3. Вариант 1 ( с использованием промежуточной переменной) :
Пром = Начислено;
Начислено = Выплачено;
Выплачено = Пром;
Вариант 2 (без использования промежуточной переменной сам не справился)
Наверстываю, задание сделал, с циклом все понятно, он бесконечный(единственное не досмотрел и предположил, что в массив будет добавляться значение “1” потом разобрался), со вторым заданием не так все просто как казалось, было очень интересно, с третьим тоже вообщем все ясно
Домашнее задание выполнил
3.2 задание без дополнительной переменной сделал.
почитал решения других – понял что все исходят из того что переменные за ранее известны … но это же не правильно …
а если в следующий раз:
«Начислено» = 4000, а «Выплачено» = 1
Приведенные решения верны если:
«Начислено», «Выплачено» – КОНСТАНТЫ
Мое решение:
================================
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
а = 1000;
с = 2000;
а = Строка(а) + Строка(с);
Сообщить(“а = ” + а);
с = Сред(а,1,СтрДлина(а)-СтрДлина(с));
а = СтрЗаменить(а,с,””);
Сообщить(“а = ” + а);
Сообщить(“с = ” + с);
КонецПроцедуры
==============================
1. Бесконечный цикл, ибо счётчик не увеличивается.
2а. 010010 (“010” – строка, + “010” – строка);
2б. 01010 (“010” – строка, + “010” = 10 – число);
2в. 1 (Обе строки преобразовываются в число = 0 +1 = 1);
2г. 010-101 (“010” – строка, +-“010” – преобразовывается в число -10, но общий результат – строка, а значит строка “010-10” + 1 = 010-101 (с этой строкой разобралась только после тщательного разбора в “табло”…).
3а.
Перем Начислено;
Перем Выплачено;
Перем Темп;
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Начислено = 1000;
Выплачено = 2000;
Темп = Начислено;
Начислено = Выплачено;
Выплачено = Темп;
Сообщить(Начислено);
Сообщить(Выплачено);
КонецПроцедуры
3б.
Перем Начислено;
Перем Выплачено;
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Начислено = 1000;
Выплачено = 2000;
Начислено = Начислено + Выплачено;
Выплачено = Начислено – Выплачено;
Начислено = Начислено – Выплачено;
Сообщить(Начислено);
Сообщить(Выплачено);
КонецПроцедуры
1. Бесконечный цикл, ибо счётчик не увеличивается.
2а. 010010 (“010” – строка, + “010” – строка);
2б. 01010 (“010” – строка, + “010” = 10 – число);
2в. 1 (Обе строки преобразовываются в число = 0 +1 = 1);
2г. 010-101 (“010” – строка, +-“010” – преобразовывается в число -10, затем преобразовывается в строку “-10”, а значит строка “010-10” + 1 (число преобразовывается в строку) = 010-101 (с этой строкой разобралась только после тщательного разбора в “табло”…).
3а. Темп = Начислено;
Начислено = Выплачено;
Выплачено = Темп;
3б.
Начислено = Начислено + Выплачено;
Выплачено = Начислено – Выплачено;
Начислено = Начислено – Выплачено;
1. не увидел, где приращается счетчик, и в отладке стало наглядно видно, что цикл бесконечный. не сразу догадался, что в цикле операция сравнения.
2. В рассчитал правильно, в остальном были сюрпризы.
3. Функция ПоменятьМестами(парам1, парам2)
парам1 = парам1 + парам2;
парам2 = парам1 – парам2;
парам1 = парам1 – парам2;
КонецФункции
Продолжаю догонять остальных:
1. Понятно что повиснет если смотреть внимательно.
2. Угадал только один раз. Спасибо, очень интересные примеры казалось бы привычных вещей.
3. Ну с доп. переменной и так все понятно, а без нее старый “баян” про перестановку “А” и “Б”:
Начислено = Начислено + Выплачено;
Выплачено = Начислено – Выплачено;
Начислено = Начислено – Выплачено;
Выплачено = Начислено – Выплачено;
Начислено = Начислено – Выплачено;
1.Бесконечный цикл, понятно. Для меня было интересно, что Счетчик=Счетчик+1 в массив записывается Ложь, а Счетчик+1 в массив записывается 1. Вариант с заполнением массива значениями от 1 до 1000 тоже сделала :)
2. Г – интересный результат. Сначала выполняется преобразование 2-го слагаемого в число, затем выполняется конкатенация с преобразованием типа
3.Вариант с промежуточной переменной более нагляден, поэтому имеет право на существование.
Вариант 2
Выплачено=Начислено+Выплачено;
Начислено=Выплачено-Начислено;
Выплачено=Выплачено-Начислено;
1. В данном случае цикл будет выполняться бесконечное число раз, так как значение Счетчик всегда равно 0. Массив является коллекцией значений и следовательно никакие математические операции внутри него не выполняются.
2. Значения получаются следующие
“010010”
“01010”
1
“010-101”
3. Изменение значений переменных
1. Вариант 1 – с использованием промежуточной переменной
Начислено = 1000;
Выплачено = 2000;
х = Начислено;
Начислено = Выплачено;
Выплачено = х;
2. Вариант2 – без использования промежуточной переменной
Начислено = 1000;
Выплачено = 2000;
Выплачено = выплачено – начислено;
Начислено = Начислено + Выплачено;
Выплачено = Начислено – выплачено;
Итак, догоняю остальных.
1. Бесконечный цикл, массив заполняеться ложью (т.к. нет присваивания, а есть только сравнение). Счетчик не увеличиваеться.
2. В уме: А – 20, Б – 20, В – 1, Г – 1. Табло мне верить отказалось… Оказывается, преобразование в число только при вычитании… Рад, что это только теоретические примеры, а в жизни можно явно преобразовывать типы для предотваращения таких оказий.
3. С применением третьей переменной – легко и просто – описано и в учебном метериале. А вот без… Не заканчивал я программистких курсов, мозга не хватает… Подсмотрел решение других.
1. Бесконечный цикл.
2. Возникли трудности только по варианту
«010» – «010» + 1.
3. Мой вариант:
п1 = 1000;
п2 = 2000;
п1 = п1+п2;
п2 = п1-п2;
п1 = п1-п2;
1 понятно что будет зацикливание.
2 возникли небольшие сложности с “010”++”010″
и с “010”-“010”
3 сложностей не возникло
Выполнено:
1) В уме решил, что счетчик будет увеличиваться. Реализовал вывод результата кода через сообщить, обработка зависла в бесконечном цикле)) Немного подумал, вспомнил, про работу и вычисление логических выражений, осознал свою невнимательность при прослушивании видеокурса ))
2) В (Б) и (Г) так и не понял, почему конечный результат получился строкового типа. Мои рассуждения: несмотря на то что первый операнд в операции строкового типа, сама операция инкремента должна выполняться над числовыми величинами, значит и на выходе должна получиться числовая величина.
3) С использованием промежуточной переменной, проблем не возникло.
Во втором варианте пришлось подумать):
&НаКлиенте
Процедура ПоКнопкеВыполнить(Команда)
Начислено = 1000;
Выплачено = 2000;
Сообщить(“Начислено = ” + Строка(Начислено) + ”
|Выплачено = ” + Строка(Выплачено) + ”
|—————–“);
Начислено = Начислено + Выплачено;
Выплачено = Начислено – Выплачено;
Начислено = Начислено – Выплачено;
Сообщить(“Начислено = ” + Строка(Начислено) + ”
|Выплачено = ” + Строка(Выплачено));
КонецПроцедуры
1.Как и умозрительно – счётчик не увеличивается, цикл бесконечный (для проверки вместо 10000 указал 2).
2. ошибся в примере “В.” (после В. пеерсмотрел результат Г.).
3. с переменной – вообще не вопрос, без переменной:
а=в-а; в=в-а; а=а+в;
когда-то в прошлом веке на первом курсе такое решали (другие машины, другие ресурсы, другая оптимизация…)
догоняю!
1. Т.к. = в данном случае не присваивание, а сравнение в массив будет добавлять Ложь, а счетчик меняться не будет, вывод бесконечный цикл. Вывод подтвердился.
2. Неверно посчитала в уме Б, Г. Поняла свои ошибки.
3. 1) вариант:
Врем = Начислено;
Начислено = Выплачено;
Выплачено = Врем;
2) вариант:
Начислено = Начислено+Выплачено;
Выплачено = Начислено – Выплачено;
Начислено = Начислено – Выплачено;
2 вариант действует только для чисел, и более сложен в восприятии
Домашнее задание выполнил.
С помощью комментариев коллег уяснил
для себя некоторые неясности.
мои решения
1. все повисло что совершенно логично, т.к. счетчик не увеличивается
2. в Г ошибся
3. с дополнительной переменной без проблем, без нее смог только с подсказкой…
Начислено = Начислено + Выплачено;
Выплачено = Начислено – Выплачено;
Начислено = Начислено – Выплачено;
опять задваивает тест при copy/paste…
Можно ли прикрутить предпросмотр ответа или редакцию существующего – не понятно что получищь в итоге когда пишешь.
1.
Операция Счетчик = Счетчик + 1 не является операцией присваивания, т.к находится внутри метода.
Следовательно, Счетчик не будет меняться и цикл будет бесконечным.
В массив будут добавляться элементы булевского типа и всегда = “ложь”, поскольку всегда Счетчик
<> Счетчик + 1.
2.
“А” – складываются 2 строки без преобразований.
“Б” – происходит преобразование в второго слагаемого в число 10 (из-за оператора+) а затем обратно в строку по типу первого слагаемого.
“В” – обе строки преобразуются в числа, поскольку в выражении есть число и преобразование возможно.
“Г” – второе слагаемое преобразуется в двоичное число (из-за оператора-) и складывается с 1, затем результат складывается со строкой.
3. Через делениеи умножение аргументов
1. Все достаточно прозрачно – произойдет зацикливание. Единственное сначала упустила тот факт, что знак = внутри скобок – это не присваивание, а сравнение, но потом при проверке на примере этот момент просекла :)
2. Почти все выражения вычислила правильно.
а) “010”+ “010” дает 010010 т.к. это обычная конкатенация
б) “010”++”010″, тут не учла, что вторая переменная будет переведена сначала в число, и лишь затем снова преобразована в строку
в) “010”-“010″+1 , все преобразуется в число , поэтому результат 1
г) “010”+-“010″+1, тут все преобразуется в строку, результат 010-101
3. 1) вариант с промежуточной переменной, ясен, он рассматривался в одном из уроков.
2) вариант вызвал затруднение, в результате после размышлений родилась мысль сделать через соотношение величин друг к другу :)))
Начисление = Начисление/Выплату;
Выплата = Выплата*Начисление;
Начисление = Выплата/Начисление;
(пошла, что называется тяжелым путем) А как оказалось из комментариев, ларчик просто открывался :)))
Сейчас добрался до задания. третья – обычная задача при приеме на работу во франч )))
Домашнее задание выполнил
to ulan,romboro зачем выкладывать решения? посмотрите видео об обчете о проделанной работе над ДЗ.
Да, но там сказано, что фразы “ДЗ сделано” будет недостаточно..
почему бы не выкладывать свои решения после того как вы вы опубликуете свое решение? просто когда возникает непонимание …лишний раз посмотришь материал и почитаешь книгу может(и возможно откроешь еще что то новое), а так посмотрел человек решение скопипастил и не факт что оно оптимальное и правильное, но зато отписался
>почему бы не выкладывать свои решения после того как вы вы опубликуете свое решение
Не совсем понял сути предложения. Опишите подробнее, пожалуйста..
как то видится примерно так: есть ветка с вашим видео- вот в ней пожалуйста пусть выкладываются решения и обсуждается почему человек сделал так или иначе,
а в ветке с ДЗ происходило бы общение либо вопросы как у Tatiana п2 и 3 , но не пост romboro (к примеру) с решением. Человек не будет думать и пытаться решить задачу, когда возникла ситуация затруднения, а ведь “осеняет” бывает и где то в автобусе или метро на следующий день :)
Ситуация следующая. Видео-решение выкладывается, когда большая часть участников справилась с выполнением домашнего задания.
А отчет о выполнении желательно писать сразу, чтобы не забыть нюансы.
Поэтому все в ветке с ДЗ – отчитываемся.
А в ветке с видео-решением – можно обсуждать решение преподавателя.
< зачем выкладывать решения?
иногда полезно увидеть и понять ход мысли коллеги
Поддерживаю. До выкладывания решения преподавателем есть время и самому подумать и на решения коллег посмотреть.
1. Бесконечный массив значений “ложь”.
2. Не совсем улавливаю принцип, там, где 2 знака подряд. Подумаю.
3. Без промежуточного значения пока не нашла решение.
2п
“010” + + “010” = “010” + 10 = “01010”
если вспомнить порядок операций, унарные операции выполняются перед арифметическими соответсвенно
+ “010” – преобразуется к числу 10, а далее
“010” +10 т.к. первый параметр типа строка соответственно второй преобразуется к строке и получается “01010” в итоге
1.
Т.к. результатом выполнения условного оператора Счетчик = Счетчик + 1 является Ложь, то в массив будут добавляться элементы со значением Ложь, при этом итератор цикла меняться не будет. В результате получаем бесконечный цикл.
2 .
«010» + «010» = «010010»
«010» + + «010» = «010» + 10 = «01010»
«010» – «010» + 1 = 0 + 1 = 1
«010» +- «010» + 1 = «010» + (-10) + 1 = «010-10» + 1 = «010-101»
3.
Вариант 1:
Буфер = Начислено;
Начислено = Выплачено;
Выплачено = Буфер;
Вариант 2:
Начислено = Начислено + Выплачено;
Выплачено = Начислено – Выплачено;
Начислено = Начислено – Выплачено;
1. Все понятно, стоит лишь помнить что если = не стоит на первом месте то это не оператор присваивания, а логический оператор сравнения.
2. Сначала был удивлен результатами, но почитав комментарии понял, что унарная операция имеет более высокий приоритет, чем операция сложения это расставило все на свои места.
3.1 С дополнительной переменной все тривиально.
3.2. Без дополнительной переменной вынес себе мозг, но так и не додумался, посмотрел комментарии и пришел к выводу. что все гениальное просто. А какие только варианты не придумывал.
Но я считаю есть один ньюанс. Считаю что вариант
a=b-a, b=b-a, a=b+a лучше чем a=a+b, b=a-b, a=a-b потому, что если теоретически предположить, что a и b очень большие числа близкие к максимальным для своего типа, то суммирование во втором варианте может привести к переполнению, а первый вариант в любом случае будет выполняться правильно.
b-a тоже может привести к переполнению.
Если b максимально большое, а a – максимально маленькое (отрицательное)
Домашнее задание выполнил
Выводы сделал.