Смекни!
smekni.com

Синтаксис описания и вызова процедуры (стр. 3 из 3)

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, вы ошиблись, вводите неотрицательные числа

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

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

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

var

rez:real;

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

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

var

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

begin

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

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

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

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

begin

y:=y*z;

z:=z-1

end;

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

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

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

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

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

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

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

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

ЗАКЛЮЧЕНИЕ

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

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

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

Интерактивный учебник TurboPascal 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);