Процедурное программирование 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Процедурное программирование



ПРОЦЕДУРНОЕ ПРОГРАММИРОВАНИЕ

Основные понятия парадигмы процедурного программирования

К настоящему времени сложился ряд стилей программирования - процедурное, функциональное, логическое и объектно-ориентированное. Стилю (парадигме) программирования соответствует своя собственная уникальная модель вычислений. Процедурное (императивное) программирование является отражением архитектуры традиционных ЭВМ, которая была предложена фон Нейманом в 40-х гг. Теоретической моделью процедурного программирования служит алгоритмическая система под названием "машина Тьюринга". Программа состоит из последовательности операторов, задающих те или иные действия. Основным является оператор присваивания, служащий для изменения содержимого областей памяти. Вообще концепция памяти как хранилища значений, содержимое которого может обновляться операторами программы, является фундаментальным в императивном программировании. Выполнение программы сводится к последовательному выполнению операторов с целью преобразования исходного состояния памяти (т.е. значений переменных) в заключительное. Таким образом, с точки зрения программиста имеется программа и память, причем первая последовательно обновляет содержимое последней. Процедурное программирование характеризуется

- значительной сложностью,

- необходимостью явного управления памятью, в частности необходимостью описания переменных,

- высокой эффективностью реализации на традиционных ЭВМ.

Вспомогательные алгоритмы и подпрограммы

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

- в одной задаче необходимо неоднократно выполнить одинаковые действия над одинаковыми по типу данными;

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

Это привело к введению в программировании понятия вспомогательного алгоритма. Термин "вспомогательный алгоритм" означает не специальный вид алгоритма, а относится к использованию алгоритма. Это справедливо и для термина "основной алгоритм". Вспомогательными и основными алгоритмы являются не сами по себе, а по отношению друг к другу.

Подпрограмма – это реализация вспомогательного алгоритма на языке Паскаль.

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

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

- назначение;

- имя;

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

V. 2. Структура текста подпрограммы

Текст подпрограммы состоит из разделов. Первый раздел – это заголовок подпрограммы. Остальные разделы представляют собой блок. Понятие блока определено в структуре текста программы и включает в себя 6 разделов:

- раздел меток;

- раздел поименованных констант;

- раздел нестандартных типов;

- раздел переменных;

- раздел текстов подпрограмм;

- раздел операторов.

Таким образом, структура текста подпрограммы в основном совпадает с текстом программы. За исключением того, что

- - в подпрограмме отсутствует раздел используемых модулей,

- - подпрограмма заканчивается точкой с запятой, а не точкой и

- - вид заголовка подпрограммы отличается от заголовка программы.

Заголовок подпрограммы

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

- - вид подпрограммы (процедура или функция);

- - имя подпрограммы;

- - список формальных параметров;

- - тип результата (только для функций).

Синтаксис заголовка подпрограммы определен на рис. 16.1.

Рис. 16.1. - Синтаксические диаграммы заголовков подпрограмм

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

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

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

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

СФОП
(список формальных параметров)

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

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

Для каждого входного и выходного данного в СФОП задается:

- произвольное имя;

- тип данных;

- вид параметра.

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

Вид параметра определяется статусом и типом параметра:

· параметры-значения – это всегда входные данные (обычно только простых, ссылочных или строковых типов);

· параметры-переменные – это всегда выходные данные;

· параметры-константы – это входные параметры сложных типов, кроме строковых и ссылочных (параметры-константы определены только в Турбо Паскале).

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

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

Рис. 16.2 - Синтаксическая диаграмма списка формальных параметров

Пример применения подпрограмм

В качестве наглядного примера рассмотрим математическую задачу вычисления числа сочетаний из n по m

Правило вычисления этого значения следующее:

Исходя из этого, видим, что трижды необходимо вычислить факториал натурального числа. Целесообразно реализовать вычисление факториала в виде вспомогательного алгоритма.

Разработка подпрограммы

II. Спецификация

1) Назначение: вычисление факториала натурального числа

2) Имя: F

3) Вид: функция, т.к. результат - одно натуральное число, являющееся факториалом входного параметра.

4) Перечень параметров:

Таблица 16.1. Перечень параметров

Статус Назначение Имя Тип Вид
Вход Аргумент математической функции вычисления факториала k byte параметр-значение
Возвращаемое значение Результат вычисления факториала F longint -

Типом результата функции выбран тип longint, так как факториал быстро растущая функция – 0!=1; 1!=1; 2!=2; 3!=6; 4!=24; 5!=120; 6!=720; 7!=5040; 8!=40320; 9!=362880 и т.д. Исходя из этого, аргумент не должен превышать значения 12.

5) Заголовок подпрограммы:

FUNCTION F(k:BYTE):LONGINT;

III. Метод решения

Определенная математическая модель

F(0) = 1,

F(k) = 1*2*3*...*k, при k, принадлежащем множеству натуральных чисел

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

Существует общий алгоритм накопления произведения заданного числа последовательных значений. Вначале переменной, в которой должен быть накоплен результат, присваивается единица (F:=1). Затем значение этой переменной последовательно домножается на каждый сомножитель (для всех i от 1 до k выполняется действие F:=F*i).

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

Таким образом, метод решения можно сформулировать так

1) y:=1

2) "i:=1..k: y:=y*i

3) F:=y

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

IV. Информационная модель

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

Таблица 16.2. Информационная модель

Назначение Имя Тип
Переменная для накопления произведения y longint
Текущий сомножитель I byte

V. Текст подпрограммы

 

{Функция F вычисляет факториал заданного целого положительного числа.

Имя функции: F.

Входной параметр: параметр-значение типа byte (целое положительное число).

Параметр-результат: целое число типа longint.

}

function F(k:word):longint;

var y:longint;{для накопления произведения}

i:byte;{текущий сомножитель}

begin

y:=1;

for i:=1 to k do

y:=y*i;

F:=y

end;{function F}

 

Текст программы

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

program sochet;

{Программа служит для вычисления числа сочетаний C из n по m}

 

label inp;{используется при повторе ввода из за ошибки ввода}

 

{Функция F вычисляет факториал заданного целого положительного числа.

Входной параметр: параметр-значение типа byte (целое положительное число).

Параметр-результат: целое число типа longint.

}

function F(k:word):longint;

var y:longint;{для накопления произведения}

i:byte;{текущий сомножитель}

begin

y:=1;

for i:=1 to k do

y:=y*i;

F:=y

end;{function F}

 

var n,m:word;{исходные данные}

C:word;{результат - число сочетаний}

 

begin

 

{ ввод исходных данных }

 

inp: writeln('Для задачи вычисления числа сочетаний из n по m');

writeln('введите значения n и m в пределах от 1 до 12, n>=m.');

{ отключение системы прерываний на ошибки ввода-вывода и выхода из диапазона значений }

{$I-}

{$R-}

readln(n,m);

{ включение системы прерываний на ошибки ввода-вывода и выхода из диапазона значений }

{$I+}

{$R+}

{ проверка правильности ввода. При ошибке - повторение ввода }

if (IOResult<>0)or(n<m)or(n>12)or(m>12)or(n<1)or(m<1)

then begin

writeln('ОШИБКА ВВОДА');

goto inp

end;

 

{ вычисление числа сочетаний }

C:=F(n) div (F(m)*F(n-m));

 

{ вывод результата }

writeln('Число сочетаний из ',n,' по ',m,' = ',C)

 

end.

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

Исполнение программы sochet

0. Распределение оперативной памяти показано на рис. 16.4.

n ? 3
m ? 2
C ? 3

Рис. 16.4. – Распределение ОП

1. В результате выполнения оператора обращения к процедуре вывода на экране появляется текст:

Для задачи вычисления числа сочетаний из n по m

2. В результате выполнения оператора обращения к процедуре вывода на экране появляется текст:

введите значения n и m в пределах от 1 до 16, n>=m.

3. При выполнении оператора обращения к процедуре ввода ЭВМ ожидает от человека два значения типа byte.

Пусть человек нажимает клавиши: 3 пробел 2 Enter

ЭВМ размещает значения в ОП: 3 n 2 m

4. Вычисляется условие наличия ошибки ввода исходных данных, получается результат FALSE

5. Выполняется оператор присваивания C:=F(n) div (F(m)*F(n-m))

6. Создается стек выражения, в который переносятся значения, знаки операций и круглые скобки, изменяющие порядок выполнения действий (рис. 16.5)

С:=   div (   *   )
         
  F(n)     F(m)   F(n-m)  

Рис. 16.5. – Стек вычисления выражения

При заполнении стека трижды встречаются вызовы функции F. В соответствии с правилами вычисления выражения из этих трех обращений первым обрабатывается вызов F(m). Рассмотрим выполнение этого вызова:

6.1. Создается динамический экземпляр данных подпрограммы (рис. 16.6), в который входят

- переменная, совпадающая по имени с именем функции F. Тип этой переменной определяется типом результата функции longint;

- переменная k, соответствующая одноименному формальному параметру-значению типа byte;

- две локальных переменных y типа longint и i типа byte;

F ? 2
k ? 2
y ? 1 1 2
i ? 1 2?

Рис. 16.6. – Динамический экземпляр данных функции F

6.2. Осуществляется передача фактических параметров в подпрограмму. В нашем случае имеется один фактический параметр m. Он подставляется на место формального параметра-значения k. Поэтому фактический параметр вначале вычисляется. Полученное значение 2 заносится в динамический экземпляр данных в переменную k;

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

6.4. По завершению подпрограммы значение автоматической переменной F равное 2 передается в стек, из которого вызывалась функция. Динамический экземпляр данных подпрограммы уничтожается и продолжает вычисляться вышеуказанный стек.

Аналогично обрабатываются вызовы F(n-m) и F(n). После заполнения содержимое стека выглядит следующим образом:

С:=   div (   *   )

Рис. 16.7. – Содержимое стека

В результате выполнения оператора переменной С будет присвоено значение 3;

7. В результате выполнения оператора обращения к процедуре вывода на экране появляется сообщение:

Число сочетаний из 3 по 2 = 3

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

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

Разработка подпрограммы

II. Спецификация

1) Назначение: вычисление факториала натурального числа

2) Имя: FP

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

4) Перечень параметров:

Таблица 16.4. Перечень параметров

Статус Назначение Имя Тип Вид
Вход Аргумент математической функции вычисления факториала k byte параметр-значение
Выход Результат вычисления факториала Y longint Параметр-переменная

5) Заголовок подпрограммы:

PROCEDURE FP(k:BYTE; VAR Y:LONGINT);

III. Метод решения

Определенная выше математическая модель может быть реализована следующим образом:

1) Y:=1

2) "i:=1..k: Y:=Y*i

IV. Информационная модель

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

Таблица 16.5. Информационная модель

Назначение Имя Тип
Текущий сомножитель i byte

V. Программная модель

{Процедура FP вычисляет факториал заданного целого положительного числа.

Входной параметр: параметр-значение типа byte (целое положительное число)

Выходной параметр: параметр-переменная Y типа longint}

procedure FP(k:byte; var y:longint);

var i:byte;{текущий сомножитель}

begin

y:=1;

for i:=1 to k do

y:=y*i;

end;{procedure FP}

Текст программы

program sochet2;

{Программа служит для вычисления числа сочетаний C из n по m}

 

label inp;{используется при повторе ввода из за ошибки ввода}

 

{Процедура FP вычисляет факториал заданного целого положительного числа.

Входной параметр: параметр-значение типа byte (целое положительное число)

Выходной параметр: параметр-переменная Y типа longint}

procedure FP(k:byte; var y:longint);

var i:byte;{текущий сомножитель}

begin

y:=1;

for i:=1 to k do

y:=y*i;

end;{procedure FP}

 

 

var n,m:word;{исходные данные}

C:word;{результат - число сочетаний}

R1, R2, R3: longint; {промежуточные переменные для значений факториалав}

 

begin

 

{ ввод исходных данных }

 

inp:writeln('Для задачи вычисления числа сочетаний из n по m');

writeln('введите значения n и m в пределах от 1 до 16, n>=m.');

{ отключение системы прерываний на ошибки ввода-вывода и выхода из диапазона значений }

{$I-}

{$R-}

readln(n,m);

{ включение системы прерываний на ошибки ввода-вывода и выхода из диапазона значений }

{$I+}

{$R+}

{ проверка правильности ввода. При ошибке - повторение ввода }

if (IOResult<>0)or(n<m)or(n>16)or(m>16)or(n<1)or(m<1)

then begin

writeln('ОШИБКА ВВОДА');

goto inp

end;

 

{реализация метода решения}

FP(n,R1);

FP(m,R2);

FP(n-m,R3);

C:=R1 div (R2*R3);

 

{ вывод результата }

writeln('Число сочетаний из ',n,' по ',m,' = ',C)

 

end.

 

Рекурсивные подпрограммы

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

Вернемся к математической модели. Для рекурсии математическая модель имеет вид:

F(0) = 1,

F(k) = 1*2*3*...*(k-2)*(k-1)*k = F(k-1) *k, для всех k>0.

Текст функции

Функция F в этом случае имеет вид:

{Рекурсивная функция F вычисляет факториал заданного целого положительного числа.

Входной параметр: параметр-значение типа byte (целое положительное число).

Параметр-результат: целое число типа longint.}

function F(k:byte):longint;

begin

if k=0

then F:=1

else F:=F(k-1)*k { при вычислении параметра-результата F

вызов функции F }

end;{function F}

Подпрограммные типы

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

Рис. 16.12. - Синтаксические диаграммы определения подпрограммных типов

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

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

Информационная модель

Таблица 16.8. Информационная модель

Назначение Имя Тип
Для накопления суммы S real
Высота трапеции (шаг интегрирования) h real
Номер трапеции (отрезка интегрирования) i integer

Текст подпрограммы

type tf=function(x:real):real;

 

function integral(f:tf;a,b:real;n:integer):real;

var h,s:real;

i:integer;

begin

h:=(b-a)/n;

S:=f(a)+f(b);

for i:=1 to n-1 do

S:=S+ 2 * f(a+i*h);

S:=S/2*h;

integral:=S

end;

Пример использования функции integral

Постановка задачи

Решим следующую задачу: определить площадь S, ограниченную параболой y=x2+1 и прямой y=3-x. Для того, чтобы получить пределы интегрирования, аналитически определим точки пересечения этих линий. Совместное решение уравнений дает пределы интегрирования от -2 до 1.

Рис. 16.15 – Графическая модель задачи

Метод решения

Решение задачи с учетом существования функции integral сводится к вычислению

S=integral(F1,-2,1,10000)-integral(F2,-2,1,10000).

Здесь применяем 10000 разбиений участка интегрирования, помня, что, чем больше количество разбиений, тем точнее вычисления. Реализация такого метода решения тривиальна.

В методе решения F1 и F2 представляют собой подпрограммы, соответствующие подынтегральными функциям. Интерфейс этих функций соответствует типу tf.

Метод решения функции F1: F1=3-x.

Метод решения функции F2: F2= x2+1.

Попутно определим требования к подпрограммам, которые являются фактическими параметрами

1. Эти подпрограммы не могут быть стандартными;

2. Их имена не могут совпадать с именами стандартных подпрограмм;

3. Подпрограммы должны быть оттранслированы с параметром «дальний вызов», так как реализация языка Паскаль требует, чтобы фактический параметр-подпрограмма имел полный адрес (сегмент и смещение) Это достигается с помощью директивы «включить дальний вызов» {$F+}

Текст программы

 

program primer;

type tf=function(x:real):real;

 

function integral(f:tf;a,b:real;n:integer):real;

var h,s:real;

i:integer;

begin

h:=(b-a)/n;

S:=f(a)+f(b);

for i:=1 to n-1 do

S:=S+ 2 * f(a+i*h);

S:=S/2*h;

integral:=S

end;

 

{$f+} {включение дальнего вызова}

 

{реализация первой подынтегральной функции}

function F1(x:real):real;

begin

F1:=3-x

end;

 

{реализация второй подынтегральной функции}

function F2(x:real):real;

begin

F2:=sqr(x)+1

end;

 

{$f-} {отключение дальнего вызова}

 

var s:real;{выходной параметр программы – площадь заштрихованной области}

begin

S:=integral(F1,-2,1,10000)-integral(F2,-2,1,10000);

writeln('Площадь=',S)

end.

16. 12. Блочная структура программ.
Области действия описаний

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

Внешний блок – это блок, в который вложена подпрограмма. Внутренний блок - сама подпрограмма. Все описания, расположенные во внешних для данной подпрограммы блоках, называются глобальными по отношению к блоку, который образует данная подпрограмма. Все описания, расположенные во внутреннем блоке называются локальными. Можно ввести понятие уровень вложенности. Если в разделе описания процедур и функций описаны две или более подпрограмм, то говорят, что эти подпрограммы одного уровня вложенности. По отношению к внешнему блоку они являются внутренними. По отношению между самими подпрограммами мы не можем использовать термины внешняя или внутренняя, так как они одного уровня вложенности. Если в разделе описания процедур и функций внешнего блока вложена подпрограмма, внутри которой в таком же разделе расположена другая подпрограмма, то мы говорим о разном уровне вложенности этих подпрограмм. Для третьего блока, представляющего собой самую внутреннюю подпрограмму, оба блока, в которые она вложена, будут внешними. Уровень вложенности этой подпрограммы 2. Для второго блока третий блок будет внутренним, а первый - внешним. Уровень вложенности второго блока 1. Для первого блока (самого внешнего) второй и третий блоки будут внутренними. Уровень вложенности первого блока 0, т.е. этот блок является основной программой.

Для примера рассмотрим структуру блоков, предложенную автором языка (рис.16.16). Здесь в седьмой раздел программы A вложены две подпрограммы B и C. В подпрограмму В вложена подпрограмма D. В свою очередь в подпрограмму D вложена подпрограмма G. В подпрограмму С вложены две подпрограммы E и F.

Рис. 16.16. - Пример блочной структуры

Разберемся со сферой действия описаний. Описания меток действуют только внутри раздела операторов блока, в котором они описаны. Все остальные описания действуют не только внутри блока, в котором они описаны, но и во всех внутренних блоках, вложенных в данный блок (вне зависимости от глубины вложенности). При этом казалось, что могут возникнуть конфликты между глобальными и локальными описаниями, так как в разных блоках одинаковыми именами могут быть поименованы разные понятия. Для того чтобы таких конфликтов не возникало, принято следующее правило - все имена, определяемые в локальных описаниях, отменяют действия совпадающих имен, описанных в глобальных описаниях. На рис. 16.17 показано расположение блоков из примера по уровням. Здесь линиями со стрелками показано действие глобальных описаний. Так в блоке G действуют описания внешних блоков D, B, A.

Рис. 16.17. - Расположение блоков по уровням и действие глобальных описаний

Особо рассмотрим доступ к подпрограммам. Любая подпрограмма может быть вызвана:

a) из раздела операторов блока, в котором она описана;

b) из раздела операторов самой себя (прямая рекурсия);

c) из раздела операторов любой внутренней подпрограммы по отношению к данной (косвенная рекурсия);

d) из раздела операторов любой подпрограммы, описанной ранее в том же блоке, где и данная подпрограмма.

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

a) любую подпрограмму, описанную в разделе подпрограмм данной;

a) саму себя (прямая рекурсия);

b) все внешние подпрограммы по отношению к данной (косвенная рекурсия);

c) подпрограммы, описанные ранее на том же уровне вложенности.

Взаимодействие блоков (подпрограмм) из примера показано на рис. 16.18.

Рис. 16.18 - Пример взаимодействия между блоками

Здесь линиями со стрелками показаны возможности вызова подпрограмм на выполнение (стрелки указывают направление вызова). Так, например, из программы А могут быть вызваны только подпрограммы В и С, которые вложены в седьмой раздел. Из подпрограммы F могут быть вызваны сама подпрограмма F (прямая рекурсия), подпрограмма С, в которую она вложена (косвенная рекурсия), и подпрограмма Е (находится на одном уровне и описана ранее). з программы А могут быть вызваны подпрограммы B и С. В таблице 16.9 для перечислены все возможные взаимодействия между блоками. Здесь основной алгоритм – блок, из которого производится вызов подпрограммы, вспомогательный алгоритм – вызываемая подпрограмма.

Таблица 16.9. Пример взаимодействия между блоками

Основные алгоритмы Вспомогательные алгоритмы
A B, C
B D, B
D G, B, D
G G, D, B
C E, F, C, B
E E,C
F F, E, C

Местоположение подпрограмм

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

2. Текст любой подпрограммы может располагаться в отдельном текстовом файле. Программисты таким файлам обычно дают расширение inc. При таком размещении текста подпрограммы в текст программы вместо текста подпрограммы включается директива компилятора «подключить файл» - {$I <имя подключаемого файла>}

3. Часто используемые подпрограммы обычно включаются в отдельный программный модуль (библиотеку подпрограмм). В этом случае в программу, которая использует подпрограмму из модуля, включается второй раздел – используемые модули:

UNIT <имя модуля>;

ПРОЦЕДУРНОЕ ПРОГРАММИРОВАНИЕ

Основные понятия парадигмы процедурного программирования

К настоящему времени сложился ряд стилей программирования - процедурное, функциональное, логическое и объектно-ориентированное. Стилю (парадигме) программирования соответствует своя собственная уникальная модель вычислений. Процедурное (императивное) программирование является отражением архитектуры традиционных ЭВМ, которая была предложена фон Нейманом в 40-х гг. Теоретической моделью процедурного программирования служит алгоритмическая система под названием "машина Тьюринга". Программа состоит из последовательности операторов, задающих те или иные действия. Основным является оператор присваивания, служащий для изменения содержимого областей памяти. Вообще концепция памяти как хранилища значений, содержимое которого может обновляться операторами программы, является фундаментальным в императивном программировании. Выполнение программы сводится к последовательному выполнению операторов с целью преобразования исходного состояния памяти (т.е. значений переменных) в заключительное. Таким образом, с точки зрения программиста имеется программа и память, причем первая последовательно обновляет содержимое последней. Процедурное программирование характеризуется

- значительной сложностью,

- необходимостью явного управления памятью, в частности необходимостью описания переменных,

- высокой эффективностью реализации на традиционных ЭВМ.



Поделиться:


Последнее изменение этой страницы: 2016-09-20; просмотров: 2287; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.141.27.244 (0.243 с.)