- •Естественный язык
- •Описание символов
- •Алгоритмический язык
- •Лекция 2. Введение в языки программирования
- •Языки программирования низкого уровня
- •Языки программирования высокого уровня
- •Компоновщик
- •Лекция 3. Основы программирования на языке Паскаль
- •Логические операции
- •Оператор безусловного перехода
- •Составной оператор
- •Тип-диапазон
- •Примеры
- •Лекция 8. Массивы
- •Объявление массива
- •Многомерные массивы
- •Операции над массивами
- •Динамические массивы
- •Лекция 9. Подпрограммы
- •Процедуры
- •Функции
- •Параметры
- •Рекурсия
- •Лекция 11. Записи
- •Пример использования записей
- •Лекция 12. Множества
- •Процедуры include и exclude
- •Лекция 13. Файлы
- •Инициация файла
- •Приложение А
|
П.П.Кудрявцев. Курс лекций по дисциплине: "Информатика и программирование" |
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