Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Организация работы с файлами прямого доступаСодержание книги Похожие статьи вашей тематики
Поиск на нашем сайте
Файлы прямого доступа характерны тем, что в любой момент времени можно получить доступ к любому существующему компоненту файла - связать буфер файла с любым существующим компонентом файла. Все компоненты файла прямого доступа автоматически пронумерованы, начиная с 0. Номер компонента файла типа longint, т.е. теоретически в файле прямого доступа может быть свыше 2 млн. компонентов (правда, пока таких внешних устройств не существует). В файлах прямого доступа читать можно любой существующий компонент файла, а записывать в файл можно либо на место любого существующего компонента, либо в конец файла. С файлами прямого доступа можно работать в двух режимах: - работа с существующим файлом прямого доступа. Открывается режим с помощью процедуры reset(<имя логического файла>). Попытка открыть этот режим для несуществующего файла приводит к ошибке ввода-вывода; - создание нового файла прямого доступа. Открывается режим с помощью процедуры rewrite(<имя логического файла>). Если до открытия в этом режиме файл существовал, то информация в нем уничтожается. При работе с файлами прямого доступа можно использовать следующие процедуры и функции (во всех нижеприведенных подпрограммах f – это имя логического файла): - procedure write(var f:<имя файлового типа>; r:<тип компонента файла>) - процедура записи в текущий компонент файла значения выражения, указанного при обращении к процедуре. После выполнения процедуры записи буфер файла связывается со следующим по порядку компонентом файла. Если до выполнения процедуры текущим компонентом был конец файла, то, после выполнения записи на место этого признака, в следующий компонент файла запишется признак конца файла, и буфер свяжется с этим признаком. - procedure read(var f:<имя файлового типа>;var r:<тип компонента файла>) - процедура чтения текущего компонента файла. Прочитанное из текущего компонента значение помещается в переменную, указанную при обращении к процедуре. Текущий компонент файла - это тот компонент, с которым связан буфер файла. После выполнения процедуры чтения буфер файла связывается со следующим по порядку компонентом файла. Выполнение процедуры возможно только в том случае, если текущий компонент не является признаком конец файла. Если буфер связан с этим признаком, то при выполнении процедуры происходит ошибка ввода-вывода; - function eof(var f:<имя файлового типа>):Boolean – с помощью этой функции можно проверить связан ли буфер с признаком конец файла. Если результат true, то буфер связан с этим признаком, если – false, то буфер не связан с признаком конец файла, а находится на каком-то существующем компоненте файла; - procedure seek(var f:<имя файлового типа>; n:longint) - процедура установки на n-ый компонент файла прямого доступа f. При выполнении процедуры буфер файла связывается с n-ым компонентом, если такой компонент существует. В случае, если файл содержит меньшее количество компонентов, произойдет ошибка ввода-вывода (в этом случае при включенной системе прерываний по вводу-выводу программа снимется с решения); - procedure reset(var f:<имя файлового типа>) - процедура установки на начало файла - буфер связывается с первым компонентом файла. Обращения seek(f,0) и reset(f) в процессе работы с файлом прямого доступа эквивалентны; - procedure truncate(var f:<имя файлового типа>) - усекает файл, начиная с текущей позиции. После выполнения процедуры в текущую позицию, с которой был связан буфер, будет записан признак конца файла; - function filepos(var f:<имя файлового типа>):longint - функция определения текущей позиции файла; - function filesize(var f:<имя файлового типа>):longint -функция определения количества компонентов в файле (признак конца файла не учитывается). Алгоритм сортировки файла прямого доступа Сортировка файла методом пузырька (обменная сортировка) Спецификация подпрограммы
Таблица 24.1. Перечень параметров
Метод решения Так как в файле прямого доступа все существующие компоненты пронумерованы (то есть проиндексированы), то для сортировки файла прямого доступа можно использовать любой метод сортировки массива. Используем обменную сортировку с флагом, известную под названием метод "пузырька". При этом для сокращения количества переборов будем просматривать только неупорядоченную часть. 1. Связываем логический и физический файлы assign(f,name); 2. Открываем для работы файл прямого доступа в режиме работы с существующим файлом reset(f); 3. Определяем размер не отсортированной части файла (перед началом сортировки это все существующие компоненты файла) nkz:=filesize(f); 4. Повторяем просмотр не отсортированной части элементов до выполнения условия до выполнения условия – при очередном переборе элементов перестановки не было (признак отсутствия перестановки – флаг flag при отсутствии перестановки имеет значение ложь, а при наличии – значение истина) повторять <просмотр не отсортированной части файла> до При просмотре не отсортированной части выполняются следующие действия: а) признаку перестановки при начале очередного перебора присваивается значение ложь (нет перестановки) flag:=false; b) перебираются все элементы не отсортированной части c начального по предпоследний. Начальный элемент имеет порядковый номер 0; предпоследний элемент – nkz-2 (минус два, т.к. нумерация не с единицы, а с нуля) Для каждого номера элемента i выполняются следующие действия b.1) буфер файла связывается с текущим элементом seek(f,i); b.2) читаются текущий и следующий элементы файла read(f,r1,r2). Компилятор, обрабатывая такое обращение к процедуре чтения из файла, преобразует его в эквивалентный составной оператор begin read(f,r1); read(f,r2) end; b.3) при сортировки по убыванию, если следующий элемент больше текущего (при сортировки по возрастанию, если меньше), то буфер файла связывается с текущим компонентом; записывается в файл следующее значение, а затем текущее; формируется признак наличия перестановки (флагу перестановки присваивается истина) Компилятор, обрабатывая обращение к процедуре записи в файл, преобразует его в эквивалентный составной оператор begin write(f,r2); write(f,r1) end; c) так как в правую часть файла переместился отсортированный элемент, то размер не отсортированной части уменьшается на единицу nkz:=nkz-1; 5. Закрываем файл для работы close(f). Информационная модель Таблица 24.2. Информационная модель
Программная модель
type tf=file of integer;
procedure sortpuz(name:string); var f:tf; i,nkz:longint; r1,r2:integer; flag:boolean;
begin assign(f,name); reset(f); nkz:=filesize(f); repeat flag:=false; for i:=0 to nkz-2 do begin seek(f,i); read(f,r1,r2); if r2>r1 then begin seek(f,i); write(f,r2,r1); flag:=true end end; nkz:=nkz-1 until not flag; close(f); end;
|
|||||||||||||||||||||||||||||||||||
Последнее изменение этой страницы: 2016-06-26; просмотров: 961; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.221.240.14 (0.006 с.) |