КАТЕГОРИИ: Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748) |
Параметры-переменные
Параметры-значения. Процедуры с параметрами в языке Pascal. Типы параметров.
При описании процедуры (функции) в ее заголовке могут быть указаны параметры следующих видов: · параметры-значения; · параметры-переменные; · параметры-константы; · параметры-процедуры; · параметры-функции.
При записи параметров необходимо помнить: число формальных и фактических параметров должно быть одинаково; порядок следования и тип фактических параметров должен совпадать с порядком и типом соответствующих формальных параметров; идентификаторы формальных и фактических параметров могут совпадать; формальные параметры в языке Турбо Паскаль в заголовке находятся вместе с описаниями и объявлять их в разделе описаний процедуры(функции) не требуется; формальные параметры должны иметь простые или ранее определенные типы.
При передаче в подпрограмму массива его тип объявляют предва-рительно в разделе описания типов TYPE. Например. TYPE TV=ARRAY [1..30] OF INTEGER; TM=ARRAY [1..20,1..20] OF REAL; ... PROCEDURE TOP (A:TM; VAR B: TV; N: INTEGER); ... Здесь описаны два типа массивов. TV - для одномерного массива и TM для двумерного массива. Затем в списке формальных параметров для переменных А и В используются эти ранее определенные типы при описании соответственно матрицы и вектора.
Список параметров, задаваемых в заголовке процедуры или функции обеспечивает связь подпрограммы с вызывающей программой. Через него в подпрограмму передаются исходные данные и возвращается результат (в процедуре). В языке Турбо Паскаль предусмотрены два принципиально отличающихся механизма передачи параметров: по значению и по ссылке. При передаче параметров по значению в стеке, в котором осуществляется выделение памяти под внутренние (локальные) переменные подпрограммы, выделяется дополнительная память, в которую копируются значения соответствующих фактических параметров. В вызывающей программе в качестве аргумента подпрограммы для параметра-значения может использоваться не только переменная, но и выражение. После завершения работы подпрограммы выделенная этим параметрам память становится недоступной, поэтому передача параметров по значению не может использоваться в подпрограммах для получения результатов.
При вызове по ссылке в подпрограмме память под передаваемые переменные не отводится. В подпрограмму передается не значение переменной, а ссылка на место в памяти соответствующего фактического параметра. Подпрограмма, выполняющая некоторые действия с этой переменной, в действительности производит действия с соответствующим фактическим параметром, поэтому после выполнения процедуры, изменения, выполненные над этой переменной, сохраняются. Перед записью параметров-переменных в списке формальных параметров указывается ключевое слово VAR (действует до "; "). Для вычисляемых результатов могут быть использованы только параметры-переменные. Формальным параметрам-переменным не могут соответствовать в качестве фактических значений константы или выражения,так как они не имеют адреса для передачи.
В качестве параметров-переменных могут быть использованы массивы и строки открытого типа, у которых не задаются размеры. Открытый массив представляет собой формальный параметр подпрограммы, описывающий базовый тип элементов, но не определяющий его размерность и границы. Индексация элементов в этом случае начинается с нуля. Верхняя граница открытого массива возвращается функцией HIGH. Такое описание возможно только для одномерных массивов. Для открытого массива в стеке создается его копия, что может вызвать переполнение стека.
Рассмотрим пример использования открытого массива. Пусть требуется подсчитать сумму элементов одномерного массива.
FUNCTION SUM (VAR A: ARRAY OF INTEGER):INTEGER; VAR S,I: INTEGER; BEGIN S:=0; FOR I:=0 TO HIGH(A) DO S:=S+A[I]; SUM:=S; END;
В основной программе такой массив может быть описан даже как Var A: array [ -2.. 3] of integer; Фактические границы массива здесь значения не имеют. Важно только то, что количество элементов массива в данном случае равно 6.
Открытая строка может задаваться с помощью стандартного типа OPENSTRING и стандартного типа STRING с использованием дирек-тивы компилятора {$P+}. Например, PROCEDURE ZAP (VAR ST: OPENSTRING; R: INTEGER); или {$P+} PROCEDURE ZAP (VAR ST: STRING; R: INTEGER); В языке Турбо Паскаль можно устанавливать режим компиляции, при котором отключается контроль за совпадением длины формального и фактического параметра строки {$V- }. При передаче строки меньшего размера формальный параметр будет иметь ту же длину, что и параметр обращения; при передаче строки большего размера происходит усечение до максимального размера формального параметра. Контроль включает-ся только при передаче параметров-переменных, для параметров - значений длина не контролируется.
Рассмотрим пример, в котором используются процедура и функция. Требуется написать процедуру, в которой для матрицы, содержащей M столбцов и N строк, необходимо составить вектор номеров столбцов, все элементы которых упорядочены по возрастанию или убы-ванию и являются простыми числами. В главной программе вводятся все входные данные, производится обращение к процедуре и осуществляетcя вывод полученных результатов.USES CRT; TYPE TMAS=ARRAY[1..100,1..100] OF WORD; TVECT=ARRAY[1..100] OF WORD;
VAR A:TMAS; V:TVECT; N,M,K:BYTE; I,J:BYTE; PROCEDURE FORM(VAR X:TMAS;) {матрица} N,M:BYTE; {количество строк и столбцов} VAR R:TVECT; {результат - вектор} VAR K:BYTE); {длина полученного вектора} VAR I,J,Z,S:BYTE; F:BOOLEAN; UNCTION PROS(B:WORD):BOOLEAN; {функция проверки простого числа} VAR I:WORD; BEGIN IF B<>1 THEN PROS:=TRUE ELSE PROS:=FALSE; FOR I:=2 TO B DIV 2 DO IF B MOD I = 0 THEN PROS:=FALSE; END; BEGIN K:=0; FOR J:=1 TO M DO BEGIN Z:=0; S:=0; F:=TRUE; FOR I:=1 TO N-1 DO BEGIN IF X[I,J]>X[I+1,J] THEN Z:=Z+1; IF X[I,J]< X[I+1,J] THEN S:=S+1 END; IF (Z = N-1) OR (S = N-1) THEN BEGIN FOR I:=1 TO N DO IF NOT(PROS(X[I,J])) THEN F:=FALSE; IF F THEN BEGIN K:=K+1; R[K]:=J END; END; END; END; BEGIN WRITELN('Введите N и M:');
READLN(N,M); WRITELN('Введите матрицу:'); FOR I:=1 TO N DO FOR J:=1 TO M DO READLN(A[I,J]); FORM(A,N,M,V,K); WRITELN('Результат:'); FOR I:=1 TO K DO WRITE(V[I],' '); READKEY END.
В этом примере в процедуру передаются входные данные: двумерный массив и его размерность. Массив передается как параметр-переменная, чтобы в процедуре не выделялась память для его копии. Результаты: вектор и его размерность обязательно передаются как параметры-переменные. Функция проверки простого числа является внутренней для процедуры и недоступна из главной программы.
Дата добавления: 2015-07-13; Просмотров: 597; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |