Главная

Популярная публикация

Научная публикация

Случайная публикация

Обратная связь

ТОР 5 статей:

Методические подходы к анализу финансового состояния предприятия

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

Ценовые и неценовые факторы

Характеристика шлифовальных кругов и ее маркировка

Служебные части речи. Предлог. Союз. Частицы

КАТЕГОРИИ:






Использование процедур и функций пользователя




При создании сложных программ большое внимание уделяется вопросам, связанным со структурой программы. Структурирование программы или её представление как совокупности относительно обособленных фрагментов делает программу более ясной, легче модифицируемой и проверяемой. Для структурирования программы считается целесообразным оформление любого самостоятельного фрагмента в качестве подпрограммы. Подпрограммой будем называть часть программы, оформленную в виде отдельной синтаксической конструкции снабжённую именем. «Вызов» подпрограммы, т.е. выполнение действий, заданных в подпрограмме в виде операторов, может быть произведен в некоторой точке программы посредством указания имени этой подпрограммы. Кроме задания последовательности действий, подпрограмма может содержать описания совокупности локальных объектов – констант, типов, переменных и т.д. Эти объекты предназначены для организации действий в подпрограмме и имеют смысл только внутри данной подпрограммы. Подпрограмма может быть разработана для различных случаев применения, т.е. перед началом выполнения ей может быть передана какая-либо исходная информация из точки вызова. Такая «настройка» подпрограммы реализуется с использованием параметров и способствует большей гибкости и универсальности подпрограммного механизма. В Object Pascal подпрограммы используются в виде процедур и функций, которые могут быть разделены на две категории: стандартные, т.е. являющиеся составной частью компилятора, и подпрограммы, созданные пользователем. К числу стандартных подпрограмм можно отнести использованные выше процедуры ShowMessage и MessageDlg, а также функции, перечисленные в таблицах №№1-3.

Структура подпрограммы напоминает структуру программы. При описании подпрограммы в общем случае необходимо задать следующие её компоненты:

1. Интерфейс подпрограммы, т.е. информацию, необходимую для её вызова.

2. Локальный контекст подпрограммы: совокупность описаний рабочих объектов, над которыми производятся действия.

3. Собственно операторы, составляющие смысл подпрограммы.

Интерфейс программы – информация, достаточная для её вызова, заключена в заголовке. Описание локальных объектов и операторы составляют внутреннюю её часть и, как правило, имеют синтаксис блока. Заголовок содержит информацию о том, что делает подпрограмма, а тело – о том, как она это делает. Разница между процедурами и функциями связана с различным назначением и способом их использования. Процедуры служат для задания совокупности действий, связанных с изменением внешней по отношению к ним программной обстановки (изменение значений переменных, общение с внешними устройствами и т.д.). Вызов процедуры на выполнение осуществляется с использованием оператора процедуры. Этот оператор задаёт выполнение операторов, заключённых в теле процедуры. После завершения выполнения процедуры управление передаётся оператору, следующему за оператором процедуры. Синтаксис оператора процедуры имеет следующий вид:

 
 

 

 


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


 
 

 

 


Заголовок процедуры

Заголовок функции

Заголовки процедур и функций начинаются со служебного слова, обозначающего вид подпрограммы, после чего следуют её имя, используемое при вызове подпрограммы, и, как правило, список формальных параметров. Последний может отсутствовать. Формальные параметры, указанные в описании процедуры или функции, получают значения фактических параметров, размещенных на тех же позициях указанных в момент вызова функции. Количество фактических параметров равно количеству формальных параметров, указанных при описании подпрограммы. Следует обратить внимание на следующее: типы формальных параметров должны обозначаться идентификаторами. Например, следующий заголовок недопустим: procedure Incorrect(var A: array[1..10] of real). Идентификаторы формальных параметров можно считать условными обозначениями в теле подпрограммы тех реальных или фактических параметров, которые будут переданы в подпрограмму при её вызове. Для функций необходимо также указать тип возвращаемого результата. Тип результата следует после списка формальных параметров и отделяется от него двоеточием. Функция всегда возвращает какое-либо значение. Поэтому в теле функции должен присутствовать оператор присваивания, в левой части которого находится идентификатор, совпадающий с именем функции, а в правой – выражение, вычисляющее возвращаемое значение. Таких операторов присваивания может быть несколько. Важно только, чтобы хотя бы один из них всегда срабатывал в процессе выполнения тела функции. Тип выражения в правой части оператора присваивания должен быть совместим с типом функции, т.е. с типом возвращаемого значения, указанным в заголовке функции. Если в процессе выполнения функции не было выполнено ни одного присваивания, то результат функции считается неопределённым. Программирование функций упрощено благодаря автоматическому объявлению локальной (определённой только внутри данной функции) переменной Result в каждой из них. Эта переменная имеет тот же самый тип, что и тип результата функции. Присваивание значения переменной Result по действию аналогично присвоению того же значения идентификатору функции. При программировании в среде Delphi описания объектов, глобальных переменных, указание вызываемых стандартных модулей производится автоматически, и пользователь, как правило, создаёт именно собственные процедуры обработки того или иного события. В приведенных выше программах это были процедуры реакции программы на щелчок мышью по кнопке. Однако внутри каждой процедуры обработки события могут быть определены другие процедуры и функции пользователя. Например, в программе расчёта площади многоугольника можно выделить, по меньшей мере, два фрагмента, которые могут быть оформлены как подпрограммы. Это расчёт длины отрезка, координаты концов которого известны, и расчёт площади треугольника по трём сторонам, причём каждый из этих фрагментов можно представить и как процедуру, и как функцию пользователя. Фрагмент программы расчёта площади многоугольника, где расстояния между вершинами определяются при помощи функции distance, приведен ниже.

Var

x: array[1..20,1..2] of integer;

a: array[1..19,1..3] of real;

s: array[1..19] of real;

i,j,m,n:integer;

p,s1,Stot:real;

function distance(x1,x2:integer):real;

Begin

result:=sqrt(sqr(x1)+sqr(x2))

end;

Begin

………………………

for i:=1 to (n-1) do

Begin

a[i,1]:=distance(x[i,1],x[i,2]);

a[i,2]:=distance((x[i,1]-x[i+1,1]),(x[i,2]-x[i+1,2]));

a[i,3]:=distance(x[i+1,1],x[i+1,2]);

end;

………………………..

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

Расчёт расстояния между двумя точками может быть выполнен и с использованием процедуры пользователя. Фрагмент программы расчёта площади многоугольника с использованием процедуры пользователя имеет вид:

Var

x: array[1..20,1..2] of integer;

a: array[1..19,1..3] of real;

s: array[1..19] of real;

i,j,m,n:integer;

p,s1,Stot:real;

procedure distance(x1,x2:integer; var d:real);

Begin

d:=sqrt(sqr(x1)+sqr(x2));

end;

Begin

………………………..

for i:=1 to (n-1) do

Begin

distance(x[i,1],x[i,2],a[i,1]);

distance((x[i,1]-x[i+1,1]),(x[i,2]-x[i+1,2]),a[i,2]);

distance(x[i+1,1],x[i+1,2],a[i,3]);

end;

………………………….

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

1. Параметры, перед которыми отсутствует служебное слово var и за которыми следует идентификатор типа.

2. Параметры, перед которыми указано служебное слово var и за которыми следует тип.

Первый способ называется передачей параметров по значению. Второй способ – передачей параметров по ссылке. Одна и та же программа может содержать оба способа передачи параметров. Параметры-значения – наиболее распространённый и простой способ передачи параметров. Параметр считается обычной локальной переменной в пределах подпрограммы. При вызове подпрограммы начальное значение такого параметра автоматически устанавливается равным значению соответствующего ему фактического параметра. Параметры, передаваемые по ссылке (параметры-переменные), указываются заданием служебного слова var перед их идентификаторами в списке параметров.

Телом процедуры или функции является блок. Структура блока содержит описание объектов и группу операторов. Имена объектов, описанных в блоке подпрограммы, по определению считаются известными только в пределах данного блока. Это же относится и к именам формальных параметров. Говорят, что формальные параметры и объекты, описанные в блоке подпрограммы, образуют собственный локальный контекст данного блока. Среди описаний блока могут содержаться описания процедур и/или функций. Таким образом, допускается создание вложенных подпрограмм, которые, в свою очередь, допускают наличие вложенных подпрограмм. Таким образом:

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

2. Имена объектов, описанных в блоке, должны быть уникальны в пределах данного блока и могут совпадать с именами объектов из других блоков.

3. Если в некотором блоке описан объект, имя которого совпадает с именем объекта, описанного в объемлющем блоке, то это последнее имя становится недоступным в данном блоке. Говорят, что имя, описанное в блоке, экранирует одноименные объекты из блоков, объемлющих данный блок.

Если пользователь разработал подпрограмму (процедуру или функцию), которая должна быть использована при работе процедур обработки различных событий, нет необходимости описывать её в тексте каждой из указанных процедур. Для «обобществления» такой подпрограммы её описание следует поместить в раздел implementation (реализация) основного модуля. Если разработанные процедуры и функции предполагается использовать в различных программах, пользователь имеет возможность создать собственный модуль, в состав которого входили бы указанные подпрограммы. В дальнейшем такой модуль может быть использован точно также как и остальные модули компилятора.

Задание: Решить предыдущую задачу с использованием процедур и/или функций пользователя.

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

 

 






Не нашли, что искали? Воспользуйтесь поиском:

vikidalka.ru - 2015-2024 год. Все права принадлежат их авторам! Нарушение авторских прав | Нарушение персональных данных