Тождественность типов

Параметры-переменные

Параметры-значения

Параметры

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

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

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

Синтаксис описания параметров-значений в списке формальных параметров подпрограммы:

Ид_парам1, Ид_парам2,...:тип_параметров;

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

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

Синтаксис описания параметров-переменных в списке формальных параметров подпрограммы:

var Ид_парам11, Ид_парам12,...:тип_параметров;

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

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

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

Две переменных, Т1 и Т2, имеют тождественный тип, если выполняется одно из следующих условий:

Т1 и Т2 описаны совместно;

при описании Т1 и Т2 используется один и тот же идентификатор типа;

Примеры тождественных и нетождественных описаний:

type

Mass = array [1..10] of real;

var

T1, T2: array [1..10] of integer;

M1: array [1..10] of integer;

M2: array [1..10] of integer;

A1:Mass; A2:Mass;

В примере переменные Т1 и Т2 тождественны, т. к. описаны совместно; переменные А1 и А2 тождественны, т. к. используют для описания один и тот же идентификатор Mass; переменные М1 и М2 нетождественны, т. к. конструкция array [1..10] of integer является описанием типа.

В качестве примера рассмотрим следующую задачу: Задано три числа: n, m, k. Необходимо вычислить три значения:

и поменять полученные значения так, чтобы в переменной a оказалось наибольшее из трёх, в b – среднее и в c – наименьшее, т.е. выстроить их в порядке убывания.

Алгоритм основной программы достаточно прост (рис. 25). После ввода исходных значений (блок 2) производятся вычисления значений a, b, c по заданным выражениям (блоки 3, 4, 5). Далее следует алгоритм сортировки массива из трёх значений. Блоки 6, 7, 8 и 9 предназначены для нахождения максимального из трёх значений. Если переменная b содержит максимальное из трёх значений (блок 6), то первая переменная (а) обменивается значением с переменной b (блок 7). Если максимальное значение находиться в переменной c (блок 8), то первая переменная (а) обменивается значением с переменной с (блок 9). Если максимальное значение находиться в переменной а, то блоки 7 и 8 останутся не выполненными.

Рисунок 25 – Блок-схема алгоритма упорядочивания значений трёх элементов по убыванию

Таким образом, перед выполнением блока 10 максимальное из трёх значений будет находиться в переменной а.

Осталось поместить наибольшее из значений в переменных b и c в переменную b (блоки 10, 11).

Алгоритм функции Fkt(f), предназначенной для вычисления факториала заданного значения, по сути, является алгоритмом вычисления произведения целых чисел от 1 до f. Формальный параметр f является параметром-значением, т. е. при вызове функции в переменную f до начала работы подпрограммы будет записано значение фактического параметра – значения, указанного в вызове функции из основной программы.

Процедура Swap(s1, s2) выполняет перестановку значений двух переменных. Формальные параметры s1 и s2 являются параметрами-переменными. При вызове процедуры swap в качестве фактических параметров должны использоваться переменные. Любые изменения в значении переменных s1 и s2 в подпрограмме отражаются на переменных, переданных в качестве фактического параметра при вызове процедуры.

Рассмотрим подробнее, каким образом передаются параметры в вызываемые подпрограммы (табл. 13).

После запуска программы пользователь ввёл три значения: 2, 1, 2, которые были записаны соответственно в переменные n, m, k (строка 1).

Первый вызов функции Fkt (строка 2):

В основной программе (рис. 25, блок 3) при вызове функции передаётся значение переменной n (n = 2). Функция присваивает это значение параметру f. Таким образом, в начале работы алгоритма функции в переменной f находится значение 2.

По окончании работы функция возвращает основной программе значение факториала числа 2 (строка 10). Оператор в блоке 3 на рисунке 24 получает вычисленное значение факториала и записывает его в переменную а.

Второй вызов функции Fkt (строка 11):

Блок 4 (рис. 25) основной программы во второй раз вызывает функцию Fkt, но в этот раз передаёт в неё значение выражения m+2, равное трём. Полученное значение снова присваивается параметру f и снова исполняется алгоритм функции, который на этот раз возвращает значение 6 (факториал числа 3).

Оператор в блоке 4 на рисунке 24 получает это значение, заканчивает вычисление выражения 6*3 и записывает полученное значение 18 в переменную b (строка 21).

Третий и четвёртый вызовы функции Fkt (строки 22-31):

Первой из выражения Fkt(Fkt(k)+1)оператора в блоке 5 (рис. 25) вызывается вложенная функция Fkt(k). Фактический параметр, передаваемый в функцию – k (k = 2). Переменная f получает значение 2 (строка 22).

После окончания работы Функция возвращает 2 (факториал числа 2). Оператор в блоке 5 на рисунке 25 получает это значение, заканчивает вычисление выражения 2 + 1 и снова вызывает функцию Fkt (строка 26). На этот раз осуществляется внешний вызов Fkt(Fkt(k)+1). Результат работы внутреннего вызова равен 2, выражение Fkt(k)+1 даёт значение 3, которое и передаётся в функцию Fkt при её четвёртом вызове из программы (строка 27).

После окончания работы Функция возвращает 6 (факториал числа 3). Оператор в блоке 5 на рисунке 24 получает вычисленное значение факториала, записывает его в переменную с и заканчивает свою работу.

Первый вызов процедуры Swap (строка 33):

Блок 7 (рис. 25) основной программы вызывает процедуру Swap для обмена значениями между переменными a и b. Эти переменные передаются в процедуру в качестве фактических параметров. Внутри процедуры переменные a и b становятся переменными s1 и s2. Любые изменения в значении s1 и s2 отражаются на переменных a и b соответственно (строки 35, 36).

Второй вызов процедуры Swap (строка 39):

Второй раз процедура Swap вызывается из блока 11 (рис. 25). В этот раз передаются в процедуру в качестве фактических параметров переменные b и с. Внутри процедуры переменная b становиться переменной s1, а переменная c – переменной s2. После окончания работы процедуры значения в переменных b и c поменяются местами.

Таблица 13 – Трассировка алгоритма упорядочивания значений трёх элементов по убыванию

№ п/п № блока n m k a b c Подпрограммы
          - - -  
          - - - Fkt(n) -> f:=n
    № блока f P i
          - - -       -
          - - -        
          - - -        
          - - -        
          - - -        
          - - -        
          - - -        
            - - P = 2 -> Fkt(n)= 2
            - - Fkt(m+2) -> f:=m+2
    № блока f P i
            - -       -
            - -        
            - -        
            - -        
            - -        
            - -        

Окончание таблицы 13

№ п/п № блока n m k a b c Подпрограммы
            - -        
            - -        
            - -        
              - P = 6 -> Fkt(m+2)=6
              - Fkt(k) -> f = k
    № блока f P i
              -       -
              - ...
              -        
              - P = 2 -> Fkt(k)= 2
              - Fkt(Fkt(k)+1) -> f:=3
    № блока f P i
              -       -
              - ...
              -        
                P = 6 -> Fkt(Fkt(k)+1)=6
                 
                Swap(a,b) -> s1 ≡ a s2 ≡ b
    № блока s1(a) s2(b) tmp
                       
                       
                       
                 
               
                Swap(b,c) -> s1 ≡ b s2 ≡ c
    № блока s1(b) s2(c) tmp
                       
                       
                       
                 
               
                           

Реализация алгоритма в программу выглядит следующим образом:

program PrFun;

uses crt;

var n,m,k:integer;

a,b,c:real;

function Fkt (f:integer):integer;

var i,P:integer;


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: