Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование(лекции).pdf
Скачиваний:
183
Добавлен:
14.02.2015
Размер:
1.89 Mб
Скачать

 

П.П.Кудрявцев. Курс лекций по дисциплине: "Информатика и программирование"

SetLength(A, 5);

{Установка размера массива А

 

(5 элементов) }

А[0] := 1;

{Присвоение значения 1 элементу

 

массива А с номером 0 }

end.

 

Переменные-динамические массивы являются указателями и операции с ними производятся как с указателями. Например, при присвоении одного массива другому элементы одного массива не копируются во второй, а копируется адрес массива. Соответственно, сравнение двух массивов в логических выражениях типа «равно не равно» производится сравнением адресов. Пример присвоения одного массива другому :

program UsingDynamicArrays2; var

А, В: array of integer;

 

{Описание двух переменных —

 

динамических массивов целочисленных

 

элементов}

begin

 

SetLength(A, 5);

{ Установка размера массива А

 

(5 элементов ) }

А[0] := 14;

{Присвоение значения 14 нулевому

 

элементу массива А}

В := А;

{Присвоение массива А массиву В, теперь

 

переменные А и В указывают на один и

 

тот же массив}

В[0] := 2;

{Присвоение нулевому элементу массива В

 

значения 2, теперь нулевой элемент

 

массива А также имеет значение 2}

end.

 

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

Лекция 9. Подпрограммы

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

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

38

Лекция 9. Подпрограммы

функции.

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

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

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

Процедуры

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

Описание процедуры:

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

<тело процедуры>; end;

Обращение к процедуре производится в форме оператора процедуры:

<имя процедуры> (<список фактических параметров>);

Программа 1 - Процедура нахождения НОД program NOD;

var

a, b, c: integer;

procedure Evklid(n, m: integer; var k: integer); begin

while m<>n do if m>n then

m := m — n else

n := n — m; k := m;

end;

39

П.П.Кудрявцев. Курс лекций по дисциплине: "Информатика и программирование"

begin write('a='); readln(a); write('b='); readln(b); Evklid(a, b, c);

writeln('НОД=', c); readln;

end;

Функции

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

Описание функции:

function <имя функции> (<список формальных параметров>): <тип функции>; begin

<тело функции>; end;

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

<имя функции> (<список фактических параметров>);

Программа 2 - Функция нахождения НОД program NOD;

var

a, b, c: integer;

function Evklid(n, m: integer): integer; begin

while m<>n do if m>n then

m := m — n else

n := n — m; Evklid := m;

end; begin

write('a=');

readln(a);

40

Лекция 9. Подпрограммы

write('b=');

readln(b);

writeln('НОД=', Evklid(a, b)); readln;

end;

Параме тры

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

procedure SB(a: real; b: integer; c: char);

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

function F(a: real; b: real): real; function F(a, b: real): real;

Список формальных параметров рассматривается как своеобразное расширение раздела описаний: все переменные из этого списка могут использоваться в любых выражениях внутри подпрограммы.

Любой из формальных параметров подпрограммы может быть: параметром-значением, параметром-переменной, параметром-константой.

Если параметры определяются как параметры-переменные, перед ними необходимо ставить зарезервированное слово var, а если это параметры-константы, - const, например:

procedure MyProcedure(var a: real; b: real; const c: string);

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

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

В случае параметра-константы в подпрограмму также передается адрес области памяти, в которой располагается переменная или вычисленное значение. Однако блокируются любые присваивания параметру-константе нового значения в теле подпрограммы.

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

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

41