- •Структура программы на Паскале.
- •Стандартные типы Паскаля.
- •Операторы в Паскале.
- •Цикл с параметром.
- •Типовые задачи на операторов цикла.
- •Операторы целочисленного деления.
- •Вложенные циклы.
- •Структурированные типы данных.
- •Массивы.
- •Многомерные массивы.
- •Строки.
- •Множества.
- •Записи.
- •Работа с текстовыми файлами.
- •Особенности работы с текстовым файлом:
- •Типизированные файлы.
- •Особенности работа с типизированными файлами.
- •Подпрограммы.
- •Структура подпрограмм.
- •1. Заголовок
- •2. Описательная часть
- •3. Тело подпрограммы
- •Оформление формальных параметров, которые определяет режим взаимодействия с основной программой.
- •Особенности передачи структурированных данных подпрограммы.
- •Опережающие описания.
- •Функциональный тип. Процедурный тип.
- •Сортировки.
- •Сортировка бинарными включениями.
- •Сортировка простых выборов.
- •Сортировки простым обменом.
- •Шейкер-сортировка.
- •Сортировка Шелла.
- •Модули.
- •Структура модуля.
- •Особенности компиляции программ с подключаемыми модулями.
- •Циклические ссылки модулей друг на друга.
- •Стандартные модули в Паскале.
- •Динамические переменные.
- •Динамические структуры.
- •Однонаправленные списки.
- •Формирование списков. Формирование очереди.
- •Формирование стека.
- •Классическое формирование очереди (по Вирту).
- •Работа со списками.
- •1) Проход по списку;
- •2) Добавление элемента в список;
- •Удаление элемента из списка.
- •«Древовидные структуры»
- •Удаление элемента из дерева
- •Самоупорядочивающийся список
- •Частотный словарь
- •Нерекурсивное формирование дерева
Структура подпрограмм.
Подпрограммы реализуются в виде процедуры или функции.
Процедура – набор операторов, который выполняется в соответствии с реализуемым алгоритмом в процедуре. Причем при вызове процедуры управление передается первому оператору процедуры, затем выполняется алгоритм тела процедуры. После выполнения последнего оператора тела процедуры управление передается следующему оператору в основной программе, который следует за вызовом процедуры.
Функция - набор операторов, алгоритм реализуемый функции которой должен «вычислять» одно значение, которое при вызове функции возвращается на место вызова.
1. Заголовок
PROCEDURE<имя под-мы>(список формальных переменных):ТВЗ
FUNCTION<имя под-мы>(список формальных переменных):ТВЗ
2. Описательная часть
Оформляется по тем же правилам, что и описательная часть основной программы.
3. Тело подпрограммы
BEGIN
Операторы
END;
Примечание. В теле функции имени функции присваивается то значение, которое будет передаваться на место ее вызова, т.е. получается, что тип возврата значения, который указывается в заголовке функции, определяет в теле функции имя функции как переменную этого типа.
Оформление формальных параметров, которые определяет режим взаимодействия с основной программой.
Существует два режима взаимодействия глобальных переменных, подставленных на место формальных переменных, с основной программой. Эти режимы определяет описание формальной переменной. Формальной переменной называется параметр-значение или параметр-переменная. Формальная переменная описывается в круглых скобках в заголовке по правилам раздела var описательной части программы. Если описание переменной начинается со слова var, то она является параметром-переменной. Определение параметра-переменной заканчивается, как только встречается «;» после var. Если var нет, то определяется параметр-значение.
Если определяется режим параметра-переменной, то изменения глобальной переменной, подставленной на место параметра-переменной, будут фиксироваться в основной программе, т.е. подпрограмма будет работать с ячейкой памяти непосредственно, которая выделена под эту глобальную переменную.
Режим параметра-значения реализуется по более сложной схеме: глобальная переменная, которая подставляется на место такой формальной переменной, не участвует в «вычислениях». Для успешной работы подпрограммы в режиме параметра-значения в блоке данных подпрограммы создается образ этой глобальной переменной. Все изменения фиксируются в образе. Так как блок данных локальных переменных исчезает после завершения работы подпрограммы, то автоматически значение глобальной переменной, подставленной в режиме параметра-значения, «возвращает» то значение, которое было до вызова подпрограммы.
var a,b:integer;
procedure izm(var c:integer; d:integer);
begin
c:=0;d:=0;
writeln (c,d);{0 0}
end;
begin a:=1;b:=1;
writeln(a,b); {1 1}
izm (a,b);
writeln(a,b); {0 1}
end.
Примечание. Считается, что все входящие переменные передаются в режиме параметра-значения, а все выходящие – в режиме параметра-паременной.
Пример.
var a,z,r1,r2:real;
m:integer;
procedure step(c:real;s:integer;var r:real);
var p:integer;
begin r:=1;
for p:=1 to s do
r:=r*c;
end;
begin writeln (‘…’);
read(a,m);
step(a,5,r1);
step(a,m,r2);
z:=(r1+1/r1)/(2*r2);
writeln(z:0:2);
end.
z=(R1+1/R1)/(2*R2)
Примечание. Если проанализовать условие задачи, то видно, что подпрограмма в основной программе должна возвращать всего лишь одно значение, поэтому в качестве подпрограммы целесообразней использовать функцию.
var a,z:real;
m:integer;
function stepf (c:real;s:integer):real;
var p:integer;r:real;
begin r:=1;
for p:=1 to s do
r:=r*c; stepf:=r;
end;
begin read(a,m);
z:=(stepf(a,5)+1/stepf(a,5))/(2*stepf(a,m));
writeln(z:0:2);
end.
Пример. Вычислить y=fact(m)/(fact(5)*fact(2+n))
var y:real;
m,n:integer;
function fact(r:integer):integer;
var f,p:integer;
begin f:=1;
for p:=1 to r do
f:=f*p; fact:=f; end;
begin writeln(‘Введите m и n’)ж
readln(m,n);
y:=fact(m)/(fact(5)*fact(2+n));
writeln(y:0:2);
end.
Т.к. имя функции используется как переменная, то ее можно использовать в теле функции многократно. Например, написать логическую функцию, которая определяет, есть ли в последовательности числа Фибоначчи.
Пример. Последовательность составить не меньше, чем из трех чисел. Числа Фибоначчи – числа из ряда, значение числа равно сумме двух предыдущих из ряда. Окончание ввода – «0».
function fb:boolean;
var a,b,c:integer;
begin writeln (‘Введите три числа’);
readln (a,b,c);
fb:=false;
repeat
if a+b=c then fb:=true;
a:=b; b:=c;
writeln (‘Введите следующее число’);
readln (c);
until c=0;
end.
Имя функции можно использовать только в качестве переменной, которой присваивается какое-либо значение. Особенность компилятора – реализация механизма рекурсии. Рекурсивные подпрограммы – подпрограммы, которые в своем теле вызывают сами себя. Правила оформления такого вызова аналогично правилам вызова подпрограммы в целом. Т.е. имя функции может встречаться и в выражениях. Механизм рекурсии – это циклический процесс, при котором каждый шаг связан с вызовом подпрограммы, формальный параметр которой будет изменяться. Причем механизм рекурсии реализован таким образом, что как только выполняется условие выхода из рекурсии или нарушается условие входа в рекурсию, то компилятор возвращается на предыдущий шаг. Т.е. как только появляется конкретное значение в рекурсивном цикле, рекурсия автоматически сворачивается до ее первого шага. Поэтому тела рекурсивных подпрограмм содержат условный оператор. Операторов циклов в рекурсивной подпрограмме чаще всего не бывает, т.к. рекурсия и есть цикл. Традиционно тело функции состоит из полного условного оператора. Условие – это условие выхода из рекурсии. В ветви положительному имени рекурсивной функции присваивается начальное/конечное значение рекурсивного процесса. А в ветви «иначе» есть оператор присвоения, в выражении которого есть вызов самой этой функции.
Процедура содержит в теле неполный условный оператор, условие в котором есть условие входа в рекурсию, а в ветви есть вызов самой этой процедуры. Т.к. чаще всего рекурсивно реализуется процесс «наполнения», то в процедуре используется либо параметр-переменная для этого накопления, либо глобальная переменная.
Пример. Решить процедурную задачу с использование рекурсивной функции. Текст самой программы отличаться не будет. Отличаться будет только функция.
function fr(r:integer):integer;
begin
if r<1 then
fr:=1 else fr:=5*fr(r-1);
end;
Пример. Реализовать рекурсивную функцию возвращения любого числа в любую целую степень.
function step (x:real;n:integer):real;
begin
if n=0 then step:=1
else if n<0 then step:=1/step(x,abs(n));
else step:=x*step(x,n-1);
end;
Примечание. Первое условие в теле рекурсивной функции – условие выхода из рекурсии, поэтому в данной функции вычисление степени не бесконечно.