Тема №7. Подпрограммы:формальные и фактические параметры, вызов. Понятие указателя. Распределение памяти. Процедуры и функции. Параметры значения, параметры переменные, передача структурных переменных. Области действия переменных. Опережающее описание. Использование подпрограмм при решении поисковых задач и задач аналитической геометрии. Передача динамических массивов в подпрограммы. Процедурный тип. Модули.

При проектировании сложных систем используют 2 подхода: Алгоритмическую или объектно-ориентированную декомпозицию( разбиение). 1 — подпрограммы, 2 — объекты (средства).

Основные характеристики сложных систем.

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

Каждая подпрограмма представляет собой решение отдельной подзадачи. При разработке подпрограммы: 1) нужно выделить, что является входными параметрами, а что выходными. Входные, выходные и имя — интерфейс подпрограммы, через который она взаимодействует с основной программой. Подпрограмма пишется так, что входные параметры считаются ей известными (их больше не надо вводить), а выходные — являются результатом её работы.

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

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

Описание подпрограммы общее для всех языков.

<заг. п/п>::=<кл. Cлово> <имя п/п> ([<входные, выходные параметры>]);

Заголовок процедур и функций:

Procedure <имя процедуры> [(список формальных параметров)]; [дерективы компилятора]

Function <имя функции> [(список формальных параметров)]:<тип рез-та>; [дер. комп.]

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

Рассмотрим распределение памяти: память под основные переменные выделяется в сегменте данных, память под переменные подпрограмм выделяется в стэке в момент вызова.

Стэк : ( лок. Переменнные| Входные параметры|Выходные)

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

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

Подпрограммы в Delphi реализуются процедурами и функциями. Предполагают, что входные параметры известны. Их значения передаются при вызове. Параметра передаются соотв. передаче по ссылке. Перед выходными параметрами ставится ключевое слово Var.

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

Передача в процедуру структурированных переменных (массивов, матриц)

  1. В этом случае действует соотношение: тип структурированной переменной должен быть объявлен заранее ( определён выше). Т.е. Для передачи массива или матрицы необходимо иметь описание типа.

  2. При передаче статических массивов и матриц необходимо передать реальное количество элементов (n).

Описание подпрограмм в блоках и области видимости имён.

Действует правило — доступно или видимо то, что описано выше. То, что описано ниже — не видимо. Имена подпрограмм действуют в блоке их охватывающих. Аналогично для имён типов.

Испоьзование опережающего описания. Выносим заголовки всех подпрограмм в самы верхний уровень их описания(после заголовка пишем слово Forward;).

Forward;

Каждая подпрограмма може вызвать любую ( как в С++). В Delphi допустимо вложение подпрограмм, но это не целесообразно.


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

Тип возвращаемой переменной — простая переменная или указатель. Через указатель возвращается структурированная переменная.

Блок — раздел описания, раздел операторов.

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

Result Использование этой переменной лучше чем 1-й вариант, т.к. она может использоваться в качестве переменной в выражении. А имя функции может быть только в левой части.

Вызов функции: RS:=Sr_Rast(x,y,n);

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

Procedure SetLength (Var s,n:integer); {выделение памяти под динамическую переменную}

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

Текущее количество компонент в массиве определяется стандартной функцией

Function Length (s):integer;

  1. Описание типов в динамических массивах и матрицах.

  2. Тип индекса не определяется. Тип индекса изменяется от 0 до верхней границы, которая определена функцией длины. А длина определяется из задания в процедуре выделения памяти.

Array of array of <тип компонентов>;


Программа для создания динамических массивов и матриц.

Type T_matr_din_1 = array of array of real;

T_matr_din_2 = array of real;

Var a:T_matr_din_1; b:T_matr_din_2;

i,j,n,m:integer;

begin

readln(n);

SetLength(b,n);

for i:=0 to length(b)-1 do

read(b[i]);

readln;

end;


setlength(a,n,n);

for i:=0 to length(a)-1 do

for j:=0 to length(a[i])-1 do

read(a[i,j]);

Подпрограммы ввода и вывода дин. матрицы.

Procedure Vvod (Var a:T_matr_din_2; n:integer);

var i,j:integer;

begin

setlength(a,n,n);

For i:=0 to length (a) -1 do

for j:=0 to length(a[i])-1 do

read(a[i,j]);

readln;

end;

Procedure Vivod (Var a:T_matr_din_2);

var i,j:integer;

begin

setlength(a,n,n);

For i:=0 to length (a) -1 do

begin

for j:=0 to length(a[i])-1 do

write(a[i,j]:8:3);

writeln;

end;

end;

Vvod(c,s);

Vvod(d,10);

Понятие указателя.

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

Адреса и указатели

Оперативная память — совокупность ячеек для хранения информации(байтов).Каждый байт имеет номер(адрес).

Указатель — переменная, которая в своём значении содержит адрес 1-го байта памяти, по которому заключены данные, все адреса зад. Совокупностью 2-х 16 разрядных слов( сегмент и смещение).

Сегмент — участок памяти(64 к) и начинается с физического адреса кратного 16.

Указатель = сегмент + смещение.

Адрес = сегмент*16+смещение.

16б — параграф

Сегментнай адрес с точностью до параграфа, смещение с точностью до байта.

Type <имя сегментного типа>=^<имя базового типа>;

New(x); ~ GetMem();

Dispose(x); ~ FreeMem();

для типизир. указателей для нетипизир.указателей.

1)Объявление

2)Выделение памяти

3)Занесение информации


Случайные файлы

Файл
4939-1.rtf
123654.rtf
70778.rtf
93277.rtf
23130-1.rtf




Чтобы не видеть здесь видео-рекламу достаточно стать зарегистрированным пользователем.
Чтобы не видеть никакую рекламу на сайте, нужно стать VIP-пользователем.
Это можно сделать совершенно бесплатно. Читайте подробности тут.