Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


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



Чтобы использовать подпрограммы, константы, типы, переменные, описанные в интерфейсе модуля, в основной программе следует записать слово uses, после которого указать имя (имена) модуля (модулей). После этого в основной программе можно использовать любые идентификаторы (констант, типов, переменных, подпрограмм), указанные в интерфейсах перечисленных модулей.

Пример. Программа, меняющая в массиве максимальное и минимальное числа.

program EXAMPLE26; {заголовок программы}

uses Unitl, Unit2; {используемые модули}

var i: Integer;

begin

Change(Arr); {процедура замены в Unitl,

массив Arr - в Unit2}

for i: = 1 to N do {N-B Unit2}

WriteLn(Arr(i])

end.

 

{модули, расположенные в других файлах}

unit Unitl; {модуль с основной подпрограммой}

interface {интерфейс первого модуля}

uses Unit2; {использование модуля с параметрами}

procedure Change (var Arr: Mass); {заголовок процедуры}

implementation {исполнительная часть}

uses UnitS; {использование модуля с вспомогательной подпрограммой}

procedure Change; {сокращенный заголовок}

var Max, Min, i; Integer;

begin

Max: = 1; Min: = 1;

for i: = 1 to N do {N-в Units}

begin

if Arr[i] > Arr[Max]

then Max: = i;

if Arrti] < Arr[Min]

then Min: = i

end;

Swap(Arr[Max], Arr[Min]) {замена местами макс.и мин.чисел, процедура в Units}

end

end. {конец Unitl}

 

 

unit Unit2; {модуль с параметрами}

interface {интерфейс второго модуля}

const N = 5; {число элементов}

type Mass = array! 1..N] of Real; {тип массива}

const Arr: Mass = (0.5, -2.0, 1.0, 3.5, 7.0);

{типизированная константа}

implementation {исполнительная часть}

end. {конец UNIT2}

 

 

unit UnitS; {модуль с вспомогательной подпрограммой}

interface {интерфейс третьего модуля}

procedure Swap(var X, Y: Real}

implementation {исполнительная часть}

procedure Swap(var X, Y: Real) {перемещение двух чисел}

var Z: Real;

begin

Z: = X; X: - Y; Y: = Z

end

end. {конец UNITS}

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

Как правило, идентификаторы объектов модуля используются в основной программе (или другом модуле) обычным образом. Однако может оказаться, что используемый идентификатор элемента модуля совпадает с идентификатором использующей его программы. Чтобы различить их, при обращении к элементу модуля указывается имя модуля, а затем через точку – идентификатор объекта (аналогично использованию полей записи).

Пример,

program EXAMPLE;

uses Unitl;

var Result, X: Real;

begin

Read (X); {чтение переменной программы}

Read (Unitl.X); {чтение переменной модуля}

Result: = X {переменная программы}

+Unitl.X {переменная модуля}

end

 

.

unit Unitl;

interface

var X: Real; {переменная модуля}

implementation

end.

 

19.2 Подпрограммы в языке C

Характеристика подпрограмм

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

Функция в C это совокупность объявлений и операторов, обычно предназначенная для решения определенной задачи. Каждая функция должна иметь имя, которое используется для ее объявления, определения и вызова. В любой программе на C должна быть функция с именем main (главная функция), именно с этой функции, в каком бы месте программы она не находилась, начинается выполнение программы.

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

В языке C нет требования, чтобы определение функции обязательно предшествовало ее вызову. Определения используемых функций могут следовать за определением функции main, перед ним, или находится в другом файле.

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

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

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

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

Для того, чтобы задать функцию в C, необходимо её объявить:

- сообщить имя (идентификатор) функции;

- перечислить входные параметры (аргументы);

- и указать тип возвращаемого значения.

Также необходимо привести определение функции, которое содержит блок операторов, реализующих поведение функции.

Отсутствие определения ранее определённой функции является ошибкой, что, в зависимости от реализации, приводит к выдаче сообщений или предупреждений.

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

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

Определение функции

Каждая функция в языке C должна быть определена, то есть должны быть указаны:

- тип возвращаемого значения;

- имя функции;

- информация о формальных аргументах;

- тело функции.

Определение функции имеет следующий синтаксис:

ТипВозвращаемогоЗначения ИмяФункции(СписокФормальныхАргументов){

ТелоФункции;

...

return(ВозвращаемоеЗначение);

}

Пример:

float function(float x, float z)
{

float y;

y=x+z;

return(y);

}

В указанном примере возвращаемое значение имеет тип float. В качестве возвращаемого значения в вызывающую функцию передается значение переменной y. Формальными аргументами являются значения переменных x и z.

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

Различают системные (в составе систем программирования) и собственные функции.

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

Собственные функции – это функции, написанные пользователем для решения конкретной подзадачи.

Разбиение программ на функции дает следующие преимущества:

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

Одну и ту же функцию можно использовать в разных программах.

Функции повышают уровень модульности программы и облегают ее проектирование.

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

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

Вызов функции

Общий вид вызова функции:

переменная = ИмяФункции(СписокФактическихАргументов);

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


Поделиться:



Последнее изменение этой страницы: 2017-04-12; Просмотров: 541; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.032 с.)
Главная | Случайная страница | Обратная связь