- •ПОДПРОГРАММЫ
- •Подпрограмма - автономно оформленный алгоритм, который может быть использован другим алгоритмом.
- •Подпрограммы необходимы:
- •Подпрограммы - результат декомпозиции задачи на подзадачи при нисходящем
- •Основной вопрос: передача данных между подпрограммой и главной программой
- •ПОДПРОГРАММЫ
- •ФОРМАЛЬНЫЕ ПАРАМЕТРЫ ПОДПРОГРАММЫ
- •ФАКТИЧЕСКИЕ ПАРАМЕТРЫ ПОДПРОГРАММЫ
- •Соответствие между формальными и фактическими параметрами
- •Замена формальных параметров на фактические (вызов)
- •Замена формальных параметров на фактические по значению
- •Замена формальных параметров на
- •Когда применять замену по адресу,
- •ПОДПРОГРАММЫ
- •ПОДПРОГРАММЫ В СИ -ФУНКЦИИ
- •ПОДПРОГРАММЫ В ПАСКАЛЕ
- •ПАСКАЛЬ: ОПИСАНИЕ ПРОЦЕДУР
- •ПАСКАЛЬ: список формальных параметров подпрограммы
- •Данные подпрограммы
- •Обращение к процедуре
- •Пример. Даны две матрицы: а из 3-х строк и 5 столбцов и b
- •Блок-схема программы
- •Передача n,m,a
- •Программа примера
- •Программа примера (продолжение)
- •Программа примера (продолжение)
- •ПАСКАЛЬ: ОПИСАНИЕ ФУНКЦИЙ
- •Пример функции
- •Обращение к функции
- •Пример. Вычислить значение У:
- •Пример программы, использующей функции
- •Пример программы, использующей функции (продолжение)
- •Пример программы, использующей функции (продолжение)
- •Пример программы, использующей функции (продолжение)
- •Глобальные и локальные имена
- •Область памяти для локальных и глобальных имен
- •Схема заполнения стэка
- •Область действия имени
- •Время жизни (существования) данных
- •Пример
Пример программы, использующей функции
program primer_2_3;
type mas=array[1..10] of real; var a,b:mas; y:real; pra:real;
function sum(var v:mas; n:integer):real; {функция вычисляет сумму первых n (n<=10) элементов массива v}
var s:real; i:integer; begin
s:=0;
for i:=1 to n do s:=s+v[i]; sum:=s;
end;{конец функции sum}
Пример программы, использующей функции (продолжение)
function pr(var v:mas; n:integer):real;
{функция вычисляет произведение первых n(n<=10) массива v}
var p:real; i:integer; begin
p:=1;
for i:=1 to n do p:=p*v[i]; pr:=p;
end; {конец функции pr}
Пример программы, использующей функции (продолжение)
procedure masin(var v:mas; n:integer);
{процедура осуществляет ввод массива v размером n (n<=10)}
var i:integer; begin
for i:=1 to n do read(v[i]); readln;
end; {конец процедуры masin};
Пример программы, использующей функции (продолжение)
BEGIN
writeln(' BBEДИТЕ МАССИВ А ИЗ 10 ЭЛЕМЕНТОВ'); masin(a,10);
writeln(' ВВЕДИТЕ МАССИВ В ИЗ 5 ЭЛЕМЕНТОВ'); masin(b,5);
pra:=pr(a,10); if pra =0 then
writeln(' ЗНАМЕНАТЕЛЬ РАВЕН НУЛЮ') else
begin y:=(sum(a,10)*(pr(b,5)+5)-sum(b,5))/pra;
writeln(' ЗНАЧЕНИЕ ВЫРАЖЕНИЯ; y=',y:9:3); end;
readln;
END.
Глобальные и локальные имена
•Глобальные имена - это имена, которые действуют на протяжении всей программы (или внешнего блока), они объявляются в соответствуюших разделах программы (или внешнего блока).
•Локальные имена - это имена, которые действуют в пределах блока подпрограммы, это внутренние имена подпрограммы.
•К локальным именам относятся формальные параметры и все имена, описанные в блоке подпрограммы. Вне блока подпрограммы локальные имена не определены.
•Локальное имя может использоваться в одном блоке, глобальные имена могут являться общими для нескольких блоков и использоваться для передачи данных между блоками.
Область памяти для локальных и глобальных имен
•В Паскале данные, описанные в блоке программы, хранятся в так называемом
статическом сегменте памяти; память под них распределяется при компиляции.
•Локальные данные подпрограммы хранятся в специальной области оперативной памяти – стеке; память под эти данные распределяется каждый раз при вызове подпрограммы и освобождается при завершении работы подпрограммы.
Схема заполнения стэка
|
|
|
Р1 |
|
Р2 |
|
Р3 |
|
ПРОГРАММА |
||||||
а) |
|
. . . |
|
. . . |
|
. . . |
|
. . . |
|
|
|
||||
|
Вызов Р1 |
|
Вызов Р2 |
|
Вызов Р3 |
|
|
|
|
. . . |
|
. . . |
|
. . . |
|
|
. . . |
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
б) |
|
|
|
Р1 |
направление заполнения стека |
Р2 |
(в сторону уменьшения адресов) |
Р3 |
|
Свободная память стека блоков |
|
(процедур и функций) |
|
|
|
а) порядок вызова подпрограмм; б) порядок заполнения стэка.
Область действия имени
•Область действия имени - это часть программы, в которой имя может быть доступно.
•Область действия локального имени - блок подпрограммы, в которой оно объявлено; глобального – весь текст программы от места объявления до последнего слова End (с точкой).
•Глобальное имя доступно в подпрограмме только в том случае, если в подпрограмме оно не объявлено еще раз.
Время жизни (существования) данных
•Время жизни – это время, в течение которого по данные распределена память.
•По времени жизни данные делятся на статические,
автоматические, динамические.
•Статические данные существуют все время выполнения программы.
•Автоматические данные существуют во время выполнения подпрограммы , в которой описаны.
•Динамические данные получают место в памяти с помощью операторов динамического распределения памяти.
•В Паскале статические данные - это глобальные данные, автоматические – локальные.
Пример
Program Primer; |
a-глобальная переменная, под нее отведена |
|
Var a,i:real; |
|
одна ячейка в статическом сегменте |
Procedure p1; |
памяти, которая доступна программе и |
|
Var i:real; |
|
процедурам р1 и р2. Под переменную с |
Begin . . . a:=...; |
именем i программы отводится ячейка |
|
i:=...; |
|
памяти статического сегмента; под |
End{p1}; |
|
переменные i процедур память в стеке |
Procedure p2; |
распределяется столько раз, сколько раз |
|
Var i:real; |
|
осуществляется вход в блок процедур (в |
Begin . . . a:=...; |
нашем примере три раза: при вызове р1 и |
|
i:=...; |
|
при каждом вызове р2); при выходе из |
End{p2}; |
|
блока (т. е. при завершении работы |
Begin |
{раздел |
процедуры) ячейка с именем i каждый раз |
действий |
|
освобождается. Так как в каждой |
программы} |
|
процедуре имеется локальное имя i, |
i:=...; a:=...; |
глобальное i программы в процедурах |
|
р1; р2; |
р2 |
недоступно. |
End. |
|
Далее слайд 19 еще раз |
|
|