
- •Лабораторная работа № 3
- •3.1.1.Глобальные данные
- •3.1.2 Способы передачи параметров
- •3.1.3 Функции
- •3.1.4. Процедуры
- •3.1.5. Передача массивов в качестве параметров
- •3.1.6. Рекурсивные подпрограммы
- •3.2 Модули
- •Interface {интерфейс модуля}
- •Implementation {реализация }
- •3.3. Массивы
- •3.4. Компоненты StringGrid и Memo
- •Ход работы
- •Контрольные вопросы.
3.1.4. Процедуры
Формат спецификации процедуры:
procedure <имя>(<список формальных параметров>);
Входные параметры (аргументы) процедуры передаются значением или по адресу, а выходные параметры (результаты) - по адресу.
Вызов процедуры - это отдельный оператор, который содержит имя процедуры и список фактических параметров. Например:
P(x); {это вызов процедуры P(x)}
В качестве примера использования процедуры рассмотрим описание и использование той же самой подпрограммы power. В этом случае, наряду с аргументами base и exponent, которые передаются по значению, необходимо
добавить в спецификацию процедуры выходной параметр (результат), который должен быть передан по ссылке (в примере это pow).
procedure power( base, exponent: real; var pow: real);
begin
pow:= exp( exponent * ln(base));
end;
Пример вызова процедуры power:
power(3, 4, j);
writeln(j);
3.1.5. Передача массивов в качестве параметров
В качестве примера будем использовать подпрограмму вычисления суммы значений элементов одномерного массива.
Формальные параметры как массивы с фиксированными размерами
В данном примере для описания типов параметров используется заранее определенный тип massiv с фиксированной размерностью.
uses crt; const N=3;
type massiv = array[1..N] of integer;
function sum_1( x: massiv ): integer;
var i : integer; sum: integer;
begin sum:= 0;
for i:= 1 to N do sum:= sum+x[i];
sum_1:= sum;
end;
var {main - главная программа } i:integer; a:massiv;
begin clrscr;
writeln('massiv a');
for i:=1 to N do readln(a[i]); writeln('summa= ', sum_1(a));
end.
3.1.6. Рекурсивные подпрограммы
Слово рекурсия происходит от латинского слова «recursio» - возвращение.
В программирование рекурсия означает, что подпрограмма обращается сама к себе непосредственно или через цепочку вызовов других подпрограмм.
Известными рекурсивными подпрограммами являются вычисление факториала (рисунок 3.5), решение задачи о Ханойских башнях, быстрая сортировка К.Хоара, подпрограммы работы с динамическими структурами данных, подпрограммы построения фракталов и многие другие.
Рисунок 3.5 -Рекурсивная подпрограмма вычисления 3!
Главные требования к организации рекурсивной подпрограммы следующие:
рекурсивная подпрограмма имеет хотя бы один параметр
рекурсивная подпрограмма всегда содержит условие завершения рекурсии и, если это условие не выполняется, подпрограмма вызывает сама себя с изменением значения параметра.
3.2 Модули
Д. Парнас (David Parnas) определил модуль как программный объект с собственной моделью данных и собственным набором операций. Доступ к данным модуля возможен только через имеющиеся в нем операции.
Понятие модуля, как программного компонента, используемого для создания программ и программных систем, тесно связано с такими понятиями разработки программных средств как абстракция и сокрытие информации.
Суть абстракции состоит в выделении существенных свойств с игнорированием второстепенных деталей. По мере декомпозиции программной системы на модули каждый из них становится частью абстракции на соответствующем уровне.
«Сокрытием информации (information hiding) называют приемы, благодаря которым одни программы маскируют информацию, получаемую из других программ. Программа может скрывать детали реализации, такие как алгоритмы и данные, благодаря чему, в случае, если их необходимо изменить, другие программы, от них зависящие, не придется переписывать. Программы, скрывающие информацию, взаимодействуют друг с другом через общедоступные интерфейсы. Главное достоинство сокрытия информации заключается в увеличении независимости программ друг от друга» [David Parnas, «On the Criteria to Be Used in Decomposing Systems into Modules»].
Достоинством информационной закрытости является возможность осуществить:
Независимую разработку программных средств несколькими программистами
Легкую модификацию программной системы, так как можно производить изменения одного модуля независимо от других.
Главные части модуля - интерфейс и реализация (рисунок .):
Каждый модуль компилируется независимо от других компонент программы. Имя файла с исходным текстом модуля и название модуля должны совпадать.
Для того чтобы включить модуль в программу на языке Pascal, необходимо указать имя модуля в предложении uses.
Формат подключения модулей: uses список имен модулей>;
Структура модуля в языке Pascal:
unit <имя модуля >;