Примеры ответов от меня в режиме обучения 1С (программирование)

С уважением, Алексей Карманов

Мой ответ на письмо ученика

Ошибку выдает, потому что больше либо равно пишется не "=>" как написано у вас, ">=" то есть сначала знак больше, а потом равно.

Дальше. По 18 заданию. Есть ошибки.
Вы вводите два числа от пользователя. Но второе введенное значение нигде не используете.

Программа должна быть написана так, чтобы я её не менял и при запуске сколько угодно раз и вводе каких угодно чисел она выдавала какое из введенных мною чисел (первое или второе) больше. Инициализировать имя лучше всегда нулём. Нет никакого смысла в том, что вы инициализируете одно имя 3, а другое 4. Ввести-то я могу любые значения. Жду исправлений.

По заданию 19. В общем всё хорошо. Но переделайте так, чтобы компьютеру приходилось или умножать или складывать. А у вас он сейчас вне зависимости от того какие я числа ввёл и умножает и складывает, а потом выводит один из результатов. Жду исправленного варианта.

**************************************************************

Мой ответ на письмо ученика

Замечательно!

Но по заданию №10 у меня есть замечание:

Я хотел, чтобы вы выводя таблицу умножения не сами считали результаты, а заставили сделать это компьютер. А вы просто уже готовые результаты напечатали в строковом виде.

Обратите внимание на пример, предшествующий десятому заданию. Там ключ к разгадке.

Жду от вас исправленного задания №10.

По выделенному пункту "Накопленные вызовы". Он появился, потому что вы запускаете программу из конфигуратора. А это специальный режим запуска в котором происходит замер производительности, скорости выполнение вашей программы. Именно для замера производительности вашего решения и служит пункт накопленные вызовы. Более подробно сейчас смысла вникать вам в это нет, так как вы ещё не обладаете необходимыми знаниями. Просто уясните, что чем больше вызовов накоплено, тем медленнее работает программа. Это показатель производительности.

**************************************************************

Мой ответ на письмо ученика

Верно выполнили. Есть только два замечания:

1) В задании нужно выводить сумму, если произведение БОЛЬШЕ ста, а у вас БОЛЬШЕ ИЛИ РАВНО (то есть нужно >= заменить на >).

2) Поработайте над именами. Я предлагаю первое число назвать ЧислоОтПользователя1, а второе ЧислоОтПользователя2. Так красивее и понятнее. Хотя на результат не влияет.

Исправьте эти два недочета и можно смело переходить к заданию №8.

**************************************************************

Мой ответ на письмо ученика

Подсказка №1: шаг должен меняться от одного до 10.

То есть сначала организуйте цикл от 1 до 10. Это есть в уроке.

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

**************************************************************

Мой ответ на письмо ученика

Почти верно.

Вводите числа совершенно верно. Остальное тоже верно.

Но вот, заметьте, в предыдущем примере НаименьшееЧисло я инициализировал заведомо очень большим значением (чтобы больше него пользователь не ввел).

А тут у нас НаибольшееЧисло, а значит догадайтесь каким значением его нужно инициализировать.

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

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

В общем вам всего одно исправление нужно сделать, чтобы заработало.

**************************************************************

Мой ответ на письмо ученика

Верное решение.

Единственное замечание, в том, что можно было не использовать
код символа, а сравнивать напрямую символ, без вычисления его кода. Так нагляднее. Ну и так можно использовать функцию Найти, которая ищет подстроку в строке.

Например, так:

Стр = "";
ВвестиСтроку(Стр, "Введите предложение");
 
ДлинаСтроки = СтрДлина(Стр);
Пробел = 0;
ЗнакПрепинания = 0;
Шаг = 1;
 
Пока Шаг <= ДлинаСтроки Цикл
    Символ = Сред(Стр, Шаг, 1);
    Если Символ = " " Тогда
        Пробел = Пробел + 1
    ИначеЕсли Найти(".?!,", Символ) > 0 Тогда 
        ЗнакПрепинания = ЗнакПрепинания + 1;
    КонецЕсли;
    Шаг = Шаг + 1;
КонецЦикла;		
 
КоличествоСлов = Пробел + 1;
 
ОткрытьЗначение(Стр + " ОБНАРУЖЕНО: Слов: " + КоличествоСлов + 
    " Пробелов: " + Пробел + " Знаков препинания: " + ЗнакПрепинания
);

**************************************************************

Мой ответ на письмо ученика

Сортировка пузырьком просто блеск! И стиль оформления и имена переменных. Отлично.

Программа вычисления факториал читается тяжеловато, хотя и считает верно.

Наверное, более подходящим здесь было бы применение цикла Для, например вот так:

ЧислоОтПользователя = 0;
ФакториалЧисла = 1;
Для Шаг = 1 По ЧислоОтПользователя Цикл
    ФакториалЧисла = ФакториалЧисла * Шаг;
КонецЦикла;
Сообщить(ФакториалЧисла);

**************************************************************

Мой ответ на письмо ученика

Ссылка в программировании означает связь, указатель на что-то (в данном случае указатель параметра функции на переменную снаружи, которая была передана в этот параметр).

Значение - отсутствие такой связи, когда передаётся только значение переменной (число, строка и т.п.).

В функцию входит её заголовок (имя + параметры) и тело (команды, которые выполняются внутри функции). 

**************************************************************

Мой ответ на письмо ученика

Возврат - это оператор, который принимает на вход какое-то значение, прерывает выполнение функции и возвращает это значение в качестве работы функции.

Переменную можно было назвать как угодно, не обязательно результат.
А можно и вообще без переменной, сразу возвращать значение.

**************************************************************

Мой ответ на письмо ученика 

Что касается седьмого. Давайте разбираться.

Ваша текущая программа выдала вместе с простыми ещё и числа, которые не являются простыми. Например, 25.

Решето эратосфена. Я покажу как найти простые числа в диапазоне от 1 до 15 и думаю вам станет всё понятно.

Первый этап.
Выписываем все числа от 1 до 15.

1 2 3 4 5 6 7 8 9 10 11 12

однёрку откидываем сразу, такое правило.

2 3 4 5 6 7 8 9 10 11 12

теперь зачеркиваем все числа, через 2 после двойки

2 3 4 5 6 7 8 9 10 11 12

теперь зачеркиваем все числа, через 3 после тройки

2 3 4 5 6 7 8 9 10 11 12

теперь зачеркиваем все числа, через 4 после четверки

2 3 4 5 6 7 8 9 10 11 12

и так далее до конца

теперь все числа, которые остались незачеркнутыми и являются простыми

2 3 5 7 11

видите всё очень просто

достаточно объявить массив на нужное количество чисел

и затем бегать по нему и зачеркивать числа.

**************************************************************

Мой ответ на письмо ученика 

Это так работает группировка разрядов при переводе числа в строку.

Чтобы её отключить возпользуйтесь функцией Формат:
Сообщить(Формат(1045, "ЧГ=0")); // выведет 1045 вместо 1 045

Более подробно об этой функции читайте здесь.

По упражнению 10. Вы выполнили не совсем то.

В задании говорится, что out.txt должен содержать зашифрованный вариант in.txt.

Причем шифрование - это не просто перевод символов в их числовое представление с прибавлением #.

Это может быть, например, перевод символа в его код, затем какое-то преобразование этого кода, и обратный перевод его в символ и запись уже выходного символа.

То есть, пусть символ был равен А
его код 65, мы берём и прибавляем к 65 + 20 получается 85
преобразуем 85 обратно в символ Символ(85) получается U
так вот U это и есть шифрованный вариант буквы А, его мы и запишем в out.txt.

**************************************************************

Мой ответ на письмо ученика 

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

**************************************************************

Мой ответ на письмо ученика 

С диалогами не всё так просто. Тут уже требуется понимание где и какую часть из них располагать. Нужно понимание управляемых форм. Это всё касается немодальных версий диалогов, первый пример именно такой.

А в нашей учебной версии - можно использовать модальные версии (хотя в типовых от них сейчас полностью отказываются).

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

Вопрос - функция, которая принимает параметры и возвращает результат.

Первый параметр - строка.
Второй - означает набор кнопок, который будет доступен на диалоге. Это встроенный тип, который может принимать определенные значения.
Третий - таймаут в секундах.

Вообще откуда всё это берётся. Пишите в модуле Вопрос( и затем на слове вопрос нажимаете мышкой и нажимаете Ctrl + f1. Откроется синтакс-помощник - там описание всех параметров и встроенных типов, которые используются для этих параметров.

**************************************************************

Мой ответ на письмо ученика 

Стек - это такая штука, которую проще всего представить себе как стопку тарелок. Мы можем класть тарелки только наверх и снимать их тоже можем только сверху.
В этом его особенность.

Попробуйте реализовывать описанный в упражнении алгоритм. Без раздумий. Основываясь на предположении о стеке, которое я описал.

Поломайте голову :) Даже если не получится, это будет полезно для вашей алгоритмической подготовки как программиста. Чтобы потом щелкать 1с овские задачи как семечки. Поэтому не сдавайтесь так быстро. Думайте о стопке тарелок. Только вместо тарелок у нас скобки. :)

**************************************************************

Мой ответ на письмо ученика 

Советую перебирать контейнеры так:
Для Каждого Элемент Из Контейнер Цикл
КонецЦикла;

Ну или хотя бы так (в случае с массивами):
Для Индекс = 0 По Массив.Количество() - 1 Цикл
КонецЦикла;

"Возврат(Масс);"

Это видимо привычка? В 1С так не пишут. Стилистически смотрится странно.
Лучше просто Возврат Масс.

Сокращение Масс - плохое.
Лучше уже Массив, хотя это тоже плохо. Или Контейнер. Но Масс - плохое имя для переменной.

По 21 упражнению.
Функция должна принимать массив, внутри себя создавать копию изменять её и возвращать.
У вас сейчас зачем-то второй массив создаётся снаружи и затем передаётся вторым параметром. Исправьте.

По объектам.

Объекты могут создаваться на стэке или в куче. Все динамические объекты создаются в куче (такая глобальная область динамической памяти). А стэк - временная область, которая создается перед вызовом процедуры и освобождается после.

Так вот - массив это динамический объект в 1С и создается он всегда в куче, независимо в каком месте мы его создаём - внутри процедуры или снаружи. И нам не нужно думать об освобождении его памяти после использования (как, например, в с++). Платформа сама ведёт подсчет ссылок на этот объект и когда его больше никто не использует сама освободит его память.

Поэтому совершенно нормально в 1С создавать массив внутри функции и возвращать наружу.