Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Подпрограммы






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

Алгоритм решения задачи проектируется путем декомпозиции всей задачи в отдельные подзадачи. Обычно подзадачи реализуются в виде подпрограмм.

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

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

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

 

2.1. Описание, определение и вызов процедур

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

Procedure < Name> (< Список формальных параметров>);

… {Раздел описаний}

Begin

…{Раздел операторов процедуры}

End;

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

Procedure MyProc (A, B, C: Real; var X1, X2: Real);

Begin

WriteLn('A=', A, ' B=', B, 'C=', C);

X1: =A+B;

X2: =A*B-C

End;

Разделы описаний процедуры подобно основной программе могут содержать разделы описания меток (Label), констант (Const), типов (Type), переменных (Var) и раздел процедур и функций. Раздел операторов помещается после служебного слова Begin и заканчивается служебным словом End, после End становится "; ". В основной программе процедуры располагают перед разделом операторов (телом программы) основной программы.

Формальные параметры - это переменные, посредством которых передаются данные из места вызова процедуры в её тело, либо из процедуры в места вызова. Список формальных параметров может отсутствовать, при этом символ "; " ставится сразу за именем процедуры и данные из места вызова процедуры в её тело не передаются.

Для вызова процедуры на исполнение к ней необходимо обратится.

Вызов процедуры производится указанием имени процедуры и списком фактических параметров:

Name(< Список фактических параметров>);

MyProc(K, L+M, 12, Y1, Y2);

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

Фактические параметры - это переменные (или значения заданные явно), которые передаются в процедуры на место формальных параметров. Если в вызываемой процедуре отсутствует список формальных параметров, то список фактических параметров тоже отсутствует.

Количество фактических параметров должно соответствовать количеству формальных параметров; соответствующие фактические и формальные параметры должны совпадать по порядку записи и по типу данных.

 

2.2. Описание, определение и вызов функций

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

Function < Name> (< Список формальных параметров>): < Type>;

… {Раздел описаний}

Begin

…{Раздел операторов процедуры}

Name: =< выражение соответствующего типа&;

End;

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

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

Пример:

Разработать функцию, определяющую по двум катетам гипотенузу прямоугольного треугольника.

Function Gepoten(a, b: real): real;

Begin

Gepoten: =Sqrt(Sqr(a)+Sqr(b))

End;

 

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

z: =Gepoten(x, y); {z присваивается значение гипотенузы}

или

WriteLn('Значение гипотенузы', Gepoten(x, y));

 

2.3. Передача параметров в подпрограммы

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

Группа параметров без предшествующего ключевого слова является списком параметров-значений.

Группа параметров, перед которыми следует ключевое слово Const и за которыми следует тип, является списком параметров-констант.

Группа параметров, перед которыми стоит ключевое слово Var и за которыми следует тип, является списком типизированных параметров-переменных.

Группа параметров, перед которыми стоит ключевое слово Var или Const за которыми не следует тип, является списком не типизированных параметров-переменных.

Параметры строкового типа и массивы могут быть открытыми параметрами. Параметры-переменные, описанные с помощью идентификатора OpenString или с использованием ключевого слова string при включённой директиве {$P+}, являются открытыми строковыми параметрами. Значение, константа или параметр-переменная, описанные с помощью синтаксиса array of type, являются открытым параметром-массивом.

 

2.4. Передача параметров по назначению

При передаче параметров по значению в формальный параметр передаётся копия значения соответствующего фактического параметра, при этом сам формальный параметр создаётся в стеке. Примерами параметров-значений служат параметры A, B и C в процедуре с заголовком MyProc. В этом случае фактическим параметром, соответствующим A, либо B, либо C, может быть любое выражение или переменная типа Real. Для параметров-значений компилятор при вызове процедуры выделяет место в сегменте стека (специальная область оперативной памяти) для каждого формального параметра, вычисляет значение фактического параметра и передаёт его в ячейку, соответствующую формальному параметру, выполняет тело процедуры. После завершения работы процедуры, формальные параметры уничтожаются, а фактические остаются неизменными (по значению).

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

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

 






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.