|
Цель достигнута, но довольно дорогой ценой. В программе появилась переменная i, внешне никак не связанная с процедурой sigmaS, но по существу введенная только для того, чтобы обслуживать работу этой процедуры. Выражение для общего члена суммы должно зависеть именно от этой переменной, и никак иначе обозначить переменную суммирования нельзя. Не говоря о том, что это очень стеснительно для программистов, которые захотят воспользоваться так описанной процедурой sigmaS, область применения этой процедуры становится довольно ограниченной, как мы вскоре увидим. Наибольшую гибкость в применении процедуры суммирования можно обеспечить, если прибегнуть к оставшейся возможности — сделать переменную i параметром, вызываемым по наименованию. Во время выполнения тела процедуры эта переменная вообще исчезнет из него и заменится соответствующим фактическим параметром. От него и должно зависеть выражение для общего члена суммы — фактический параметр, соответствующий формальному параметру ui. Описание процедуры примет вид Программа решения рассматриваемой задачи может быть такой: При выполнении оператора процедуры sigma (s, i\ 7, /г, //(') создастся такой воображаемый блок: В этом блоке идентификаторы s и i глобальны. Следовательно, они обозначают те же величины, что и в основном блоке. Поэтому переменная s в результате выполнения воображаемого блока получит требуемое значение. Полезно заметить, что глобальная переменная i во время выполнения воображаемого блока будет пробегать последовательность значений 1, я, а после выхода из цикла и из блока получит неопределенное значение. В рассматриваемом примере это не страшно, так как значение этой переменной вне процедуры не используется. В общем случае надо считаться с тем, что любая глобальная величина воображаемого блока может изменить или утратить свое значение в результате обращения к процедуре. Это явление называют побочным эффектом процедур. Составим теперь процедуру решения систем линейных алгебраических уравнений методом Гаусса, взяв за основу программу, полученную в § 11. Мы уже видели, что в описаниях процедур формальными параметрами рекомендуется считать идентификаторы тех величин, которые в самостоятельных программах были бы объектами ввода и вывода. Этот принцип, хотя и не универсальный, в данном случае применим — в список формальных параметров процедуры следует включить идентификатор массива а — расширенной матрицы системы и идентификаторы переменных п и га, определяющих размер этой матрицы и границы изменения параметров ряда циклов в теле процедуры. По уже известным мотивам параметры тип следует вызывать значением. Параметр а должен вызываться по наименованию, так как часть элементов этого массива представляет результат работы процедуры — решение системы, которое должно быть доступно после выхода из процедуры.
|