Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Архив1 / docx53 / Моя записка.docx
Скачиваний:
25
Добавлен:
01.08.2013
Размер:
268.7 Кб
Скачать

1.4 Результаты тестирования

Результат поиска абонента приведен на рисунке 1.

Рисунок 1 – Поиск абонента

Рис 1.

1.5 Оформление

В данной задаче так же используется графический интерфейс. За оформления отвечают дополнительные процедуры, такие как CHOSE, command и другие.

Рис 2.

2 Задача №2.20

2.1 Постановка задачи и ее анализ

Задание:

Элементы стека – вещественные числа. Описать процедуру или функцию, которая: a) вычисляет среднее арифметическое всех элементов стека; b) удаляет из стека элементы со значением меньшим среднего арифметического.

Сперва создадим вспомогательную программу для создания файла вещественных чисел.

Затем пишем процедуру для занесения информация с файла в стек.

И в завершении пишем процедуры для решения данной задачи.

2.2 Описание структур данных

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

type stack=^st;

st=record;

data: real;

next:stack;

end;

Структура содержит информационное поле data(хранит вещественные числа), а также поля next– указатели на следующий элемент стека.

2.3 Проектирование программы

В основной программе вначале напишем процедуру занесения данных в стек:

procedure create_stack(var u: stack; el: real);

var x: stack;

begin

new(x);

x^.data:=el;

x^.next:=u;

u:=x;

end;

Затем создадим две процедуры для решения данной задачи:

procedure arifm_stack(u:stack);

begin

k:=0;

sum:=0;

kol:=0;

while u<>nil do

begin

inc(k);

kol:=kol+1;

sum:=sum+u^.data;

u:=u^.next;

end;

c:=sum/kol;

writeln('Среднеарифмитическое стека:',c:3:3);

end;

procedure itog;

Begin

while stack1<>nil do

begin

p:=stack1;

if stack1^.data>=c then

create_stack(u,p^.data);

stack1:=stack1^.next;

delete(p);

end;

end;

И мы должны вывести итог выполнения этих процедур, с чем нам поможет процедура print_stack:

procedure print_stack(u:stack);

begin

k:=0;

while u<>nil do

begin

inc(k);

writeln ('-->',u^.data);

u:=u^.next;

end;

end;

2.4 Результаты тестирования

На рисунке 3 изображено всё решение задачи

Рис 3.

3 Задача №3.13

3.1 Постановка задачи и ее анализ

Задание:

Вершины АВЛ–дерева – вещественные числа. Описать процедуру или функцию, которая: a) вычисляет среднее арифметическое всех вершин дерева; b) добавляет в дерево вершину со значением, вычисленным в предыдущей процедуре (функции).

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

3.2 Описание структур данных

В данной программе необходимо реализовать АВЛ дерево. Описание его структуры представлено ниже:

type

PTree = ^AVLTree;

AVLTree = record

balancefactor:shortint;

key:real;

left,right:PTree;

end;

Структура содержит информационное поле key, а также поля left и right – левый правый сыновья. Для удобства создаем также дополнительное поле хранящее баланс дерева.

3.3 Проектирование программы

Для решения поставленной задачи необходимы следующие процедуры : AVLInsert, Sredn, graphOUT.

Рассмотрим одну из процедур.

AVLInsert –добавление элемента в дерево.

procedure AVLInsert(var Tree:PTree;x:real;var need_balance:boolean);

var

need_balance_cur:boolean;

begin

need_balance_cur:=false;

if Tree=nil then

begin

Tree:=NewNode(x);

need_balance:=true;

end

else

if x<Tree^.key then

begin

AVLInsert(Tree^.left,x,need_balance_cur);

if need_balance_cur then

begin

if (tree^.balanceFactor = leftheavy) then // если вставили слева от узла уже перевешивающего влево

UpdateLeftTree(tree, need_balance) // выполняем перебалансировку

else if (tree^.balanceFactor = balanced) then //Если вставили слева от балансированного узла

begin

tree^.balanceFactor := leftheavy; //значит теперь перевес ушел влево

need_balance := true; // значит на уровень выше придётся выполнить перебалансировку

end

else // если вствили новый узел слева, и при этому у текущего узла был перевес вправо, текущий узел стал сбалансированным

begin

tree^.balanceFactor := balanced;

need_balance :=false;

end;

end

else

// перебалансировка не требуется. не опрашивать предыдущие узлы

need_balance := false;

end

else

if x>Tree^.key then

begin

AVLInsert(Tree^.right,x,need_balance_cur);

if need_balance_cur then

begin

if (tree^.balanceFactor = rightheavy) then // если вставили справа от узла уже перевешивающего вправо

UpdateRightTree(tree, need_balance) // выполняем перебалансировку

else if (tree^.balanceFactor = balanced) then //Если вставили справа от балансированного узла

begin

tree^.balanceFactor := rightheavy; //значит теперь перевес ушел влево

need_balance := true; // значит на уровень выше придётся выполнить перебалансировку

end

else // если вствили новый узел справа, и при этому у текущего узла был перевес влево, текущий узел стал сбалансированным

begin

tree^.balanceFactor := balanced;

need_balance :=false;

end;

end

else

// перебалансировка не требуется. не опрашивать предыдущие узлы

need_balance := false;

end;

end;

Соседние файлы в папке docx53