III. Информационная модель




Таблица 18.3. Информационная модель

Назначение Имя Тип
Индекс формируемого места i integer
Экстремальное значение Extr real
Индекс экстремального значения Nm integer
Индекс при поиске экстремального значения j integer

V. Программная модель

Procedure SORTVP (var A:TM; n:integer; pr:oolean);

Var i:integer; { текущий индекс }

Extr:real; { экстремальное значение }

Nm:integer; { номер места }

j:integer; { индекс при поиске экстремального значения }

Begin

if n>t then Halt; { проверка на соответсвие кол-ва элементов заданной }

{ размерности массива }

{ формируем все элементы с первого по предпоследний }

for i:=1 to n-1 do { для каждого формируемого места }

begin

{ поиск экстремального значения и его места с i по n }

extr:=A[i];

nm:=i;

for j:=i+1 to n do

if pr and (a[j]<extr) or not pr and (a[j]>extr) then

begin

extr:=A[j];

nm:=j;

end; { *примечание см. после текста программы }

{перестановка}

A[nm]:=A[i];

A[i]:=extr;

end;

End;

 

*Примечание.

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

Мы поставили первым в исполнительной части процедуры условный оператор

if n>t then Halt;

Это было сделано для того чтобы осуществить проверку выхода за границу массива когда задано n>t. Это способ самый постой, используя системную процедуру Halt мы, при возникновении ошибки, снимаем программу с исполнения. Но это не лучший способ с точки зрения структурного программирования.

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

If n>t then

begin

rez:=FALSE;

exit

end;

rez:=TRUE

Exit – стандартная процедура TP обеспечивающая завершение блока, который выполняется (у нас процедура SORTVP).

2-ой метод сортировки “Обменная сортировка с флагом”
(метод "пузырька")

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

Проиллюстрируем это примером (рис. 18.12).

 

Рис. 18.12. – Обменная сортировка с флагом

Обратите внимание, что после очередного просмотра в правую часть массива перемещается необходимое значение (поэтому этот метод называется "метод пузырька")

Разработка подпрограммы

I. Спецификация

1. Назначение: сортировка одномерного массива вещественных чисел по возрастанию или по убыванию методом пузырька

2. Имя: SORTPUZ

3. Вид: процедура

4. Перечень параметров:

Таблица 18.4. Перечень параметров

Статус Назначение Имя Тип Вид
Вход/выход сортируемый массив A TM параметр-переменная
Вход количество элементов в массиве n integer параметр-значение
Вход признак сортировки (true – сортировка по возрастанию; false – по убыванию) pr boolean параметр-значение
Выход признак успешности выполнения (true – успешно, false – нет) rez boolean параметр-переменная

Const t = число < 65535/6;

Type TM = array[1..t] of real;

5. Заголовок подпрограммы:

Procedure SORTPUZ (var A:TM; n:integer; pr:boolean; var rez:boolean);

II. Метод решения

1) Если количество сортируемых элементов больше. чем число элементов в массиве, то формируется признак невозможности решения задачи и осуществляется выход из процедуры

Если n > t

2) Так как сортировать можно, то выходному признаку успеха выполнения сортировки присваивается значение истина

rez:=true

3) Повторять просмотр массива до выполнения условия – при очередном просмотре перестановки не было (признак перестановки pp по окончанию просмотра имеет значение false)

повторять

<просмотр массива>

до

4) Просмотр массива заключается в следующем

4.1) перед началом перебора элементов признаку перестановки присваивается значение "перестановки пока нет"

pp:=false;

4.2) Перебираются все элементы массива с первого по предпоследний

" i:= 1.. n-1:

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

Если pr Ai >Ai+1 Ai <Ai+1



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2016-08-08 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: