- •Описание записи (record).
- •Работа с файлами. Общие сведения о файлах.
- •Процедуры и функции для работы с файлами.
- •Особенности обработки типизированных файлов.
- •Создание файла.
- •3. Добавление записей к файлу (в конец файла)
- •If { корректировка подтверждена }
- •If {…запись не удаляется…}
- •Корректировка с использованием последовательного доступа.
- •If {запись не корректируется}
- •О взаимосвязи записей основного обрабатываемого файла и записей файлов-справочников
- •Файлы без типа.
О взаимосвязи записей основного обрабатываемого файла и записей файлов-справочников
В файлах-справочниках на каждое значение ключевого признака должна быть только одна запись, дубликаты не допускаются. Например, на заводе может быть только один литейных цех, соответственно имеющий свой номер среди других цехов. Другой пример: в институте может быть только один студент со своим номером зачётной книжки, и не может быть нескольких студентов, имеющих одинаковый номер зачётки. В соответствии с этим требованием и планируется содержимое файлов-справочников - и одного, и другого.
В обрабатываемом файле могут быть несколько записей с одинаковым набором ключевых признаков. Например, студент с данным номером зачётки в течение одной сессии может сдавать несколько зачётов и экзаменов (по различным дисциплинам, не говоря уже о возможных пересдачах одного предмета). По каждой сессии этот студент будет иметь соответствующие наборы записей с результатами контрольных мероприятий. Если рассортировать файл сначала по номерам зачёток, а потом по номерам семестров, то рядом окажутся записи по каждому студенту, упорядоченные ещё и по номерам пройденных им семестров. Такое расположение записей даст возможность рассчитать, например, средний балл студента по каждой сессии, а затем и в целом за пройденный период обучения.
Если формировать ведомость с итогами подобного вида, то в ней можно будет увидеть «обезличенную» информацию о студенте, номер его зачётки. Добавить в ведомость фамилию, имя и отчество студента можно будет, если иметь файл-справочник, содержащий номер зачётки и, соответственно, фамилию, имя и отчество студента. Здесь же может быть и номер учебной группы и другая информация. Если это типизированный файл, то выборка записи может быть произведена прямым доступом. Для этого, можно, например, из текущего номера зачётки вычесть минимальное значение номера, что и даст физический номер записи в справочнике. Далее производится установка курсора на нужную запись с помощью процедуры SEEK(…) и чтение записи, из которой берётся требуемое значение (в данном случае ФИО) и заносится в итоговую запись либо вместо номера зачётки, либо в дополнение к нему.
В рассмотренном примере подобные действия возможны, например, при расшифровке номера цеха (получить название цеха), при расшифровке табельного номера (получить фамилию рабочего) и др.
Begin
Writeln (‘ Введите имя файла на диске: ‘);
Readln (Filename)’
Assign (Mainfile, filename);
Reset (mainfile);
Sum_file := 0;
Read (Mainfile, zap);
While (not EOF (mainfile)) do
Begin
Code_z:=zap.code_z;
Sum_z := 0;
While (not EOF (mainfile)) and
(Code_z = zap.code_z) do
begin
Nachisl := zap.kol_vo * zap.rasz;
Sum_z := sum_z + nachisl;
Read (Mainfile, zap);
End;
{Добавление}
Writeln (‘ Итого по цеху’, code_z,
‘ начислено ‘, Sum_file:10:2);
Sum_file := sum_file + Sum_z;
End;
Writeln (‘ Итого по заводу начислено ‘,
Sum_file:10:2);
Readln; End.
{ необходимо особо учитывать случай обработки последней записи}
{Добавление}
1. Имея в наличии текущий код цеха code_z, необходимо обратиться к соответствующему справочнику тем видом доступа, который позволяет тип файла(прямой для типизированного файла-справочника, последовательный для текстового) и выбрать из него запись с нужным кодом цеха.
2. Затем из записи получить нужное значение «расшифровки» кода цеха – его название. (Для этого может быть написана последовательность операторов, процедура, функция)
3. Далее это название вписывается в формируемую итоговую запись в нужное место.
4. После этого запись готова к выводу.
ПРИМЕР ПРЯМОГО ДОСТУПА К СПРАВОЧНИКУ
(на базе предыдущего примера)
. . .
While (not EOF (mainfile)) and
(Code_z = zap.code_z) do
begin
Nachisl := zap.kol_vo * zap.rasz;
Sum_z := sum_z + nachisl;
Read (Mainfile, zap);
End;
{ Первоначальный вариант }
Writeln (‘ Итого по цеху’, code_z,
‘ начислено ‘, Sum_file:10:2);
{ Вариант с использованием прямого доступа
к справочнику}
. . .
While (not EOF (mainfile)) and
(Code_z = zap.code_z) do
begin
Nachisl := zap.kol_vo * zap.rasz;
Sum_z := sum_z + nachisl;
Read (Mainfile, zap);
End;
{формирование итоговой записи}
{1 – миним.номер цеха}
num_zap_spr1:= Code_z – 1;
{нахождение в справочнике записи
с данным номером цеха}
seek( F_spr1, num_zap_spr1);
{чтение из справочника записи с данным номером цеха}
read (F_spr1,zap_spr1);
Writeln (‘ Итого по цеху’, code_z,
zap_spr1.nazv_z,
{поле с названием данного цеха}
‘ начислено ‘, Sum_file:10:2);
. . .
При использовании текстового справочника: вместо SEEK(. . .)и др. нужен цикл поиска по файлу-справочнику записи с данным кодом цеха code_z, получение из неё поля с названием данного цеха и вставка названия в формируемую итоговую запись.
О сортировке записей по нескольким признакам
В постановке задач совместной обработки файлов содержится требование упорядоченности записей основного файла по некоторым указанным признакам. Для решения этой задачи может быть предложен такой приём.
В описание типа записи для файла необходимо добавить специальное поле типа STRING, значение которого и позволить сортировать записи. Дадим ему условное имя SortField:
. . .
SortField : string;
. . .
При вводе значений полей очередной записи значение этого поля формируется следующим образом.
Значения полей, предназначенных для выполнения сортировки, должны быть приведены к строковому типу (string), если необходимо. Предположим, что они называются F1, F2 и F3.
Далее после преобразования они сцепляются в единую строку, причём в том порядке, в каком это задано для сортировки в постановке задачи, и результат записывается в поле SortField, например:
SortField := F1 + F3 + F2;
Только после формирования этого рабочего поля запись выводится в файл. И так для каждой записи основного файла.
Далее для выполнения сортировки в программе формируется массив записей размером в количество записей сортируемого файла. Записи файла читаются из файла и размещаются в данном массиве.
После этого выбирается алгоритм сортировки, например, метод обмена пар смежных записей, метод «пузырька». Соседние записи сравниваются между собой по значениям их полей SortField и, если надо, меняются местами целиком. Следует отметить, что сортировка выполняется сообразно значениям символьных строк, точно так же, как и сортировка строк по алфавиту.
В результате в памяти образуется рассортированный массив, который и переписывается обратно в основной файл.
Аналогичный приём может быть рекомендован при необходимости выполнения сортировки по датам.
Дата вводится как и принято – день, месяц, год в отдельные поля желательно типа string.
Далее, как и ранее в примере, в описание типа записи добавляется служебное поле SortField:string;
При формировании основной записи в это поле помещаются поля даты, сцепленные в таком порядке:
SortField:=Year + Month + Day;
Далее сортировка выполняется по описанному ранее алгоритму.
