Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

If (str)

Begin

Begin

Begin

Begin

115 -45 20 -39 91 75 44 138 -72 -63

End.

Begin

End

Begin

Begin

Begin

Begin

47 -14 58 -69 9 -19 -72 24 97 -32

End.

Begin

Begin

Begin

Begin

End.

Begin

Begin

Begin

Begin

Begin

End.

Begin

Begin

Begin

Begin

Begin

Begin

Begin

End.

Begin

Begin

Begin

Begin

Begin

WriteLn(‘Группа ИС-09’);

WriteLn(‘Студент Иванов Иван’);

End;

В отличие от функций, использующих в качестве аргументов только параметры-значения, не изменяющиеся после выхода их функции, процедуры в качестве выходных (вычисляемых) параметров используют параметры - переменные. Любые операции над формальными параметрами-переменными внутри процедуры выполняются и над соответствующими фактическими параметрами-переменными. Поэтому формальному параметру-переменной должна соответствовать фактическая переменная, а не константа или выражение. В заголовке процедуры выходные параметры-переменные перечисляются в скобках после слова 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;

End;

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

Procedure Swap(Var x, y: Integer);x и y – входные параметры-

Var temp: Integer; переменные

temp:= x;

x:= y;

y:= temp;

End;

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

Program Primer;

Uses CRT;

Var a, b: Integer; a и b – переменные основной программы (глобальные)

Procedure Swap(Var x, y: Integer);x и y – входные параметры-

Var temp: Integer; переменные

temp:= x;

x:= y;

y:= temp;

End;

ClrScr;

a:= 3;

b:= 5;

Swap(a, b); обращение к процедуре

WriteLn(‘a=’,a);

WriteLn(‘b=’,b);

ReadLn;

На экран будет выведено:

a=5

b=3

Правила построения и использования процедур не отличаются от правил построения и использования функций, в том числе и относительно рекурсии.

Как уже отмечалось в правилах формирования подпрограмм-функций, для передачи в подпрограмму массива необходимо предварительно определить его в разделе описания типов, то есть явно задать количество его элементов и их тип. Значит, подпрограмма, формальным параметром которой является массив из десяти чисел, не сможет работать с массивом из пятнадцати чисел. Это неудобно, поэтому в списке формальных параметров подпрограмм разрешается определять открытые массивы.

Открытые массивы – это вектора, состоящие из элементов любого типа, кроме файлового. На место открытого массива в качестве фактического параметра можно передавать вектор любого размера, состоящий из элементов того же типа, что и элементы открытого массива:

Procedure Summ(a: Array Of Integer; Var summa: Integer);

Var i: Word;

s: Integer;

s:= 0;

For i:=0 To High(a) Do нумерация элементов начинается с нуля!

s:= s + a[i]; номер последнего элемента определяется с

summa:= s; помощью функции High

End;

Передавать открытый массив можно как значение, переменную или константу. Поскольку тип индексов массива не указывается, используется соглашение, по которому эго элементы нумеруются с нуля. Номер последнего элемента в массиве можно определить с помощью функции High.

Примеры: задать целочисленный вектор a длиной n элементов случайным образом с элементами от m_min до m_max..

1. Определить минимальный min и максимальный max элементы вектора и их индексы i_min, i_max. Результаты сохранить в текстовом файле out_min_max.txt:

 

Program Primer_1;

Uses CRT;

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

Vector[i]:=elem_max - Random(elem_max - elem_min +1);

End;

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;

End;

If (vector[i] > max) Then

max:=vector[i];

i_max:=i;

End;

End;

End;

ClrScr;

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);

WriteLn(out_min_max);

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); закрытие текстового файла

ReadLn;

Результат работы программы:

Исходный вектор:

-1 -19 -19 -35 50 26 -47 17 1 -7

min=-47

i_min=7

max=50

i_max=5

2. Отсортировать элементы массива методом простого выбора: в массиве отыскивается минимальный элемент и меняется с первым элементом массива, из оставшихся элементов снова находится минимальный и меняется со вторым элементом, и так далее. Последний, самый большой элемент, сам станет на свое место. Результаты сохранить в текстовом файле out_sort.txt:

Program Primer_2;

Uses CRT;

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

vector[i]:=elem_max - Random(elem_max - elem_min +1);

End;

Procedure Sort_vybor(m: Word; Var vector: TVector);

Var i, j, k: Word;

temp: Integer;

For i:= 1 To m-1 Do

k:= i;

temp:= vector[i];

For j:= i + 1 To m Do

If (vector[j] < temp) Then

temp:= vector[j];

k:= j;

End;

vector[k]:= vector[i];

vector[i]:= temp;

End;

End;

ClrScr;

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);

WriteLn(out_sort);

Sort_vybor(n, a); сортировка элементов массива

Writeln(out_sort, ‘Отсортированный вектор:’);

For i:=1 To n Do

Write(out_sort, a[i]:5);

WriteLn(out_sort);

Close(out_sort); закрытие текстового файла

ReadLn;

 

Результат работы программы:

Исходный вектор:

-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:

 

Program Primer_3;

Uses CRT;

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

vector[i]:=elem_max - Random(elem_max - elem_min +1);

End;

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;

End;

End;

ClrScr;

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);

WriteLn(out_sort);

Sort_obmen(n, a); сортировка элементов массива

Writeln(out_sort, ‘Отсортированный вектор:’);

For i:=1 To n Do

Write(out_sort, a[i]:5);

WriteLn(out_sort);

Close(out_sort); закрытие текстового файла

ReadLn;

Результат работы программы:

Исходный вектор:

Отсортированный вектор:

-72 -69 -32 -19 -14 9 24 47 58 97

4. Отсортировать элементы массива методом простых вставок: в уже отсортированной части элементов массива a1, a2, a3,…,ak отыскивается место для следующего элемента ak+1. Результаты сохранить в текстовом файле out_sort.txt:

Program Primer_4;

Uses CRT;

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

vector[i]:=elem_max - Random(elem_max - elem_min +1);

End;

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;

k:= 1;

While (j > 0) Do

If (vector[i] > vector[j]) Then

k:= j + 1;

j:= 0;

Else j:= j – 1;

For j:= i DownTo k + 1 Do

vector[j]:= vector[j - 1];

vector[k]:= temp;

End;

End;

ClrScr;

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);

WriteLn(out_sort);

Sort_vstavka(n, a); сортировка элементов массива

Writeln(out_sort, ‘Отсортированный вектор:’);

For i:=1 To n Do

Write(out_sort, a[i]:5);

WriteLn(out_sort);

Close(out_sort); закрытие текстового файла

ReadLn;

Результат работы программы:

Исходный вектор:

Отсортированный вектор:

-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:

Program Primer_6;

Uses CRT;

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

vector[i]:=elem_max - Random(elem_max - elem_min +1);

End;

Procedure Sort_Hoar(m, bottom, top: Word; Var vector: TVector);

Var i, j: Word;

Str: Boolean;

temp: Integer;

i:= bottom;

j:= top;

str:= False;

While (i < j) Do

If (vector[i] > vector[j]) Then

temp:= vector[i];

vector[i]:= vector[j];

vector[j]:= temp;

str:= Not(str);

End; {If}

Then i:= i + 1

Else j:= j – 1;

End; {While}

If (i > 1) And ((i – 1) > bottom)

Then Sort_Hoar(m, bottom, i – 1, vector);

If (j < (m – 1)) And ((j + 1) < top)

Then Sort_Hoar(m, j + 1, top, vector);

End;

 

<== предыдущая лекция | следующая лекция ==>
Процедуры | Программные модули
Поделиться с друзьями:


Дата добавления: 2014-01-06; Просмотров: 307; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.146 сек.