Информационный сайт

 

Реклама
bulletinsite.net -> Книги на сайте -> Программисту -> Непейвода Н.Н. -> "Основания программирования " -> 155

Основания программирования - Непейвода Н.Н.

Непейвода Н.Н., Скопин И.Н. Основания программирования — Институт компьютерных исследований , 2002. — 919 c.
Скачать (прямая ссылка): osnovanprogramm2002.pdf
Предыдущая << 1 .. 149 150 151 152 153 154 < 155 > 156 157 158 159 160 161 .. 316 >> Следующая

8.5.5. Параметры-процедуры и параметры-функции. Процедурный тип
о сих пор обсу далась параметризация, которая обеспечивает задание вариантов вычислений посредством предоставления подпрограмме различ-нх значений параметров (входне параметры), за счет поставки подпрограммой значений для внених переменных (выходные параметр ), а так е при совмещении этих двух способов (см. § 8.5.3). Многие языки программирования допускает ее один вид параметризации, который связвается с передачей процедуре в качестве фактического параметра (другой) процедуры или функции с тем, чтобы взвать обозначенный параметром алгоритм в ну ные моменты вчислений, обеспечивая тем самм вариантность вычисления подпрограммы. В этом принципиальное отличие параметра-функции оть вызова функции в позиции фактического параметра-значения, где функция вычисляется до перехода к выполнению операторов тела подпрограммы.
Можно считать, что алгоритм, представленный своим именем, есть значение одного из процедурных типов, и тогда естественно говорить о входном параметре-процедуре или да е о выходном алгоритме, который поро дается
438
8.
в результате вполнения процедуры, имеей соответствуий выходной параметр. Последнее — это пока что программистская экзотика, поскольку процедурные типы являются типами более высокого порядка по сравнению с типами обычных значений, а с ними связано очень много проблем, в том числе и теоретических. овмеенне параметры ее экзотичнее, хотя ситуации, когда они были бы полезными, легко себе представить. Скажем, процедура получает в качестве параметра некоторый алгоритм и в результате своей работы порождает другой алгоритм, который заменяет исходный вариант, например, на основании знания о конкретных условиях его работы. Таким образом, если считать нормальным оперирование с типами высокого порядка,19 то процедурные параметры являются частным случаем ранее рассмотренных назначений параметризации.
Когда нужно обеспечить возможность вызова алгоритмов-параметров по ходу вчислений, мо но бло бы воспользоваться механизмом подстановки по имени. Это бли е всего к тому, что требуется. о это сликом сильное средство, т. к. для использования процедурного параметра не требу тся никакие окружающие его вычисления (вроде тех, что задаются реализацией вызова по имени) и, соответственно, зависимость такого параметра от внешнего контекста минимальна. В реализационном плане самым приемлемым вариантом процедур как входных параметров является передача ссылки на фактический параметр-алгоритм, т. е. адреса передаваемой процедуры. о-этому не случайно, что именно так задается процедурная параметризация в языке С/С++, что не требует дополнительных механизмов, поскольку адрес есть значение указательного типа, которм обладает соответствуий фор-мальнй параметр. роцедур е как выходные параметры пока что не под-дераны по сути современными системами программирования, и в лучем случае значением такого выходного параметра будет одна из фиксированного конечного множества заранее описанных в программе процедур. Поэтому и здесь решение С/С++ достаточно на современном этапе.20
19 Как в принципе и должно было бы быть, поскольку ввиду парадокса изобретателя умение работать с сущностями высших порядков является единственным путем к снижению объема программных систем для действительно сложных задач и, соответственно, единственным путем к кардинальному повышению их надежности. Но на этом пути стоят, помимо чисто технических, методологические и педагогические трудности: слишком мало людей оказываются подготовленными к восприятию сущностей высших порядков. . .
20 Если же процедуры станут полноправными значениями, то решение языка C/C++ сразу станет неудовлетворительным даже для входных параметров, поскольку ими тогда могли бы быть процедурные выражения, составленные при помощи композиции и частичной параме-
8.5. ПАРАМЕТРИЗАЦИЯ
439
Если заботиться о надежности, то приходится требовать от системы программирования сопутствующих действий, способствующих корректности использования ссылок на процедуры. В первую очередь здесь речь идет об обеспечении правильного вызова процедуры, передаваемой в качестве параметра: долно бть собл дено соответствие типов формальных и фактических параметров этого вызова, а так е типа вырабатываемого результата требованиям позиции вызова, если параметр-процедура является функцией.
Перед изучением существующих суррогатов средств задания и использования в подпрограммах параметров-процедур и параметров-функций уместно рассмотреть пример, демонстрируий полезность использования нового вида параметризации подпрограмм. бсу дение этого примера пока ет способ введения в языках данного средства.
Пусть требуется вычислить следующее выражение:
sin(1) + sin(2) + • • • + sin(N)
f (N) =--,---
1-і- — -і- і і
1 + 2 + ' ' ' + N
Видно, что как в числителе, так и в знаменателе дроби используется суммирование, отличающиеся только видом общего члена. Если описана функция double cm( double i) {
return
}
то аналогия меду выра ениями числителя и знаменателя подчеркивается еще нагляднее:
Предыдущая << 1 .. 149 150 151 152 153 154 < 155 > 156 157 158 159 160 161 .. 316 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100