Для чего нужны в программе процедуры

Когда мы в 7 классе работали с исполнителем Робот, мы уже использовали вспомогательные алгоритмы (подпрограммы, процедуры). Каждая процедура решала одну подзадачу, из них строилась программа для решения основной задачи.

Подпрограммы полезны в первую очередь потому, что готовые алгоритмы можно использовать много раз при решении более сложных задач, не «изобретая велосипед». Из подпрограмм составляются библиотеки, некоторые из них входят в состав языков программирования. Мы просто используем их, не задумываясь о том, как они работают. Это экономит время программистов, освобождая их от повторного выполнения работы, которая уже была кем-то сделана раньше.

Подпрограммы бывают двух типов — процедуры и функции. Подпрограммы — процедуры выполняют какие-то действия. Например, writeln в языке Паскаль — это стандартная подпрограмма — процедура, которая выводит данные на экран. Подпрограммы — функции возвращают результат (число, строку). Подпрограмма sqrt, вычисляющая квадратный корень числа, — это функция.

Python #14 Процедуры

В этом параграфе мы научимся писать свои подпрограммы — процедуры, а в следующем займёмся функциями.

Определите тип подпрограммы (процедура или функция), которая:

а) рисует окружность на экране;
б) определяет площадь круга;
в) вычисляет значение синуса угла;
г) изменяет режим работы программы;
д) возводит число х в степень у;
е) включает двигатель автомобиля;
ж) проверяет оставшееся количество бензина в баке;
з) измеряет высоту полёта самолёта.

Простая процедура

Предположим, что в нескольких местах программы требуется выводить на экран строку из 10 знаков ‘ -‘ (например, для того чтобы отделить два блока результатов друг от друга). Это можно сделать, например, так:

Конечно, можно вставить этот оператор вывода везде, где нужно вывести такую строку. Но тут есть две сложности. Во-первых, строка из минусов хранится в памяти много раз. Во-вторых, если мы задумаем как-то изменить эту строку (например, заменить знак ‘-‘ на ‘=’), нужно будет искать эти операторы вывода по всей программе.

Для таких случаев в языках программирования предусмотрены процедуры — вспомогательные алгоритмы, которые выполняют некоторые действия:

Процедуры

Многоточием в текстах программ будем обозначать некоторые операторы.

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

В языке Паскаль процедура начинается с ключевого слова procedure, тело процедуры начинается с begin и заканчивается ключевым словом end с точкой с запятой. Процедура расположена выше основной программы, до момента её первого использования.

Фактически мы ввели в язык программирования новую команду printLine, которая была расшифрована прямо в тексте программы. Для того чтобы процедура заработала, в основной программе (или в другой процедуре) необходимо её вызвать по имени.

#6. Процедуры и Функции на PascalABC.net

Что произойдёт, если вызвать процедуру, но не включить её текст в программу? Проверьте этот вариант с помощью компьютера.

Что произойдёт, если включить текст процедуры в программу, но не вызывать её? Проверьте этот вариант с помощью компьютера.

Использование процедур сокращает код, если какие-то операции выполняются несколько раз в разных местах программы. Когда процедура написана и тщательно протестирована, можно передать её другим программистам для использования в этом же или другом проекте.

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

Процедура с параметром

Теперь представьте себе, что нужно выводить строки из знаков «минус» разной длины (5, 10 и др). Конечно, можно сделать несколько процедур, например:

Процедуры

Но так делать не нужно. Дело в том, что обе процедуры выводят цепочки знаков «минус» (т. е. выполняют одни и те же действия!), только разной длины. Поэтому хочется использовать всего одну процедуру, передавая ей нужную длину цепочки.

Заметим, что процедуру printLinelO можно переписать с помощью цикла:

Процедуры

Эта процедура делает то же самое, что и первый вариант, — выводит строку из 10 минусов и переходит на новую строку.

Видим, что процедура стала длиннее и усложнилась, появился цикл. Внутри процедуры объявлена переменная i. Эта переменная принадлежит процедуре, она называется локальной. Другие процедуры и основная программа не могут обращаться к «чужой» локальной переменной.

Читайте также:
Nfs tools что это за программа

Где вы уже встречались со словом «локальный» в курсе информатики? Вспомните, от какого иностранного слова оно произошло.

Локальная переменная — это переменная, объявленная внутри подпрограммы. Другие подпрограммы и основная программа не могут к ней обращаться.

Локальная переменная существует только тогда, когда работает процедура. Как только работа процедуры закончена, все локальные переменные удаляются из памяти.

Чем будет отличаться процедура, рисующая 5 знаков «минус», от последнего варианта процедуры printLine10?

Если мы хотим, чтобы число повторений цикла можно было менять, в процедуре вместо числа нужно использовать переменную. И значение этой переменной нужно как-то передать процедуре. Оформляется это так:

Процедуры

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

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

Наша процедура printLine имеет один параметр, обозначенный именем n, — длину строки из знаков «минус».

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

Аргумент — это значение параметра, которое передаётся процедуре.

При вызове процедуры аргумент передаётся в скобках:

Что будет выведено на экран при выполнении фрагмента программы?

Для тестирования процедуры printLine Иван хочет написать небольшую программу, в которой длина линии вводится с клавиатуры. Где нужно поместить оператор ввода — в процедуре или в основной программе?

Несколько параметров

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

Процедуры

В алгоритмическом языке параметры в заголовке процедуры отделяются запятой, а в Паскале — точкой с запятой.

Запишите в тетради полный текст процедуры printLine.

Что будет выведено на экран при выполнении фрагмента программы?

Процедуры в других языках программирования
Рекурсия

Процедура printLine с одним параметром на языках Python и С может быть записана так:

Процедуры

В языке Python объявление процедуры начинается ключевым словом def. Тип параметра указывать не нужно, он определяется автоматически. Тело процедуры записывается с отступом вправо, так же, как тело цикла и условного оператора. Вывести п одинаковых символов можно без цикла, построив сразу нужную строку с помощью «умножения» символа ‘-‘ на n.

Программа на языке С очень похожа на программу на Паскале. Признак процедуры — слово void в заголовке (вместо procedure на Паскале). Тело процедуры заключено в фигурные скобки. Стандартная функция putchar выводит на экран один символ.

Рекурсия

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

Процедуры

Вспомним алгоритм перевода числа в двоичную систему: нужно делить число на 2, каждый раз выписывая остаток от деления, пока не получится 0. На алгоритмическом языке алгоритм можно записать так:

нц пока <> 0

кц

Проверьте вручную работу этого алгоритма для числа 6. Удалось ли вам получить правильный ответ? Почему?

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

Есть разные способы решения этой задачи, которые сводятся к тому, чтобы запоминать остатки от деления (например, в символьной строке) и затем, когда результат будет полностью получен, вывести его на экран. Однако можно применить ещё один красивый подход. Идея такова: чтобы вывести двоичную запись числа п, нужно сначала вывести двоичную запись числа div(n,2), а затем — его последнюю двоичную цифру, которая вычисляется как mod(n,2).

Что же получилось? Прочитайте ещё раз фразу, выделенную курсивом в предыдущем абзаце. Выходит, что для того, чтобы решить задачу для исходного числа, нужно предварительно решить ту же самую задачу для меньшего числа div(n,2).

Такой алгоритм очень просто программируется:

Процедуры

У нас получилось, что процедура printBin вызывает сама себя! Такой приём в программировании называется рекурсией, а процедура — рекурсивной.

Рекурсивная процедура — это процедура, которая вызывает сама себя.

Читайте также:
Free fire что это за программа

Проверьте с помощью отладчика 1) в пошаговом режиме, что произойдёт при вызове этой процедуры.

1) Для входа в процедуру в пошаговом режиме отладчика используйте клавишу F7.

Приведённая процедура printBin ошибочна, вернее, она не доделана. Представим себе, что мы передали процедуре число 2. Сначала она вызывает сама себя для значения div(2,2) = 1, затем — для значения div(l,2) = 0, и потом ещё бесконечно много раз для нуля. Такие вызовы никогда не закончатся, и программа зациклится. Чтобы этого не произошло, нужно выйти из процедуры (и закончить эти вложенные вызовы), когда значение параметра станет равно нулю:

Процедуры

В алгоритмическом языке для выхода из процедуры используется оператор выход, а в языке Паскаль — оператор exit.

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

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

Выводы

• Процедура — это вспомогательный алгоритм (подпрограмма), решающий самостоятельную задачу, который может использоваться несколько раз.
• Локальная переменная — это переменная, объявленная внутри подпрограммы. Другие подпрограммы и основная программа не могут к ней обращаться.
• Параметр — это величина, от которой зависит работа процедуры. Параметр имеет имя, с ним можно работать так же, как с локальной переменной.
• Аргумент — это значение параметра, которое передаётся процедуре.
• Рекурсивная процедура — это процедура, которая вызывает сама себя.

Нарисуйте в тетради интеллект-карту этого параграфа.

Вопросы и задания

1. Зачем нужны процедуры?
2. Достаточно ли включить процедуру в текст программы, чтобы она «сработала»?
3. Какие возможности появляются, когда в процедуру добавляются параметры?
4. Как определить, что переменная — локальная?
5. Выполните по указанию учителя задания в рабочей тетради.

Подготовьте сообщение

а) «Рекурсия в природе и искусстве»
б) «Ханойские башни»

Источник: murnik.ru

Процедуры

Пока наши программы содержат не более 20-30 команд (операторов) и разобраться в них не составляет труда. В то же время профессиональные программы содержат тысячи и миллионы строк, и если бы они были написаны в виде одной длинной программы, их было бы практически невозможно понимать и редактировать. Даже книги всегда разбивают на главы и разделы.

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

Таким образом, при работе с большими программами мы встречаемся с двумя проблемами:

  1. программы получаются длинные и непонятные;
  2. существуют целые группы команд, которые встречаются несколько раз в разных местах программы.

Выход из этой ситуации достаточно прост – надо разбить программу на несколько более мелких законченных задач (подзадач). Каждую из этих подзадач разбивают еще на более мелкие задачи так, чтобы каждая мелкая подзадача была записана в 20-50 строк программы. Для решения подзадач составляются вспомогательные алгоритмы, которые называются процедурами. Каждая процедура имеет свое имя, если написать в программе имя процедуры, то выполнятся все команды, входящие в процедуру.

Фактически при создании процедуры в список команд исполнителя добавляется новая команда. Чтобы исполнитель понял ее, надо эту команду расшифровать, то есть, объяснить, что делать при получении этой команды. Важно, чтобы в конечном счете все новые команды были расшифрованы через основные команды, входящие в СКИ исполнителя.

Как ввести новую команду (задача z10-3.Maz)?

П ример 1. Рассмотрим задачу для Робота, показанную на рисунке. Попробуем решить ее, добавляя в СКИ исполнителя нужные нам команды. Сначала надо выделить те части задачи, которые одинаковы (или, по крайней мере, похожи). Легко заметить, что в нашей задаче есть три одинаковых площадки, каждая из которых состоит из угловой стенки и трех грядок.

Введем новую команду Угол. Будем считать, что Робот по этой команде обрабатывает одну такую площадку (см. рисунок слева). В конце работы машина Робота разворачивается на восток. Важно, что площадки совершенно одинаковые, поэтому каждую из них можно обрабатывать командой Угол.

Основная программа выглядит так:

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

Читайте также:
Дотационная программа что это

перед вторым вызовом процедуры: перед третьим вызовом процедуры:

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

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

Пример 2. Рассмотрим еще одну задачу. Робот должен посадить цветы в конце каждого тупика (см. рисунок справа). Известно, что тупики есть только слева от Робота, справа – сплошная стена. Количество тупиков и их длины заранее неизвестны.

И дея алгоритма очень проста: Робот двигается вперед до стены, на каждом шаге проверяя, есть ли стена слева. Если ее нет, он обрабатывает тупик.

Теперь остается только записать расшифровку процедуры Тупик:

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

Источник: studfile.net

Для чего нужны в программе процедуры

Войдите как ученик, чтобы получить доступ к материалам школы

Внутренний язык программирования 1С 8.3 для начинающих программистов: функции и процедуры в 1С часть 1

Автор уроков и преподаватель школы: Владимир Милькин

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

Функции и процедуры в языке 1С 8.3

Давайте я подведу вас к необходимости функций, заодно вы поймёте что это такое и почему они столь полезны для программистов.

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

А = 0; ВвестиЧисло(А); Б = 0; ВвестиЧисло(Б); Результат = (А + Б) * (А — Б); ОткрытьЗначение(Результат);

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

Неужели нам снова и снова придётся писать код для её вычисления:

Результат = (А + Б) * (А — Б);

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

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

Пусть этим именем будет ПроизведениеСуммыИРазности.

Получается теперь мы можем написать:

Результат = ПроизведениеСуммыИРазности;

И всё? Нет, конечно! Ведь непонятно произведение суммы и разности каких именно чисел нужно считать. Гораздо лучше будет передать эти числа нашему имени в качестве параметров, как мы обычно делаем при вызове команды:

Результат = ПроизведениеСуммыИРазности(А, Б);

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

Давайте, наконец, определим нашу функцию, чтобы компьютер, встретив её вызов, не растерялся, а выполнил то, что мы хотим:

Функция ПроизведениеСуммыИРазности(А, Б) Результат = (А + Б) * (А — Б); Возврат Результат; КонецФункции

Что включает в себя определение этой функции?

Прежде всего ключевое слово Функция следом за которым идёт имя, которое мы придумали сами.

Затем следуют имена параметров, заключенные в круглые скобки. Параметры — это данные, которые мы передадим в нашу функцию при её вызове. Вы читаете ознакомительную версию урока, полноценные уроки находятся здесь. Она с ними что-то сделает и возвратит результат. Каждый параметр имеет своё имя, которое мы также придумываем сами.

Это имя можно использовать только внутри функции.

Дальше идёт тело. Это команды компьютеру, которые будут выполняться в тот момент, когда мы сделаем вызов нашей функции. Тело заканчивается ключевым словом КонецФункции.

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

Возврат Результат;

Где вместо Результат может быть любое выражение, которое вернётся из функции в качестве её результата.

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru