
Var f: file of integer; X, kol, I: integer;
begin assign (f,'f.dat');
reset(f); seek(f,filesize(f)-1);
read(f,k); seek(f,0); kol:=0;
for i:=1 to filesize(f) do begin
read(f,x); if x>k then kol:=kol+1;
close(f); end;
writeln(kol);
end.
Вопрос №66
Текстовые файлы.
Описание; var f: text;
Над текстовыми файлами выполняются все ранее описанные операции и ряд дополнительных.
Append(f) - Процедура открывает текстовый файл для добавления в конец файла.
Settextbuf(f, buf, size) - Процедура позволяет в явном виде задать буфер ввода-вывода для текстового файла f, при этом buf - имя переменной, задающей начало буферной области. Параметр size - размер буфера в байтах. Если параметр size не указан, то размер считается равным размеру переменной buf. Процедура должна вызываться после связывания файла, но до открытия. Если эта процедура не указывается, то буфер формируется автоматически, его стандартная длина !!!!!!!!!!!!!!!!!!. В общем случае длина корректируется параметрами компилятора. Для более эффективной работы рекомендует использовать буфер в несколько килобайт.
Eoln(f) - булевская функция: возвращает значение true, если очередными символами строки являются символами конца строки(13,10 - символы в таблице ASCII).
seek eof(f) - булевская функция, возвращает true, если от текущей позиции файла до конца файла остается только ' ', или признака конца строки, или достигнут конец файла.
seekeoln(f) - булевская функция, возвращает true, если от текущей позиции до конца строки находятся пробелы или достигнут конец строки.
Вводи вывод в текстовом файле рекомендуется выполнять процедурами readln, writeln.
Пример: дан текстовый файл. Найти строчку с максимальной длиной.
Var f: text; s, s1: string; max: integer;
begin assign(f, 'f.txt'); reset(f); max:=0;
while not (seekeof(f)) do begin readln(f,s); if length(s)>max then begin max:=length(s); s1:=s; end;
writeln(s1); close(f); end.
Вопрос №67
Понятие информационной структуры.
D={d1...dn} - некоторое множество переменных, которое в общем случае может быть бесконечным.
K=[r1...rn} - множество отношений, заданных на множестве D. Тогда I=<D,R> - называется информационной структурой или структурой данных Элементы множества D называются узлами информационной структуры, каждый узел может иметь вполне определенный тип, в том числе структурированный. В разных структурах узлы могут быть разных типов.
Важным классом информационных структур являются ЛИС(линейные информационные структуры) - структуры, на узлах которых задано отношение линейного порядка. Здесь существует понятие первого и последнего узла. К ЛИС относятся массивы.
Над информационными структурами определен ряд операций:
1) Доступ к узлу ИС.
В массиве доступ осуществляется указанием индекса узла. Доступ к элементам массива может быть выполнен в любом месте программы и указанием любого индекса. Поэтому такая структура называется информационной структурой.
Различают статические и динамические структуры. В статических информационных структурах количество и состав узлов не изменяются во время существования информационной структуры. В динамических информационных структурах количество и состав могут изменяться.
Для динамических структур определены дополнительные опции:
1) Добавление и удаление узла.
2) Инициализация информационной структуры, то есть создание информационной структуры, не содержащей узлов.
Следует различать логическую организацию ИС и ее физическую реализацию средствами Pascal.
Вопрос №68
Линейные динамические информационные структуры: стек, очередь, дек.
Среди ЛДИС обычно выделяют стеки, очереди и деки.
Стек - ЛДИС, доступ к элементам которой осуществляется по принципу: последний пришел первый вышел (LIFO). Элемент, который добавляется в стек последним называется верхушкой стека. Элемент, который помещается в начало стека называется дном стека. В любой момент времени в стеке доступна только верхушка.
|
Top |
|
Bottom |
1) Добавить узел;
2) Удалить узел из стека;
3) Создать стек;
4) Стек пуст (булевская операция, возвращает true, если стек пуст и false иначе).
Стек как абстрактное количество информации имеет неограниченный объем, однако на практике используется память ограниченного объема и говорят об ограниченном стеке. Поэтому операция добавить в стек и удалить из стека являются частичными. Ситуация добавления в стек, при исчерпанной памяти называется переполнением стека.
Очередь - ЛДИС, доступ к элементам которой осуществляется по принципу: первый пришел, первый ушел (FIFO). В очереди есть элемент с указателем "начало и указателем "конец". Новый элемент добавляется в конец очереди. Удаление происходит из начала очереди.
|
|
|
|
|
нач. кон.
Операции:
1) Добавить узел в конец очереди;
2) Удалить узел из начала очереди;
3) Создать пустую очередь;
4) Очередь пуста (булевская функция, которая равна true, если очередь пуста).
Д ек - ЛДИС, которая имеет два входа и два выхода.
|
|
|
|
|
Над деком определены операции:
1) Инициализация дека.
2) Добавить узел слева.
3) Добавить узел справа.
4) Удалить узел справа.
5) Удалить узел слева.
6) Дек пуст.
Запрещением некоторых операций дека можно получить стек или очередь.
Вопрос №69
Моделирование ЛДИС средствами языка Pascal.
Моделирование стека.
В Pascalе нет специальных средств и типов данных, соответствующих стеку, очереди и деку, поэтому применяют моделирование. Используется модель данных, узел которых состоит из двух элементов: хранилище для информационной структуры и операционная составляющая (набор процедур и функций выполняющих операции над строкой данных.
Моделирование Стека:
Const max=100;
type Ind=1..max; Pnt=0..max;
Node=record
<>
end;
Stek=record
top: Pnt;
s: array[Ind] of Node; end;
procedure Stek(var st: stek); {Создание стека}
begin st.top:=0; end;
function EmptyStek(st: stek): boolean; {Стек пуст}
begin EmptyStek:=(st.top=0); end;
procedure InStek(x: Node; var st:stek); {Добавить элемент}
begin
if st.top=max then writeln('препятствие');
else begin st.top:=st.top+1;
st.s[st.top]:=x;
end;
end;
procedure OutStek (var x: Node; st: stek); {Удалить элемент}
begin
if EmptyStek(st) then writeln ('Список пуст');
else begin x:=st.s[st.top];
st.top:=st.top-1; end
end;
Вопрос №70
Моделирование очереди.
В очереди выделяют 2 указателя: начало и конец. Добавление в конец очереди, исключение из начала.
const max=100;
type Ind=1..max; Pnt=0..max; Ind1=1..max;
Node=record <любой тип из языка Pascal>... end;
Qu=record K: Pnt; N: Ind1; Q: array [Ind] of Node; end;
procedure InitQu (var Q: Qu);
begin Q.K:=0; Q.N:=Q; end;
function EmptyQu(Q: Qu): boolean;
begin EmptyQu:=(Q.k=0) and (Q.N); end;
procedure InQu (x: Node; var Q1: Qu);
var l: Ind;
begin if (Q1.K=max) and (Q1.N=min) then writeln('Очередь переполнена')
else if Q1.K=max then begin for i:=1 to max-N+1 do begin
Q1.Q[i]:=Q1.Q[i-N+1];
k:=max-N+1; end;
Q1.K:=Q1.K+1;
Q1.Q[Q1.K]:=x; end;
end;
procedure OutQu(var x:Node; Q1: Qu);
begin
if EmptyQu(Q1) then writeln ('Очередь пуста')
else begin x:=Q1.Q[Q1.N];
Q1.N:=Q1.N+1; end;
end;
Вопрос №71
Кольцевой буфер.
При помещении элементов в очередь необходимо перемещать все элементы в начало очереди. В среднем приходится перемещать max/2 элементов. Операции, которые выполняются над всеми узлами информационной структуры называются массовыми. Массовая операция для своего выполнения может потребовать значительного времени. Например, если узлы имеют сложную структуру.
В
о
избежание работы с массовыми операциями
можно модифицировать структуру данных.
В нашем случае будем использовать
кольцевой буфер.
|
|
|
|
|
нач. кон. нач. кон.
В структуру очереди добавим поле, хранящее количество элементов в очереди.
const max=100;
type Ind=1..max; Pnt=0..max;
Node=record...end;
KQu=record N,K,Kol: Pnt;
Q: array[Ind] of Node; end;
procedure InitQ(var Q1: Qu);
begin Q1.N:=0; Q1.K:=0; Q1.kol:=0; end;
Для добавления элемента в кольцевой буфер определим функцию sled, которая по заданному номеру определяет номер следующего элемента кольцевого буфера.
function Sled(nom: Ind; m: word): Ind;
begin if nom<m then Sled:=nom+1
else Sled:=1; end;
procedure InQu(x: Node; var Q1: Qu);
begin if Q1.Kol=max then writeln ('Переполнение')
else begin Q.K:=sled(Q1.K,max); Q1.Q[Q1.K]:=x; Q1.Kol:=Q1.Kol+1; end;
end;
function EmptyQu(Q: Qu): boolean;
begin EmptyQu:=(Q.k=Q.N); end;
procedure OutQu(var x:Node; Q1: Qu);
begin
if EmptyQu(Q1) then writeln ('Очередь пуста')
else begin x:=Q1.Q[Q1.N];
Q1.N:=sled(Q1.N,max);
Q1.Kol:=Q1.kol-1; end;
end;
Вопрос №72
Реализация двух однотипных стеков
2 информационных структуры называются однотипными, если совпадают типы их узлов. Пусть в некоторой программе необходимо использовать 2 однотипных стека, причем известно, что суммарное количество их узлов не превышает N.
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
Кроме того количество узлов первого стека не превосходит константы max1, а количество узлов второго стека не превосходит max2 и max1+max2>N. В такой ситуации в качестве структуры данных удобно зарезервировать 1 массив размерностью N, дно первого стека будет совпадать с началом массива, а дно второго с концом массива. Стеки будут расти навстречу друг другу.
|
|
|
|
|
|
|
|
|
|
Const N=100;
Type Ind=1..N; Pnt=0..N+1;
stek=record top1, top2: Pnt; s: array[Ind] of Node; end;
procedure InitSt(var St: stek);
begin St.top1=0; St.top2=N+1; end;
procedure InSt(x: Node; var st: stek);
begin if St.top1=st.top2 then writeln ('Переполнен')
else begin st.top1=st.top1+1; st.s[s.top1]:=x; end;
end;
function EmptySt(st: stek): boolean; {Стек пуст}
begin EmptySt:=((st.top1=0) and (st.top2=N+1)); end;
procedure OutSt (var x: Node; st: stek); {Удалить элемент}
begin