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

§ 5. Передача параметров в подпрограммы

"Информатика (в 2-х частях)", Горячев А.В., Герасимова В.Г., Макарина Л.А., Островский С.Л., Паволоцкий А.В., Семёнов А.А., Юдина А.Г., Чернышёва Т.Л.

Объяснение темы В оглавлении: § 5. Передача параметров в подпрограммы

Кратко о теме

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

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

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

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

Формальный параметр — имя и тип данных, указанные в заголовке подпрограммы; при каждом вызове он получает соответствующие данные. Например, в заголовке процедуры может быть записано имя x и тип integer. Формальный параметр нужен, чтобы подпрограмма могла обращаться к переданным данным по понятному имени.

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

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

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

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

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

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

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

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

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

Сравнение способов передачи параметров

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

Сначала определите, должна ли подпрограмма менять переданные данные. Если достаточно получить их для вычисления, обычно подходит параметр-значение; если нужно изменить исходную переменную, нужен var. По строке о допустимых фактических параметрах проверьте, можно ли передать выбранное значение или выражение.

Разбор задач

Вывод сообщения несколько раз

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

  1. В заголовке задаём два формальных параметра: строковый для имени и целочисленный для количества повторений.
  2. В теле процедуры организуем повторение заданное число раз и выводим сообщение с именем.
  3. При вызове передаём имя и число в том же порядке, что параметры в заголовке.

Решение: procedure SayHello(name: string; count: integer); begin while count > 0 do begin writeln('Привет, ', name); count := count - 1 end end;. Вызов SayHello('Аня', 3) передаёт строку первому параметру, а число — второму. Переменные вызывающей программы процедура не меняет, потому что оба параметра передаются по значению.

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

Функция для поиска большего числа

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

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

Решение: function Max(a, b: integer): integer; begin if a > b then Max := a else Max := b end;. Проверим Max(4, 9): параметру a соответствует 4, b — 9, поэтому результат равен 9. Для Max(12, 5) результат равен 12, а для Max(7, 7) функция возвращает 7.

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

Обмен значениями двух переменных

Условие: составить процедуру, которая меняет местами значения двух переменных, и вызвать её для a и b. Если передать числа обычными параметрами, процедура поменяет местами только копии, а значения a и b останутся прежними. Поэтому оба параметра должны быть переменными.

  1. Записываем в заголовке два целочисленных параметра со словом var.
  2. Сохраняем первое значение во временной переменной, чтобы не потерять его при присваивании.
  3. Переносим значение второго параметра в первый, а сохранённое значение — во второй; вызываем процедуру с a и b.

Решение: procedure Swap(var x, y: integer); var temp: integer; begin temp := x; x := y; y := temp end;. Если до вызова a = 3 и b = 8, то после Swap(a, b) получаем a = 8 и b = 3. Слово var обеспечивает изменение исходных переменных, а temp временно хранит одно из значений.

Ответ: процедура меняет значения a и b местами. Для параметров-переменных при вызове нужны переменные, иначе процедуре было бы нечего изменять в вызывающей программе.

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

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

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

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

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

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

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

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

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

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

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

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

Почему изменение параметра-значения не меняет исходную переменную?

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

Когда нужно использовать параметр-переменную?

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

Можно ли передавать в качестве фактического параметра выражение?

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

Что произойдёт, если перепутать порядок параметров при вызове?

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

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

§ 5. Передача параметров в подпрограммы

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

Учебник

Оглавление →
Предмет
Информатика
Класс
8 класс
Учебник
"Информатика (в 2-х частях)", Горячев А.В., Герасимова В.Г., Макарина Л.А., Островский С.Л., Паволоцкий А.В., Семёнов А.А., Юдина А.Г., Чернышёва Т.Л.