A := x+SumSqr(5.3,c+d);

§5.2. Процедуры

Описание процедур похоже на описание функций. Более того, функции есть разновидность процедур с возвращаемым результатом, который используется в выражении. Функции просто применяют для упрощения составления программ, в машинном языке присутствуют только процедуры. Описание процедуры имеет вид:

Procedure <имя>[(<список параметров>)];

[<описания>;]

<операторы>

End;

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

1.  С именем процедуры, в отличие от функции, не связано никакое значение, поэтому имени в теле процедуры значение не присваивается и, соответственно, не указывается тип возвращаемого результата.

2.  Обращение осуществляется не в выражении, а отдельной строкой, – оператором обращения к процедуре, – с указанием имени и списка фактических параметров. Например, операторы ввода-вывода имеют полное название «операторы обращения к процедурам ввода или вывода». Правда, они составлены с использованием объектно-ориентированного программирования, поэтому первый пункт правил использования подпрограмм к ним не относится.

Правила использования подпрограмм

1.  В заголовке подпрограммы и при обращении к ней аргументы должны совпадать по типу, количеству и порядку следования.

2.  В подпрограммах допускается наличие вложенных подпрограмм, количество вложений не ограничено.

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

НЕ нашли? Не то? Что вы ищете?

4.  Работа процедуры или функции завершается после выполнения последнего оператора ее тела. Язык Турбо-Паскаль содержит дополнительное средство прерывания выполнения подпрограммы или программы в целом, это системная процедура Exit. Она возвращает управление в точку вызова. Данная процедура является избыточной и предназначена только для устранения безусловного перехода на конец подпрограммы или программы в целом, поэтому, при наличии нескольких вариантов, лучше обходиться без нее. Так, использование второго варианта подпрограммы более предпочтительно.

Procedure P(x, y:real; Var Res:real);

Begin

If x<y Then Exit;

Res:=Sqrt(x*x-y*y)

End;

Procedure P(x, y:real; Var Res:real);

Begin

If x>=y Then Res:=Sqrt(x*x-y*y)

End;

Рекурсия

В языке Паскаль допустимо обращение подпрограммы самой к себе, то есть рекурсивные вычисления.

Решение некоторой задачи рекурсивно, если его можно выразить в терминах решения более простой версии этой же задачи. Природа многих математических алгоритмов рекурсивна, поэтому рекурсия достаточно широко применяется в программировании.

Большинство циклических алгоритмов с известным количеством повторений можно записать с помощью рекурсии, например, вычисление факториала или суммы:

Program SumRec;

Var S:real;

Procedure Sum(Var S:real;N:integer);

Begin

If N=1 then

S:=1

Else

Begin

Sum(S, N-1);

S:=S+1/N

end

end;

Begin

sum(S,100);

Writeln('Сумма=',S:10:4)

end.

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

Директивы

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

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

При этом в начале раздела описывается только заголовок подпрограммы, а сама подпрограмма записывается далее через несколько блоков, но только с указанием в заголовке его имени, например:

Procedure Q(x:T); Forward;

Procedure P(y:T);

Begin

Q(A);

end;

Procedure Q;

Begin

P(B);

end;

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

В Турбо-Паскале есть еще несколько директив, относящимся к подпрограммам. Если подпрограмма или группа подпрограмм разработана вне системы Турбо-Паскаль, например, на языке Ассемблер или Си, а их объектный код находится в объектном файле, то такую подпрограмму можно подключить с помощью директивы External, дополнительно задав директиву компилятора $L с именем OBJ-файла:

Procedure SqRoots(A, B,C:word); external;

{$L ROOTS. OBJ}

Для обеспечения корректности такого подключения необходимо соблюдать определенные межъязыковые соглашения о связях.

Другим вариантом создания машинного кода подпрограмм с непосредственным указанием машинных команд является директива Inline. Так же можно составлять программы с использованием мнемонических или ассемблерных обозначений команд, используя директиву Assembler.

Для подпрограммы допускается указание типа вызова процедуры: дальний (межсегментный) или ближний (внутри одного сегмента), задаваемые соответственно словами Far и Near. Они эквивалентны директивам компилятора {$F+} и {$F‑}.

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

Процедурные типы

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

Общее описание процедурного типа следующее:

Type <имя типа>=Function (<список параметров>):<тип>;

Type <имя типа>=Procedure (<список параметров>);

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

1.  Подпрограмма, присваиваемая процедурной переменной, должна быть оттранслирована в режиме дальнего типа вызова (см. пример ниже).

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

3.  Данные подпрограммы не могут быть вложенными в другие подпрограммы.

4.  Такие подпрограммы не могут быть процедурами прерываний.

Пример использования подпрограмм

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

.

Вычисление производится по формуле

,

где , ,

количество отрезков разбиения площади интегрирования определяется по заданной точности e = 10-3. Сначала интеграл представляется в виде одной трапеции, потом двух, потом четырех и т. д., то есть шаг интегрирования в каждом цикле уменьшается в два раза.

Program SumInt;

{ Демонстрационная программа на использование функций: вычисление суммы двух интегралов методом трапеций с заданной точностью }

Const EPS=1E-3; { Точность зададим константой }

Type Func=Function(x:real):real; { процедурный тип }

Var SI:Real; { Результат: сумма интегралов }

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

{$f+}

Function F1(x:real):real;

Begin

F1:=exp(-x)*(x*x+7*x+9)

End;

Function F2(x:real):real;

Begin

F2:=sin(x)*(x*x*x+3)

End;

{$f-}

{ В функцию передаем границы (вещественные) и последовательность вычислений – процедурный тип }

Function IntTrap(A, B:Real;F:Func):real;

Var IntAlt, IntNew, { старое и новое значение интеграла }

H, S,x,

v:real; { вспомогательная переменная }

Begin

H:=B-A;

v:=F(A)+F(B); { для сокращения вычислений }

IntNew:=H/2*v; { Первый интеграл из одной трапеции }

Repeat

IntAlt:=IntNew; { Старим предыдущее значение }

H:=H/2; { Уменьшаем шаг в 2 раза }

S:=0; x:=A;

Repeat

x:=x+H;

S:=S+F(x)

Until x>=B;

IntNew:=H/2*(v+2*S);

Until Abs(IntAlt-IntNew)<EPS; { Проверка, насколько мала разность интегралов, вычисленных с разным шагом }

IntTrap:=IntNew;

End;

{ Раздел операторов – непосредственно сама программа }

Begin

{ Очень важно соблюдать типы и последовательность параметров при обращении к функциям}

SI:=IntTrap(0.0,2.0,F1)+IntTrap(0.0,2.0,F2);

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24

Основные порталы (построено редакторами)

Домашний очаг

ДомДачаСадоводствоДетиАктивность ребенкаИгрыКрасотаЖенщины(Беременность)СемьяХобби
Здоровье: • АнатомияБолезниВредные привычкиДиагностикаНародная медицинаПервая помощьПитаниеФармацевтика
История: СССРИстория РоссииРоссийская Империя
Окружающий мир: Животный мирДомашние животныеНасекомыеРастенияПриродаКатаклизмыКосмосКлиматСтихийные бедствия

Справочная информация

ДокументыЗаконыИзвещенияУтверждения документовДоговораЗапросы предложенийТехнические заданияПланы развитияДокументоведениеАналитикаМероприятияКонкурсыИтогиАдминистрации городовПриказыКонтрактыВыполнение работПротоколы рассмотрения заявокАукционыПроектыПротоколыБюджетные организации
МуниципалитетыРайоныОбразованияПрограммы
Отчеты: • по упоминаниямДокументная базаЦенные бумаги
Положения: • Финансовые документы
Постановления: • Рубрикатор по темамФинансыгорода Российской Федерациирегионыпо точным датам
Регламенты
Термины: • Научная терминологияФинансоваяЭкономическая
Время: • Даты2015 год2016 год
Документы в финансовой сферев инвестиционнойФинансовые документы - программы

Техника

АвиацияАвтоВычислительная техникаОборудование(Электрооборудование)РадиоТехнологии(Аудио-видео)(Компьютеры)

Общество

БезопасностьГражданские права и свободыИскусство(Музыка)Культура(Этика)Мировые именаПолитика(Геополитика)(Идеологические конфликты)ВластьЗаговоры и переворотыГражданская позицияМиграцияРелигии и верования(Конфессии)ХристианствоМифологияРазвлеченияМасс МедиаСпорт (Боевые искусства)ТранспортТуризм
Войны и конфликты: АрмияВоенная техникаЗвания и награды

Образование и наука

Наука: Контрольные работыНаучно-технический прогрессПедагогикаРабочие программыФакультетыМетодические рекомендацииШколаПрофессиональное образованиеМотивация учащихся
Предметы: БиологияГеографияГеологияИсторияЛитератураЛитературные жанрыЛитературные героиМатематикаМедицинаМузыкаПравоЖилищное правоЗемельное правоУголовное правоКодексыПсихология (Логика) • Русский языкСоциологияФизикаФилологияФилософияХимияЮриспруденция

Мир

Регионы: АзияАмерикаАфрикаЕвропаПрибалтикаЕвропейская политикаОкеанияГорода мира
Россия: • МоскваКавказ
Регионы РоссииПрограммы регионовЭкономика

Бизнес и финансы

Бизнес: • БанкиБогатство и благосостояниеКоррупция(Преступность)МаркетингМенеджментИнвестицииЦенные бумаги: • УправлениеОткрытые акционерные обществаПроектыДокументыЦенные бумаги - контрольЦенные бумаги - оценкиОблигацииДолгиВалютаНедвижимость(Аренда)ПрофессииРаботаТорговляУслугиФинансыСтрахованиеБюджетФинансовые услугиКредитыКомпанииГосударственные предприятияЭкономикаМакроэкономикаМикроэкономикаНалогиАудит
Промышленность: • МеталлургияНефтьСельское хозяйствоЭнергетика
СтроительствоАрхитектураИнтерьерПолы и перекрытияПроцесс строительстваСтроительные материалыТеплоизоляцияЭкстерьерОрганизация и управление производством