Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка_Delphi_Ч2.doc
Скачиваний:
15
Добавлен:
02.11.2018
Размер:
1.7 Mб
Скачать

Поиск записи в отсортированном файле

Для поиска записи в упорядоченном файле можно метод дихотомии, который рассматривался при поиске в упорядоченном массиве.

function findPosInSortFile(fam: TName; var f: TAttFile): integer;

var pos, left, right: integer; r: TAttRec;

begin

result := -1; // Если элемент не будет найден

//Начальные значения левой и правой границ

left := 0; right := FileSize(f)-1;;

while left <= right do begin //Ищем, пока left не правее right

// Находим индекс середины массива

pos := (right+left)div 2;

seek(f, pos);

read(f, r);

if fam = r.Name then begin

//Элемент найден, и мы выходим из подпрограммы

result := pos;

exit;

end;

if fam < r.Name

then right := pos – 1 // Будем искать левее

else left := pos+1; // Будем искать правее

end;

end;

Добавление записи в отсортированный файл

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

//Добавить запись в отсортированный файл

procedure addToSortFile(var f:TAttFile; r:TAttRec);

var pos:integer; rf:TAttRec;

begin

//Начинаем с конца файла

pos:= fileSize(f);

repeat //Повторяем пока не найдем, куда вставить

pos:=pos-1;

if pos = -1 then break; // значит надо вставлять в начало

//Сдвигаем очередную запись на одну позицию вниз

seek(f, pos);

read(f, rf);

write(f, rf);

until rf.name < r.name;

// Нашли место для вставки

seek(f,pos+1);

write(f,r);

end;

Удаление записи из отсортированного файла

В процедуре удаления записи из файла используется функция поиска позиции искомой записи в файле. После определения позиции, все записи, начиная со следующей за найденной и до самой последней, сдвигаются на одну позицию в сторону начала файла. После этого последняя запись обрезается.

//Удалить запись из отсортированного файла

procedure delFromSortFile(var f: TAttFile; fam: TName);

var pos: integer; rf: TAttRec;

begin

// Ищем позицию записи с заданной фамилией

pos := findPosInSortFile(fam, f);

if pos < 0 then begin

showMessage(fam+' не найдено');

exit;

end;

//Сдвигаем все записи начиная со следующей за найденной

while pos < fileSize(f) - 1 do begin

pos:=pos + 1;

seek(f, pos);

read(f, rf);

seek(f, pos-1);

write(f, rf);

end;

// Обрезаем последнюю запись

seek(f, fileSize(f) - 1);

truncate(f);

end;

      1. Процедуры реализации пунктов меню sortMenu Реализация пункта меню «Сортировка файла по фамилиям»

Наличие описанной выше процедуры сортировки файла позволяет достаточно просто реализовать эту функцию меню.

//Вызов сортировки по фамилиям

procedure TfrmAtt.mnuSortFamClick(Sender: TObject);

var f:TAttFile;

begin

openAttFile(f);

sortAttFile(f);

showFileInGrid(f, StringGrid3);

CloseFile(f);

end;