- •Содержание
- •1 Задача №1.46
- •1.1 Постановка задачи и ее анализ
- •1.2 Описание структур данных
- •1.3 Проектирование программы
- •1.4 Результаты тестирования
- •2.4 Результаты тестирования
- •3.4 Результаты тестирования
- •4 Задача 4.7
- •4.1 Постановка задачи и ее анализ
- •4.2 Описание алгоритма
- •4.3 Проектирование программы
- •4.4 Результаты тестирования
- •Список использованных источников
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;
