"Информатика (в 2-х частях)", Горячев А.В., Герасимова В.Г., Макарина Л.А., Островский С.Л., Паволоцкий А.В., Семёнов А.А., Юдина А.Г., Чернышёва Т.Л.
Параметры позволяют подпрограмме получать данные и выполнять одну и ту же задачу с разными значениями. В заголовке записывают формальные параметры, а при вызове указывают фактические. Обычный параметр передаётся по значению: подпрограмма получает копию и не меняет исходную переменную. Если нужно изменить переменную вызывающей программы, используют параметр-переменную, обозначаемый словом var. Порядок, количество и типы параметров при вызове должны совпадать с заголовком.
Текст подготовлен нейронной сетью по теме параграфа и не заменяет учебник — важные факты и формулировки сверяйте с ним.
Формальный параметр — имя и тип данных, указанные в заголовке подпрограммы; при каждом вызове он получает соответствующие данные. Например, в заголовке процедуры может быть записано имя x и тип integer. Формальный параметр нужен, чтобы подпрограмма могла обращаться к переданным данным по понятному имени.
Фактический параметр — конкретное значение, переменная или выражение, передаваемые подпрограмме при вызове. Если процедура ждёт параметр x, в вызове можно указать, например, переменную a или число 5. Фактический параметр нужен, чтобы сообщить подпрограмме, с какими именно данными работать в этот раз.
Параметр-значение — способ передачи, при котором подпрограмма получает копию значения. Если подпрограмма присвоит этому параметру новое значение, исходная переменная останется прежней. Такой способ удобен, когда данные нужно использовать или временно менять только внутри подпрограммы.
Параметр-переменная — способ передачи, при котором подпрограмма работает с исходной переменной. Присваивание этому параметру меняет значение переменной в вызывающей программе. Он нужен, когда результат работы подпрограммы следует сохранить в переданных переменных.
Параметры делают подпрограмму универсальной: без них в её командах пришлось бы заранее закрепить конкретные данные. Благодаря параметрам один алгоритм можно запускать с разными числами, именами или другими значениями. Например, процедура печати сообщения может получать текст и число повторений, поэтому её не нужно переписывать для каждого нового сообщения. Подпрограмма остаётся той же, меняются только данные, переданные при вызове.
При вызове фактические параметры сопоставляются с формальными в том порядке, в котором они записаны. Поэтому первый переданный аргумент поступает первому формальному параметру, второй — второму и так далее. Количество и типы тоже должны соответствовать: иначе значение может оказаться не у того параметра или программа не сможет корректно обработать вызов. Перед запуском полезно сравнить список аргументов вызова с заголовком слева направо.
При передаче по значению подпрограмма получает копию данных, а не саму переменную вызывающей программы. Это отделяет временные вычисления внутри подпрограммы от данных, которыми пользуется остальная программа. Поэтому присваивание новому значению формального параметра не меняет исходную переменную. Такой способ подходит, например, если функция только вычисляет результат на основе двух чисел.
При передаче параметра-переменной подпрограмма получает доступ к исходной переменной. Изменение формального параметра в таком случае отражается на переменной, указанной при вызове. Это полезно, когда нужно вернуть результат через параметр или изменить сразу несколько значений, как при обмене двух чисел. Следует выбирать такой способ осознанно, потому что вызов может изменить данные программы.
Способ передачи показывают в заголовке подпрограммы. Обычный параметр передаётся по значению, а перед именем параметра-переменной ставят специальное слово var. По этой записи можно понять, изменится ли переменная при вызове, ещё до чтения команд подпрограммы. При вызове для var указывают переменную, которую разрешено изменить, а не просто вычисляемое выражение.
| Свойство | Параметр-значение | Параметр-переменная |
|---|---|---|
| Что получает подпрограмма | Копию переданного значения | Доступ к исходной переменной |
| Можно ли изменять исходную переменную | Нет, меняется только копия | Да, изменение параметра меняет переменную |
| Что происходит с формальным параметром после завершения подпрограммы | Копия перестаёт использоваться, исходное значение сохраняется | Изменения исходной переменной сохраняются |
| Какие фактические параметры допустимы | Значение, переменная или выражение подходящего типа | Переменная подходящего типа |
| Обозначение в заголовке подпрограммы | Без специального слова перед параметром | Слово var перед параметром |
| Основное назначение | Передать данные для вычисления без изменения исходной переменной | Изменить исходную переменную или передать результат через неё |
Сначала определите, должна ли подпрограмма менять переданные данные. Если достаточно получить их для вычисления, обычно подходит параметр-значение; если нужно изменить исходную переменную, нужен var. По строке о допустимых фактических параметрах проверьте, можно ли передать выбранное значение или выражение.
Условие: составить процедуру, которая получает имя пользователя и количество повторений сообщения. При вызове передать разные фактические значения, не изменяя исходные данные. Поскольку процедура только использует имя и число, менять их в программе не требуется. Значит, достаточно параметров-значений.
Решение: procedure SayHello(name: string; count: integer); begin while count > 0 do begin writeln('Привет, ', name); count := count - 1 end end;. Вызов SayHello('Аня', 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 останутся прежними. Поэтому оба параметра должны быть переменными.
Решение: 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.
Можно ли передавать в качестве фактического параметра выражение?
Да, выражение можно передать для параметра-значения, если результат выражения подходит по типу. Для параметра-переменной нужна переменная, поскольку подпрограмме предстоит изменять исходное значение.
Что произойдёт, если перепутать порядок параметров при вызове?
Значения будут сопоставлены формальным параметрам не так, как задумано. Если типы не совпадают, программа может сообщить об ошибке; если совпадают, выполнение может дать неверный результат.
§ 5. Передача параметров в подпрограммы