В отличие от функций, использующих в качестве аргументов только параметры-значения, не изменяющиеся после выхода из функции, процедуры в качестве выходных (вычисляемых) параметров используют параметры-переменные. Любые операции над формальными параметрами-переменными внутри процедуры выполняются и над соответствующими фактическими параметрами-переменными. Поэтому формальному параметру-переменной должна соответствовать фактическая переменная, а не константа или выражение. В заголовке процедуры выходные параметры-переменные перечисляются в скобках после слова Var с указанием своего типа, причем для каждого нового типа это слово должно повторяться.
В остальном структура процедуры не отличается от структуры программы на Паскале и может включать в себя следующие разделы:
· описания меток Label
· определения констант Const
· определения типов Type
· описания переменных Var
· описания процедур и функций Function, Procedure
· операторов процедуры Begin … End;
Переменные, описанные в разделе Var процедуры или указанные в ее заголовке, считаются локальными, все остальные – глобальными. Локальные переменные существуют только в процедуре, в которой они описаны, и после выхода из процедуры исчезают.
Пример: описать процедуру, обменивающую значениями две переменных целого типа:
Procedure Swap(x, y: Integer);x и y – входные параметры-значения
Var temp: Integer; temp – локальная переменная
temp := x; реализация алгоритма
x := y; циклического обмена
y := temp;
Эта процедура ничего не делает: в списке формальных параметров указаны параметры-значения. Правильное описание с использованием параметров-переменных:
Procedure Swap(Var x, y: Integer);x и y – входные параметры-
Var temp: Integer; переменные
temp := x;
x := y;
y := temp;
Обращение к процедуре в вызывающей программе производится по ее имени, за которым в скобках перечисляются фактические параметры, соответствующие формальным параметрам процедуры по количеству, типам и порядку следования:
Var a, b: Integer; a и b – переменные основной программы (глобальные)
Procedure Swap(Var x, y: Integer);x и y – входные параметры-
Var temp: Integer; переменные
temp := x;
x := y;
y := temp;
a := 3;
b := 5;
Swap(a, b); обращение к процедуре
WriteLn(‘a=’,a);
WriteLn(‘b=’,b);
На экран будет выведено:
a=5
b=3
Правила построения и использования процедур не отличаются от правил построения и использования функций, в том числе и относительно рекурсии.
Как уже отмечалось в правилах формирования подпрограмм-функций, для передачи в подпрограмму массива необходимо предварительно определить его в разделе описания типов, то есть явно задать количество его элементов и их тип. Значит, подпрограмма, формальным параметром которой является массив из десяти чисел, не сможет работать с массивом из пятнадцати чисел. Это неудобно, поэтому в списке формальных параметров подпрограмм разрешается определять открытые массивы.
Открытые массивы – это вектора, состоящие из элементов любого типа, кроме файлового. На место открытого массива в качестве фактического параметра можно передавать вектор любого размера, состоящий из элементов того же типа, что и элементы открытого массива:
Procedure Summ(a: Array Of Integer; Var summa: Integer);
Var i: Word;
For i:=0 To High(a) Do нумерация элементов начинается с нуля!
s:= s + a[i]; номер последнего элемента определяетсяс
summa:= s; помощью функции High
Передавать открытый массив можно как значение, переменную или константу. Поскольку тип индексов массива не указывается, используется соглашение, по которому эти элементы нумеруются с нуля. Номер последнего элемента в массиве можно определить с помощью функции High.
Примеры: задать целочисленный вектор a длиной n элементов случайным образом с элементами от m_min до m_max..
1. Определить минимальный min и максимальный max элементы вектора и их индексы i_min, i_max. Результаты сохранить в текстовом файле out_min_max.txt:
Const n = 10; размер вектора
m_min = -50; диапазон значений
m_max = 50; элементов вектора
Type TVector = Array [1..n] Of Integer;
Var i, i_min, i_max: Word;
min, max: Integer;
a : TVector;
out_min_max: Text; файловая переменная
Procedure Init(elem_min, elem_max: Integer; Var Vector: Array Of Integer); используется открытый массив Vector
Var i: Word;
Randomize; запуск генератора случайных чисел
For i:=0 To High(Vector) Do задание элементов массива случайными числамив диапазоне от elem_min до elem_max
Procedure Min_max(m: Word; vector: TVector; Var min, max: Integer; Var i_min, i_max: Word); используется массив vector типаTVector
Var i: Word;
min:=vector[1]; перед поиском минимального и максимального элементов
max:=vector[1]; массива за таковые принимается первый элемент i_min:=1; массива
i_max:=1;
For i:=2 To m Do поиск начинаем со второго элемента
If (vector[i] < min) Then
min:=vector[i];
i_min:=i;
If (vector[i] > max) Then
max:=vector[i];
i_max:=i;
Assign(out_min_max,’d:\User\out_min_max.txt’);
ReWrite(out_min_max); открытие текстового файла для записи
Init(m_min, m_max, a); инициализация массива
Writeln(out_min_max, ‘Исходный вектор:’);
For i:=1 To n Do
Write(out_min_max, a[i]:5);
Min_max(n, a, min, max, i_min, i_max); поиск элементов массива
WriteLn(out_min_max, ‘min=’, min);
WriteLn(out_min_max, ‘i_min=’, i_min);
WriteLn(out_min_max, ‘max=’, max);
WriteLn(out_min_max, ‘i_max=’, i_max);
Close(out_min_max); закрытие текстового файла
Результат работы программы:
Исходный вектор:
-1 -19 -19 -35 50 26 -47 17 1 -7
min=-47
i_min=7
max=50
i_max=5
2. Отсортировать элементы массива методом простого выбора: в массиве отыскивается минимальный элемент и меняется с первым элементом массива, из оставшихся элементов снова находится минимальный и меняется со вторым элементом, и так далее. Последний, самый большой элемент, сам станет на свое место. Результаты сохранить в текстовом файле out_sort.txt:
Const n = 10; размер массива
m_min = -50; диапазон значений
m_max = 50; элементов массива
Type TVector = Array [1..n] Of Integer;
Var i: Word;
a : TVector;
out_sort: Text; файловая переменная
Procedure Init(m: Word; elem_min, elem_max: Integer; Var vector: TVector);
Var i: Word;
Randomize; запуск генератора случайных чисел
For i:=1 To m Do задание элементов массива случайными числами в диапазоне от elem_min до elem_max
Procedure Sort_vybor(m: Word; Var vector: TVector);
Var i, j, k: Word;
temp: Integer;
For i := 1 To m-1 Do
temp := vector[i];
For j := i + 1 To m Do
If (vector[j] < temp) Then
temp := vector[j];
vector[k] := vector[i];
vector[i] := temp;
Assign(out_sort,’d:\User\out_sort.txt’);
ReWrite(out_sort); открытие текстового файла для записи
Init(n, m_min, m_max, a); инициализация массива
Writeln(out_sort, ‘Исходный вектор:’);
For i:=1 To n Do
Write(out_sort, a[i]:5);
Sort_vybor(n, a); сортировка элементов массива
Writeln(out_sort, ‘Отсортированный вектор:’);
For i:=1 To n Do
Write(out_sort, a[i]:5);
Close(out_sort); закрытие текстового файла
Результат работы программы:
Исходный вектор:
-15 -31 12 -10 50 -27 36 -29 2 5
Отсортированный вектор:
-31 -29 -27 -15 -10 2 5 12 36 50
3. Отсортировать элементы массива методом простого обмена (методом пузырька): сравниваются попарно два очередных рядом стоящих элемента и при необходимости переставляются по возрастанию. После первого прохода массива его максимальный элемент становится на последнее место, после второго прохода максимальный из оставшихся становится на предпоследнее место и так далее. Таким образом, после каждого очередного прохода по массиву максимальный элемент из оставшихся как бы всплывает наверх – к концу массива. Всего необходимо n – 1 прохода. Результаты сохранить в текстовом файле out_sort.txt:
Const n = 10; размер массива
m_min = -100; диапазон значений
m_max = 100; элементов массива
Type TVector = Array [1..n] Of Integer;
Var i: Word;
a : TVector;
out_sort: Text; файловая переменная
Procedure Init(m: Word; elem_min, elem_max: Integer; Var vector: TVector);
Var i: Word;
Randomize; запуск генератора случайных чисел
For i:=1 To m Do задание элементов массива случайными числами в диапазоне от elem_min до elem_max
Procedure Sort_obmen(m: Word; Var vector: TVector);
Var i, j, k: Word;
temp: Integer;
For i := m DownTo 2 Do
For j := 1 To i – 1 Do
If (vector[j] > vector[j+1]) Then
temp := vector[j];
vector[j] := vector[j+1];
vector[j+1]:= temp;
Assign(out_sort,’d:\User\out_sort.txt’);
ReWrite(out_sort); открытие текстового файла для записи
Init(n, m_min, m_max, a); инициализация массива
Writeln(out_sort, ‘Исходный вектор:’);
For i:=1 To n Do
Write(out_sort, a[i]:5);
Sort_obmen(n, a); сортировка элементов массива
Writeln(out_sort, ‘Отсортированный вектор:’);
For i:=1 To n Do
Write(out_sort, a[i]:5);
Close(out_sort); закрытие текстового файла
Результат работы программы:
Исходный вектор:
Отсортированный вектор:
-72 -69 -32 -19 -14 9 24 47 58 97
4. Отсортировать элементы массива методом простых вставок: в уже отсортированной части элементов массива a1, a2, a3,…,ak отыскивается место для следующего элемента ak+1 . Результаты сохранить в текстовом файле out_sort.txt:
Const n = 10; размер массива
m_min = -150; диапазон значений
m_max = 150; элементов массива
Type TVector = Array [1..n] Of Integer;
Var i: Word;
a : TVector;
out_sort: Text; файловая переменная
Procedure Init(m: Word; elem_min, elem_max: Integer; Var vector: TVector);
Var i: Word;
Randomize; запуск генератора случайных чисел
For i:=1 To m Do задание элементов массива случайными числами в диапазоне от elem_min до elem_max
Procedure Sort_vstavka(m: Word; Var vector: TVector);
Var i, j, k: Word;
temp: Integer;
For i := 2 To m Do
temp := vector[i];
j := i – 1;
While (j > 0) Do
If (vector[i] > vector[j]) Then
k := j + 1;
Else j := j – 1;
For j := i DownTo k + 1 Do
vector[j] := vector[j - 1];
vector[k] := temp;
Assign(out_sort,’d:\User\out_sort.txt’);
ReWrite(out_sort); открытие текстового файла для записи
Init(n, m_min, m_max, a); инициализация массива
Writeln(out_sort, ‘Исходный вектор:’);
For i:=1 To n Do
Write(out_sort, a[i]:5);
Sort_vstavka(n, a); сортировка элементов массива
Writeln(out_sort, ‘Отсортированный вектор:’);
For i:=1 To n Do
Write(out_sort, a[i]:5);
Close(out_sort); закрытие текстового файла
End. Результат работы программы:
Исходный вектор:
Отсортированный вектор:
-72 -63 -45 -39 20 44 75 91 115 138
5. Отсортировать элементы массива методом быстрой сортировки К.Хоара: сравниваются элементы ai и aj , причем i = 1, j = n. Если ai < aj , то эти элементы уже отсортированы по возрастанию, поэтому значение правого индекса уменьшается на единицу, и алгоритм повторяется. Если ai > aj , то они меняются местами, останавливается правый индекс, и начинает увеличиваться левый. Обмен значениями с изменением направления движения после каждого обмена продолжается до тех пор, пока левый и правый индексы не встретятся друг с другом: i = j. В этом случае элемент ai будет стоять на своем месте в массиве: слева от него стоят элементы меньше его, а справа – больше. После этого алгоритм рекурсивно повторяется для левой и правой частей массива. Результаты сохранить в текстовом файле out_sort.txt:
Const n = 10; размер массива
m_min = -100; диапазон значений
m_max = 100; элементов массива
Type TVector = Array [1..n] Of Integer;
Var i: Word;
a : TVector;
out_sort: Text; файловая переменная
Procedure Init(m: Word; elem_min, elem_max: Integer; Var vector: TVector);
Var i: Word;
Randomize; запуск генератора случайных чисел
For i:=1 To m Do задание элементов массива случайными числами в диапазоне от elem_min до elem_max