ПРОЦЕДУРЫ И ФУНКЦИИ ДЛЯ РАБОТЫ С ФАЙЛАМИ И КАТАЛОГАМИ

ЗАДАЧА №1

СТРУКТУРИРОВАННЫЕ ТИПЫ ДАННЫХ. ФАЙЛЫ. РАБОТА С ТИПИЗИРОВАННЫМИ ФАЙЛАМИ

СТРУКТУРИРОВАННЫЙ ТИП ДАННЫХ - ФАЙЛОВЫЙ

ФАЙЛ

- именованная область внешней памяти или логическое устройство – потенциальный источник или приемник информации (с точки зрения программы).

- набор однотипных элементов, длина которого ограничивается только объемом внешней памяти (с точки зрения структурированного типа данных).

ВИДЫ ФАЙЛОВЫХ ПЕРЕМЕННЫХ И ИХ ОПИСАНИЕ:

Ø ТИПИЗИРОВАННЫЕ ФАЙЛЫ

- компоненты фиксированной длины указанного при описании типа, что позволяет осуществить прямой доступ к компонентам. Описание:

VAR <ИМЯ1>: FILE OF <ТИП>;

Где <ТИП> - любой тип – тип элементов файла.

Ø ТЕКСТОВЫЕ ФАЙЛЫ

- компоненты – строки переменной длины, доступ только последовательный. Описание:

VAR <ИМЯ2>: TEXT;

Ø НЕТИПИЗИРОВАННЫЕ ФАЙЛЫ

- компоненты – двоичные блоки фиксированной емкости, информация из которых не интерпретируется, возможен прямой доступ. Описание:

VAR <ИМЯ3>: FILE;

ПРИМЕРЫ ОПИСАНИЙ ФАЙЛОВЫХ ТИПОВ И ПЕРЕМЕННЫХ

TYPE F1=TEXT; F2=FILE OF INTEGER; {файловый тип данных, состоящий из целочисленных элементов типа INTEGER} F3=FILE; VAR A0:F1; A1: TEXT; {два текстовых файла} A2:F2; {файл из целых чисел типа INTEGER} A3:F3; {двоичный файл}

ЭТАПЫ РАБОТЫ С ТИПИЗИРОВАННЫМИ ФАЙЛАМИ

Ø Описание файловой переменной

Ø Связь переменной с физическим файлом

Ø Инициализация (открытие) файла

Ø Ввод/вывод в файл

Ø Закрытие файла

Описание файловой переменной

При описании переменной для типизированного файла обязательно указывается тип элементов.

 

TYPE FINT=FILE OF INTEGER; {файловый тип данных, состоящий из целочисленных элементов типа INTEGER } VAR F1: FILE OF REAL; {файл из вещественных чисел типа REAL} F2:FINT; {файл из целых чисел типа INTEGER}

Связь переменной с физическим файлом

Ø ASSIGN (<ПЕРЕМЕННАЯ>,<ФАЙЛ>)

- связывает файловую переменную <ПЕРЕМЕННАЯ> с файлом, имя которого находится в строковой переменной или константе <ФАЙЛ>. Связь сохраняется до следующего оператора assign для данной переменной или до конца программной единицы, в которой определена указанная переменная.

ПРИМЕРЫ

ASSIGN(F1,’FFF.DAT’); ASSIGN(F2,’INT.DAT’);

Открытие файла

REWRITE(<ФП>)

- открытие файла на запись, причем указатель помещается в начало файла (на нулевой элемент). Если файл существует, то его содержимое уничтожается. Если файл не существует, то он создается.

RESET(<ФП>)

-открытие файла на чтение/запись, причем указатель помещается в начало файла (на нулевой элемент). Если файл не существует, генерируется ошибка ввода/вывода.

КОРРЕКТНОЕ ОТКРЫТИЕ ФАЙЛА

{$I-}{отключить контроль ошибок ввода/вывода – директива компилятора} RESET(A2); {открыть файл на чтение} {$I+}{включить контроль ошибок ввода/вывода – директива компилятора} IF IORESULT<>0 THEN {проверить функцию ошибки} {действия в случае ошибки – отсутствия файла на диске} ELSE … {действия в случае успешного открытия файла}

2.1.4 Ввод/вывод в типизированный файл

После каждой операции ввода/вывода указатель файла всегда смещается на следующий компонент файла.

Ø READ(<ФП>,<СП.ВВОДА>)

– чтение из файла <ФП> компонентов <СП. ВВОДА>- переменных типа элементов типизированного файла.

Ø WRITE(<ФП>,<СП.ВЫВОДА>)

– запись в файл <ФП> компонентов из <СП. ВЫВОДА> - переменных и/или констант типа элементов типизированного файла

Закрытие файла

Ø CLOSE(<ФП>)

- закрытие файла.

После закрытие обращение к файлу для ввода/вывода невозможно – будет генерироваться ошибка, но связь файловой переменной с физическим файлом сохраняется. Есть ряд процедур, которые можно выполнить только после закрытия файла.

ПРОЦЕДУРЫ И ФУНКЦИИ ДЛЯ РАБОТЫ С ФАЙЛАМИ И КАТАЛОГАМИ

ПОСЛЕ ЗАКРЫТИЯ ФАЙЛ МОЖНО:

Ø ERASE(<ФП>)

– удалить файл.

Ø RENAME(<ФП>,<НОВОЕ ИМЯ>)

– переименовать файл.

ПОЛЕЗНЫЕ ПОДПРОГРАММЫ ДЛЯ ОБРАБОТКИ ФАЙЛОВ

Ø IORESULT

– функция типа WORD; возвращает условный признак последней операции ввода-вывода, если успешно, то 0.

Ø EOF(<ФП>)

– функция типа BOOLEAN; возвращает true, если указатель файла находится в его конце, иначе – false.

Ø FLUSH(<ФП>)

– очищает буфер, связанный с файлом, гарантируя сохранность всех последних изменений

ПРОЦЕДУРЫ И ФУНКЦИИ ДЛЯ РАБОТЫ С КАТАЛОГАМИ

Ø CHDIR(<ПУТЬ>)

– сменить текущий каталог

Ø MKDIR(<ПУТЬ>)

– создать новый каталог

Ø RMDIR(<ПУТЬ>)

– удалить пустой каталог

Ø GETDIR(<УСТРОЙСТВО>,<ПУТЬ>)

– получить имя текущего каталога и номер устройства, на котором он находится

Библиотека DOS.TPU содержит еще ряд полезных процедур и функций работы с дисками, логическими устройствами, файлами и т.п.

 

 

ПОЛЕЗНЫЕ ФУНКЦИИ ДЛЯ ОРГАНИЗАЦИИ ПРЯМОГО ДОСТУПА К КОМПОНЕНТАМ ТИПИЗИРОВАННОГО ФАЙЛА

Так как длина каждого компонента типизированного файла фиксирована, то можно осуществить прямой доступ к нему, указав порядковый номер (нумерация компонентов начинается с 0)

Ø SEEK (<ФП>,<N>)

– процедура устанавливает указатель файла на компонент с номером N.

Ø FILEPOS(<ФП>)

– функция типа longint; возвращает номер следующего считываемого компонента (т.е. того, на котором сейчас находится указатель файла).

Ø FILESIZE(<ФП>)

– функция типа longint; возвращает количество записей в файле.

Ø TRUNCATE(<ФП>)

– процедура «усекает» длину файла до текущей записи (положения указателя).

ПРОЦЕДУРА СОЗДАНИЯ ФАЙЛА ИЗ ЦЕЛЫХ ЧИСЕЛ

PROCEDURE CREATE(NAME:STRING); VAR F:FILE OF INTEGER; {файловая переменная} X:INTEGER; BEGIN ASSIGN (F,NAME); {файловая переменная связана с файлом с именем NAME} {$I-} REWRITE(F); {открыть файл на запись (перезапись)} {$I+} IF IORESULT=0 THEN {если файл открыт} BEGIN WRITELN(‘VVEDITE CHISLA (OSTANOVKA 0):’); READ(X); WHILE X<>0 DO{вводим числа в цикле до нулевого значения и записываем их в файл} BEGIN WRITE (F,X); READ(X); END; CLOSE(F); {закрыть файл} END; END;

ПРОЦЕДУРА РАСПЕЧАТКИ СОДЕРЖИМОГО ФАЙЛА ИЗ ЦЕЛЫХ ЧИСЕЛ

PROCEDURE PRINT(NAME:STRING); VAR F:FILE OF INTEGER; {файловая переменная} X:INTEGER; BEGIN ASSIGN (F,NAME); {файловая переменная связана с файлом с именем NAME} {$I-} RESET(F); {открыть файл на чтение} {$I+} IF IORESULT=0 THEN {если файл открыт} BEGIN WHILE NOT(EOF(F)) DO {пока не достигнут конец файла } BEGIN{читаем элемент из файла и выводим ее на консоль} READ(F,X); WRITE(X:6); END; WRITELN; CLOSE(F); {закрыть файл} END; END;

ПРОЦЕДУРА УДАЛЕНИЯ ИЗ ФАЙЛА ВСЕХ ОТРИЦАТЕЛЬНЫХ ЧИСЕЛ

PROCEDURE SGAT(NAME:STRING); VAR F:FILE OF INTEGER; {файловая переменная} X,K,S:INTEGER; BEGIN S:=0; {обнуляем счетчик отрицательных чисел} ASSIGN (F,NAME);{файловая переменная связана с файлом с именем NAME} {$I-} RESET(F); {открыть файл на чтение/запись} {$I+} IF IORESULT=0 THEN {если файл открыт} BEGIN WHILE NOT(EOF(F)) DO {пока не достигнут конец файла} BEGIN READ(F,X); {читаем целое число из файла} IF X=0 THEN {если прочитанный элемент – отрицательный считаем его} S:=S+1 ELSE BEGIN K:=FILEPOS(F); {иначе запоминаем в k позицию, следующую за прочитанным положительным элементом} SEEK(F,K-1-S); {смещаем указатель на позицию за последней положительной записью} WRITE(F,X); {записываем считанный элемент} SEEK(F,K); { и переходим к еще непрочитанной позиции} END; END; SEEK(F,FILEPOS(F)-S); {смещаем указатель на длину файла — количество удаленных элементов} TRUNCATE(F); { и «обрезаем» лишнее} CLOSE(F); {закрываем файл, чтобы сохранить изменения в файле} END; END;

ПРИМЕР ПРОГРАММЫ, ИСПОЛЬЗУЮЩЕЙ ПРИВЕДЕННЫЕ ВЫШЕ ПОДПРОГРАММЫ

BEGIN CREATE(‘FILE1.TXT’); {создать файл} PRINT(‘FILE1.TXT’); {распечатать файл} SGAT(‘FILE1.TXT’); {сжать файл} PRINT('FILE1.TXT'); {распечатать измененный файл} READLN; END.

ЗАДАНИЯ

Программа должна быть разбита на несколько подпрограмм-процедур и подпрограмм-функций и обязательно содержать:

1. Процедуру формирования исходного файла;

2. Процедуру вывода результата работы программы;

3. Одну или более процедур (функций), реализующих вычислительную часть алгоритма.

Все подпрограммы-процедуры и подпрограммы-функции должны содержать список параметров, причем файл должен передаваться как параметр процедуры (функции). Основная программа должна содержать только операторы вызова подпрограмм.

 

ВАРИАНТЫ

  Постановка задачи  
Дан файл f, компоненты которого являются действительными числами. Найти: Сумму компонент файла f. Записать эту сумму в конец файла. Отсортировать файл по возрастанию значений компонент.
Дан файл f, компоненты которого являются действительными числами. Найти: Произведение компонент файла f. Записать это произведение после компоненты с номером N. Отсортировать файл, начиная с компоненты с номером N по убыванию.
Дан файл f, компоненты которого являются действительными числами. Найти: Сумму квадратов компонент файла f. Записать эту сумму в конец файла. Отсортировать файл по возрастанию.
Дан файл f, компоненты которого являются действительными числами (положительные и отрицательные). Найти: Модуль суммы и квадрат произведения компонент файла f. Записать эти значения в конец файла. Отсортировать файл по возрастанию.
Дан файл f, компоненты которого являются действительными числами X1,X2,…Xn, образованными по закону: Xi=(i-0.1)/(sqr(i)*i+abs(tg2*i)) (i=1,2,…N). Дано действительное число e>0. Записать в файл h те элементы файла f, для которых выполняется условие: abs(Xi)<e
  Дан файл f, компоненты которого являются действительными числами. Найти: Наибольшее из значений компонент файла. Записать это значение N раз после наименьшего значения компоненты файла (Можно использовать вспомогательный файл).
Дан файл f, компоненты которого являются действительными числами. Найти: Наименьшее из значений компонент файла с четными номерами. Записать это значение N раз в конец файла
Дан файл f, компоненты которого являются действительными числами (положительные и отрицательные). Найти: Наибольшее из значений модулей компонент файла с нечетными номерами. Записать это значение после компоненты файла с номером N
Дан файл f, компоненты которого являются действительными числами. Найти: Сумму наибольшего и наименьшего из значений компонент. Создать новый файл g, в котором эта сумма является первой компонентой, остальные компоненты переписать из файла f Упорядочить компоненты файла g по убыванию
Дан файл f, компоненты которого являются действительными числами. Создать файл g по следующему правилу: каждая компонента файла g равна разности между наибольшей компонентой файла f и компонентой файла f с номером i (i=1,2,…). Упорядочить компоненты файла g по возрастанию  
Дан файл f, компоненты которого являются целыми числами. Найти: количество четных чисел среди компонент с нечетными номерами. Добавить это значение в конец файла.
Дан файл f, компоненты которого являются целыми числами. Найти: Количество удвоенных нечетных чисел среди компонент файла. Записать это значение в начало файла.
Дан файл f, компоненты которого являются целыми числами. Найти количество квадратов нечетных чисел среди компонент файла. Записать это значение в начало нового файла g. Остальные значения переписать из исходного файла f.
Дан файл f, компоненты которого являются целыми числами. Получить в файле g все компоненты файла f, образующие возрастающие последовательности. Для разделения последовательностей в файле g использовать число 0. (Исходный файл f не содержит нулей).
Дан файл f, компоненты которого являются целыми числами. Получить в файле g все компоненты файла f: являющиеся четными числами; делящиеся на 3 и не делящиеся на 7; являющиеся точными квадратами;  
      Даны файлы f1,f2,f3,f4,f5, компоненты которых являются целыми числами. Организовать обмен компонентами между файлами следующим образом: Компоненты f1 переписываются в f3 Компоненты F2 переписываются в f4 Компоненты F3 переписываются в f5 Компоненты F4 переписываются в f2 Компоненты F5 переписываются в f1 Разрешается использовать только один вспомогательный файл h
Дан файл f, компоненты U0,U1,…Un которого являются последовательными числами Фибоначчи. Получить в файле f последовательные числа Фибоначчи U0,U1,…,Un+1
Дан файл f, компоненты которого являются целыми числами. Записать в файл g все четные числа файла f, а в файл h все нечетные числа. Порядок следования чисел сохраняется. В конец каждого из вновь полученных файлов записать сумму четных (нечетных) чисел соответственно.
Дан файл f, компоненты которого являются целыми числами. Получить файл g, образованный из файла f исключением повторных вхождений одного и того же числа.
Дан файл f, компоненты которого являются целыми числами. В файле нет компонент, равных нулю. Файл содержит одинаковое количество положительных и отрицательных чисел. Используя вспомогательный файл h, переписать компоненты файла f в файл g Так, чтобы в файле g не было двух соседних чисел с одним знаком  
Дан файл f, компоненты которого являются целыми числами. В файле нет компонент, равных нулю. Файл содержит одинаковое количество положительных и отрицательных чисел. Используя вспомогательный файл h, переписать компоненты файла f в файл g так, чтобы в файле g сначала шли положительные, потом отрицательные числа  
Дан файл f, компоненты которого являются целыми числами. В файле нет компонент, равных нулю. Файл содержит одинаковое количество положительных и отрицательных чисел. Используя вспомогательный файл h, переписать компоненты файла f в файл g Так, чтобы в файле g числа шли в следующем порядке: два положительных, два отрицательных, два положительных, два отрицательных и т.д.(число компонент в файле f делится на 4)    
        Дан файл f, компоненты которого являются целыми числами. В файле нет компонент, равных нулю. Числа в файле f идут в следующем порядке: десять положительных, десять отрицательных и т.д. Переписать компоненты файла f в файл g так, чтобы в файле g числа шли в следующем порядке: пять положительных, пять отрицательных и т.д.
Дан файл f, компоненты которого являются целыми числами. В файле нет компонент, равных нулю. Числа в файле f идут в следующем порядке: десять положительных, десять отрицательных и т.д. Переписать компоненты файла f в файл g так, чтобы в файле g числа шли в следующем порядке: двадцать положительных, двадцать отрицательных и т.д. (предполагается, что число компонент в файле f делится на 40)