На Горох
Информатика, 10 класс

§ 59. Процедуры

"Информатика (базовый и углублённый уровни) (в 2 частях)", Поляков К.Ю., Еремин Е.А.

Объяснение темы В оглавлении: § 59. Процедуры

Кратко о теме

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

Объяснение темы

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

Определения и обозначения

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

Заголовок процедуры — часть объявления с ключевым словом procedure, именем процедуры и, при необходимости, списком параметров. В заголовке программист задаёт имя, по которому будет обращаться к процедуре, и сообщает, какие данные она может принимать. Например, заголовок procedure Sum(a, b: integer) указывает, что процедура Sum работает с двумя целыми параметрами. По заголовку можно понять, как вызывать процедуру.

Формальный параметр — имя в объявлении процедуры, через которое она получает данные или передаёт результат. Внутри процедуры с ним работают как с переменной, не зная заранее, какое конкретное значение придёт при вызове. Такой способ позволяет использовать одно описание для разных исходных данных. В заголовке a и b в примере выше — формальные параметры.

Фактический параметр — конкретное значение или переменная, указанные при вызове процедуры вместо формального параметра. Например, в вызове Sum(3, 5) числа 3 и 5 выступают фактическими параметрами. Они связываются с формальными параметрами a и b в том же порядке. Поэтому процедура получает нужные данные именно при запуске.

Как это устроено

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

Общая структура процедуры в Pascal начинается с заголовка вида procedure Имя(параметры);. После него могут идти объявления локальных переменных, констант или других объектов, если они нужны; затем записывают блок команд между begin и end. Точка с запятой после заголовка отделяет его от объявлений, а команды внутри блока задают действия процедуры. Если дополнительных объявлений нет, после заголовка сразу начинается begin.

Обычно процедуру объявляют в программе до того места, где её вызывают, чтобы компилятор уже знал её имя и устройство. Само объявление не выполняет команды: оно только описывает, что делать при обращении к процедуре. Во время вызова управление переходит к первой команде её блока и выполняет команды по порядку. Когда процедура заканчивается, управление возвращается к команде, следующей за вызовом.

При вызове фактические параметры связываются с формальными в порядке перечисления: первый — с первым, второй — со вторым и так далее. Поэтому число параметров должно совпадать, а их порядок нельзя менять без учёта смысла и типов. Тип фактического параметра должен подходить к типу, указанному в объявлении, например целое число — к параметру типа integer. Соблюдение этих правил позволяет процедуре получить данные, которые ожидает её описание.

Параметр без var передаётся по значению: процедура получает копию исходного значения и может менять эту копию, не меняя переменную вызывающей программы. Если требуется изменить именно исходную переменную, параметр объявляют с var — это передача по ссылке. Тогда процедура работает с переданной переменной, и изменение внутри процедуры сохраняется после возврата. Для такого параметра при вызове нужна переменная, поскольку выражению вроде 2 + 3 нечего изменять.

Передача параметров в процедуру

СвойствоПараметр по значениюПараметр с var
Как объявляется в заголовкеИмя и тип, без varПеред именем указывают var
Что получает процедураКопию значенияСвязь с исходной переменной
Может ли процедура изменить исходную переменнуюНетДа
Что указывают при вызовеЗначение, переменную или подходящее выражениеПеременную подходящего типа

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

Разбор задач

Сообщение без параметров

Условие: напишите процедуру без параметров, которая выводит сообщение, и вызовите её из основной программы. Здесь процедура выполняет одно фиксированное действие, поэтому ей не нужны входные данные. Имя процедуры должно показывать, что она делает.

  1. Объявим процедуру с именем ShowMessage и без круглых скобок с параметрами. Внутри блока команд выведем строку с помощью writeln. Точка с запятой завершает команду вывода.
  2. После объявления в основной программе запишем ShowMessage;. Это именно вызов: по имени программа найдёт описание и выполнит его команды. Объявление само по себе сообщение не выводит.

Ответ: объявление можно записать так: procedure ShowMessage; begin writeln('Привет!'); end;. В основной программе вызовите ShowMessage;. При выполнении программы сообщение появится в месте вызова.

Сумма двух чисел

Условие: напишите процедуру, которая получает два числа и выводит их сумму; вызовите её для нескольких пар. Для разных пар не нужно переписывать сложение: достаточно передавать новые фактические параметры. Порядок значений при вызове должен соответствовать параметрам a и b.

  1. Объявим два формальных параметра целого типа: procedure PrintSum(a, b: integer);. В теле выведем a + b командой writeln. Параметры без var передаются по значению, потому что процедура только читает их.
  2. В основной программе вызовем PrintSum(4, 7);, а затем PrintSum(10, 2);. При первом вызове a получает 4, b — 7; при втором значения связываются заново. Параметры в вызовах идут в том же порядке, что и в заголовке.

Ответ: тело процедуры содержит writeln(a + b);. Для указанных вызовов программа выведет 11 и 12. Проверка показывает, что один код подходит для нескольких пар чисел.

Обмен значениями

Условие: напишите процедуру, меняющую местами значения двух целочисленных переменных. Здесь недостаточно изменить копии, поскольку результат должен сохраниться в переменных вызывающей программы. Поэтому оба параметра объявим с var.

  1. Создадим временную переменную t и сохраним в ней значение a. Без временного места одно из исходных значений было бы потеряно при перезаписи. Это объявление располагают перед begin процедуры.
  2. Запишем a := b;, затем b := t;. Так значение b переходит в a, а сохранённое старое значение a — в b. Вызов Swap(x, y) передаст именно переменные.

Ответ: заголовок — procedure Swap(var a, b: integer);, а в теле нужны команды t := a;, a := b;, b := t;. После вызова Swap(x, y) значения x и y поменяются местами. Выражение, например Swap(x + 1, y), передать нельзя: параметрам var нужны переменные.

Типичные ошибки

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

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

Забывать var или передавать выражение вместо переменной. Если результат должен изменить исходную переменную, параметр требуется объявить с var. Без этого процедура работает с копией; кроме того, для var нельзя указать выражение, которое не является изменяемой переменной. Сверьте заголовок и вызов: у параметра с var должен быть соответствующий аргумент-переменная подходящего типа.

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

Связь с другими темами

Для работы с процедурами нужны знакомые понятия: переменные, типы данных, блоки begin и end и правила записи программы на Pascal. Процедура помогает разделять алгоритм на подзадачи: каждая часть получает понятное имя и отвечает за своё действие. Повторное использование кода особенно полезно в крупных программах, где одинаковые операции встречаются многократно. Понимание процедур станет основой для изучения функций, рекурсии и построения программ из отдельных частей.

Что запомнить

  • Процедура выполняет команды и вызывается по имени.
  • Объявление процедуры не запускает её.
  • Фактические параметры указывают при вызове, формальные — в заголовке.
  • Параметры должны совпадать по количеству, порядку и типам.
  • Параметр по значению получает копию данных.
  • Параметр с var позволяет процедуре изменить переданную переменную.

Частые вопросы по теме

Чем процедура отличается от обычного набора команд в программе?

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

Можно ли вызвать процедуру несколько раз?

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

Зачем процедуре нужны параметры?

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

Чем формальный параметр отличается от фактического?

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

Когда в заголовке процедуры нужно указывать var?

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

Спросить по теме параграфа

§ 59. Процедуры

Эта же тема в других учебниках

Учебник

Оглавление →
Предмет
Информатика
Класс
10 класс
Учебник
"Информатика (базовый и углублённый уровни) (в 2 частях)", Поляков К.Ю., Еремин Е.А.