- •Структура программы на Паскале.
- •Стандартные типы Паскаля.
- •Операторы в Паскале.
- •Цикл с параметром.
- •Типовые задачи на операторов цикла.
- •Операторы целочисленного деления.
- •Вложенные циклы.
- •Структурированные типы данных.
- •Массивы.
- •Многомерные массивы.
- •Строки.
- •Множества.
- •Записи.
- •Работа с текстовыми файлами.
- •Особенности работы с текстовым файлом:
- •Типизированные файлы.
- •Особенности работа с типизированными файлами.
- •Подпрограммы.
- •Структура подпрограмм.
- •1. Заголовок
- •2. Описательная часть
- •3. Тело подпрограммы
- •Оформление формальных параметров, которые определяет режим взаимодействия с основной программой.
- •Особенности передачи структурированных данных подпрограммы.
- •Опережающие описания.
- •Функциональный тип. Процедурный тип.
- •Сортировки.
- •Сортировка бинарными включениями.
- •Сортировка простых выборов.
- •Сортировки простым обменом.
- •Шейкер-сортировка.
- •Сортировка Шелла.
- •Модули.
- •Структура модуля.
- •Особенности компиляции программ с подключаемыми модулями.
- •Циклические ссылки модулей друг на друга.
- •Стандартные модули в Паскале.
- •Динамические переменные.
- •Динамические структуры.
- •Однонаправленные списки.
- •Формирование списков. Формирование очереди.
- •Формирование стека.
- •Классическое формирование очереди (по Вирту).
- •Работа со списками.
- •1) Проход по списку;
- •2) Добавление элемента в список;
- •Удаление элемента из списка.
- •«Древовидные структуры»
- •Удаление элемента из дерева
- •Самоупорядочивающийся список
- •Частотный словарь
- •Нерекурсивное формирование дерева
Удаление элемента из списка.
Аналогично добавлению при удалении рассматривается три случая:
Примечание. Все рассматриваемые ниже алгоритмы физически из памяти элементы не удаляют. Они удаляются только из списка.
1) Удаление первого элемента списка просто-напросто в адрес начала списка записываем адрес второго элемента:
n:=n^.next;
2) Удаление элемента, стоящего за элементом, обозначенным ключом
а) считаем, что начало списка – адрес «n»;
б) передвигаем указатель «p» на ключевой элемент;
в) в адресное поле ключевого элемента записываем адресное поле удаляемого элемента, удаляем элемент из списка.
p:=n;
while (p^.inf < > x) and (p < > nil) do
p:=p^.next;
p^.next:=p^.next^.next;
3) Удаление элемента, стоящего перед элементом, обозначенным ключом
удаление в этом случае, так же, как и при добавлении элемента, сводится к первому-второму случаю, только рассматривается не первый элемент, как в пункте 1), а второй. Отличается только условие прохождения по циклу.
if n^.next^.inf=x then
n:=n^.next
else
begin
p:=n;
while (p^.next^.next^.inf < > x) and (p < > nil) do
p:=p^.next;
if p < > nil then p^.next:=p^.next^.next;
Примечание. Особое внимание обратить на то, что в некоторых задачах ключом списка является адрес элемента списка, а в некоторых – информационная часть, т.е. содержимое списка.
Пример. Из файла целых чисел сформировать очередь, затем в ней поменять местами минимальный и максимальный элементы.
type sp=^el;
el=record
inf:integer;
next:sp;
end;
var f:file of integer;
b,min,max:integer;
n,p,q,amin,amax:sp;
begin
assign(f,’dat’);
reset(f);
read(f,b);
new(p);p^.inf:=b;
p^.next:=nil;
n:=p;
repeat
read(f,b);
new(q);
q^.inf:=b;
q^.next:=nil;
p^.next:=q;
p:=q;
until eof(f);
close(f);
max:=n^.inf;
min:=n^.inf;
amin:=n;
amax:=n;
while p < > nil do
begin
if max < p^.inf then
begin
max:=p^.inf;
amax:=p;
end;
if min > p^.inf then
begin
min:=p^.inf;
amin:=p;
end;
p:=p^.next;
end;
amin^.inf:=max;
amax^.inf:=min;
p:=n;
while p < > nil do
begin write (p^.inf,’ ‘);
p:=p^.next;
end;end.
Пример. Задан текстовый файл. Вывести слова в обратном порядке. Использовать строковую структуру – стек. Данная структура позволит за один проход по файлу достигнуть желаемого результата.
type sp=^el;
el=record
inf:string;
next:sp;
end;
var n,q,p:sp;
t:text;
zp:set of char;
c:char; st:string;
begin assign (t,’text.txt’);
reset(f);
p:=nil;
zp:=[‘.’,’,’,’:’];
repeat
st:=’’;
read(t,c);
while (not(c in zp)) and (not eof(f)) and (not eoln(f)) do
begin
st:=st+c;
read(t,c);
end;
if eoln(t) then readln(t);
if sp< >’’ then begin
new(q);
q^.inf:=st;
q^.next:=p;
p:=q;
end;
until eof(t);
n:=p;
while p < >nil do
begin writeln (p^.inf);
p:=p^.next;
end;end.
«Древовидные структуры»
Древовидная динамическая структура содержит несколько адресов на точно такие же элементы, по этому при организации такой структуры наблюдается «ветвление».
Если адресных поля два то такое дерево называется бинарным. В общем случае можно считать список вырожденным деревом. Элементы образующие дерево называется узлами.
В бинарном дереве элемент адрес которого расположен выше называется потомком.
По наличию потомков все узлы бинарного дерева делятся на три вида:
1.Узел адрес которого является адресом начала дерева называется корнем.
2.Если элемент дерева имеет хотя бы одного потомка то это просто узел.
3.Если узел не имеет ни одного потомка, то он называется листом.
Дерево считается сбалансированным если относительно любого узла количества элементов в правом и левом поддереве равны.
В сбалансированном левостороннем дереве количество элементов левого и правого поддерева находятся в следующем соотношении:
nl = ndw2
nr = n – nl – 1
n – общее количество элементов поддерева начиная с анализируемого узла.
Упорядоченным деревом является дерево ветви которого упорядочены по следующему принципу: значение узла должно быть больше всех элементов левого поддерева и меньше всех элементов правого поддерева.
Будем рассматривать рекурсивное формирование бинарного сбалансированного дерева с заранее количеством элементов.
При построении дерева будем использовать левостороннюю ориентацию, т.е первоначально будем формировать левую ветвь, а из «остатков» правую.
Программа, содержащая функцию формирования дерева и процедуру вывода элементов дерева слева на право.
type ref =^el;
el=record
key:integer;
l,r:ref; end;
var n:integer;
root:ref;
FUNCTION TRE(n:integer):ref;
var newnode:ref;
x, nl, nr: integer;
begin
if n=0 then tree:=nil
else begin nl:=ndw2;
nr:=n-nl-1;
read(x); new(newnode);
with newnode^ do begin
key:=x;
l:=tree(nl);
r:=tree(nr); end; end;
tree:=newnode:
end;
PROCEDURE PRINTTREE(t:ref;h:integer);
Var i:integer;
begin
if t< >nil then
with t^ do begin printtree(l,h+1);
for i:=1 to h do write(‘ ‘);
writeln(key);
printtree(r,h+1);end; end;
begin readln(n);
root:=tree(n);
printtree(root,0); end.
Дерево формула- это дерево в узлах которого находятся символы арифметических действий, а в листьях расположены символы обозначающие операнды.