Нетипизированные параметры-переменные




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

Нетипизированные параметры обычно используются в случае, когда тип данных несущественен. Такие ситуации чаще всего возникают разного рода копированиях одной области памяти в другую. Нетипизированные параметры очень удобно использовать для передачи подпрограмме одномерных массивов переменной длины.

Параметры- сложные типы данных

Рассмотрены прежде категории параметров не исчерпывают всех вопросов передачи информации в Pascal-e. Использование в качестве параметров сложных типов данных имеет свои особенности.

Рассмотрим массивы и строки открытого типа. Открытый массив (строка) – массив (строка) без указания типа индекса (размера массива(строки)).

Пример:

Procedure getfive(var massiv: array of real);

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

Программа вычисления x=(m!+n!)/(m+n)!, где m, n целые (неотрицательные)

program factorial_(input,output); {название программы}

label 0; {описываем метку}

var

rez:real;

m,n:longint; {описали глобальные переменные, используемые в программе}

function fact(z: longint): real; {заголовок функции с формальным параметром-значением, типом}

var

y: real; {описали локальную переменную}

begin

y:=1; {для получения результата необходимо присвоить у значение 1. также при помощи этого реализуется вычисление 0! и 1!}

while z>1 do {запускаем цикл в обратную сторону, для упрощения опустим множитель 1}

begin

y:=y*z;

z:=z-1

end;

fact:=y{вычисляем факториал, присваиваем его значение функции}

end; {конец функции}

begin{начало тела программы}

writeln('введите неотрицательные числа'); {для удобства пользователя просим ввести числа}

0:readln(m,n); {в память вводятся числа}

if m or n <0 then begin

writeln(‘вы ошиблись, вводите неотрицательные числа’);

goto 0 {при ошибке пользователя предотвращаем выдачу неверного результата}

end;

rez:=(fact(m)+fact(n))/fact(m+n); {вычисляется значение данного выражения}

writeln('результат: ',rez) {выводим на экран результаты счета}

end.

Исходные данные и результаты счета:

m=0, n=0, x=2.0000000000E+00 (2)

m=3, n=5, x=3.1250000000E-03 (0,003125)

m=7, n=-3, вы ошиблись, вводите неотрицательные числа

Пояснительная записка

Теперь поясним нашу программу. program factorial_(input,output) – с этим затруднений не возникает, factorial – имя программы, input-файл, откуда происходит считывание данных, output-файл, куда происходит вывод данных. В нашем случае (input,output) показывает, что программа требует ввода данных и производит их вывод.

Label 0; описываем метку, которая нам пригодиться позже

var

rez:real;

m,n:longint; - описываем глобальные переменные.

function fact(z: longint): real; объявляем функцию, даем ей имя fl, указываем формальные параметры. В данном случае это параметр-значение z.

var

y: real; описываем локальную переменную, т.е. она будет использоваться только в теле функции. Real использован потому, что уже 13! Выходит за рамки longint

begin

y:=1; необходимо присвоить переменной значение, равное единице, по крайней мере по двум причинам:

при умножении числа на 1 получается это же число, поэтому при у=1 исключены ошибки в начале вычисления факториала.

известно, что 0!=1, поэтому при m или n = 0 цикл не запускается, а значение 0! Оказывается равным 1.

while z>1 do запускаем цикл в обратную сторону, т. к. результат получается один и тот же, но при этом не приходится описывать дополнительную локальную переменную для запуска цикла с параметром. 1 исключаем из вычисления факториала по вышеуказанным причинам.

begin

y:=y*z;

z:=z-1

end;

fact:=y этим оператором присваиваем функции значение факториала.

Точку с запятой перед end можно не ставить.

end; конец функции

begin начало тела программы

writeln('введите неотрицательные числа'); данный оператор выводит на экран текст, заключенный между ‘’, помогает понять, чего же требует программа.

0:readln(m,n); при помощи этого оператора ввода информации исходные данные заносятся в ячейки памяти.

if m or n <0 then begin writeln(‘вы ошиблись, вводите неотрицательные числа’);

goto 0

end; если пользователь все же ввел отрицательные числа, то программа выдаст неверный результат, данная последовательность операторов выводит на экран сообщение об ошибке пользователя и возвращает к вводу чисел

rez:=(fact(m)+fact(n))/fact(m+n); вычисляем значение (m!+n!)/(m+n)!

writeln('результат: ',rez) данный оператор вывода информации выводит на экран вычисленное значение.

end. конец программы

Приведем для пущей надежности еще несколько результатов счета

M=2 N=8 X=1.1111662257Е-02

M=4 N=4 X=1.1904761905Е-03

M=0 N=3 X=1.1666666667Е+00

M=3 N=15 X=2.0424836601Е-04

ЗАКЛЮЧЕНИЕ

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

Список литературы

А. Масюков. Краткий конспект лекций по информатике.

Интерактивный учебник Turbo Pascal 7.0

С. А. Абрамов. Начала программирования на языке паскаль

 

Приложение

ASSEMBLER - эта директива отменяет стандартную последовательность машинных инструкций, вырабатываемых при входе в процедуру и перед выходом из нее.

EXTERNAL - с помощью этой директивы объявляется внешняя подпрограмма.

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

В соответствии с архитектурой микропроцессора ПК, в программах могут использоваться две модели памяти: ближняя и дальняя. Модель памяти определяет возможность вызова процедуры из различных частей программы: если используется ближняя модель, вызов возможен только в пределах 64 Кбайт (в пределах одного сегмента кода, который выделяется основной программе и каждому используемому в ней модулю); при дальней модели вызов возможен из любого сегмента. Ближняя модель экономит один байт и несколько микросекунд на каждом вызове подпрограммы, поэтому стандартный режим компиляции предполагает эту модель памяти. Однако при передаче процедурных параметров соответствующие подпрограммы должны компилироваться с расчетом на универсальную - дальнюю модель памяти, одинаково пригодную при любом расположении процедуры и вызывающей ее программы в памяти.

Явное объявление модели памяти стандартными директивами имеет более высокий приоритет по сравнению с настройкой среды.

FORWARD - используется при опережающем описании для сообщения компилятору, что описание подпрограммы следует где-то дальше по тексту программы (но в пределах текущего программного модуля).

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

INTERRUPT - используется при создании процедур обработки прерываний

опережающее описание:

Procedure В (j: byte);

forward;

Procedure A (i: byte);

begin

B(i);

End;

Procedure B;

Begin

…………….

A(j);

End;

Как видим, опережающее описание заключается в том, что объявляется лишь заголовок процедуры В, а ее тело заменяется стандартной директивой FORWARD. Теперь в процедуре А можно использовать обращение к процедуре В - ведь она уже описана, точнее, известны ее формальные параметры, и компилятор может правильным образом организовать ее вызов. Обратите внимание: тело процедуры В начинается заголовком, в котором уже не указываются описанные ранее формальные параметры.

Модуль – самостоятельная программная единица, ресурсы которой могут быть использованы другими программами (фактически та же самая программа, но с другим типом -.tpu);

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2019-10-17 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: