Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Информатика программирование, учебник.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
22.08 Mб
Скачать

3.3 Организация последовательного доступа к записям файла

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

Для создания последовательного файла необходимо выполнить следующие шаги:

  • присвоить файлу имя (процедура Assign);

  • открыть новый файл (процедура Rewrite);

  • подготовить информацию для ввода;

  • записать в файл компоненты (оператор write);

  • закрыть созданный файл (процедура Close).

Пример 2. Ввести с клавиатуры в соответствии из табл. 3.1 сведения о двадцати студентах и сохранить эту информацию в файле STUDENTS.DAT в корневом каталоге диска A.

Таблица 3.1

Номер зачетной книжки

Фамилия студента

Дата рождения

Номер группы

Размер стипендии, руб.

TAB

FIO

DATA

GRUP

STEPA

100000

АФАНАСЬЕВ

01.02.90

ПИ-11

500.00

100001

СЫЧЕВ

13.03.91

ПИ-11

500.00

100002

ВАСИЛЬЕВ

15.01.91

ПИ-11

350.00

100003

УШАКОВ

12.12.90

ПИ-11

0.00

100004

СИДОРОВ

01.11.90

ПИ-11

500.00

100005

ГАВРИЛОВ

10.12.91

ПИ-11

850.00

100006

ИВАНОВА

15.05.90

ПИ-11

500.00

100007

ВЕЙНЕРМАН

09.06.90

ПИ-11

500.00

100008

ЯКУШЕВ

24.10.90

ПИ-11

0.00

100009

ЗИБЕРМАН

13.09.91

ИС-11

0.00

100010

АНИСИМОВ

11.04.91

ИС-11

500.00

100011

ПЕТРОВ

03.05.91

ИС-11

350.00

100012

БУНАКОВ

21.06.90

ИС-11

850.00

100013

ФАДЕЕВ

04.10.90

ИС-11

350.00

100014

СЕМЕНОВ

30.01.90

ИС-11

500.00

100015

ЩУКИНА

15.03.91

ИС-11

0.00

100016

ВАХРУШЕВА

13.02.91

ИС-11

350.00

100017

ВЫСОЦКИЙ

06.08.90

ИС-11

850.00

100018

СЕРЕГИНА

05.04.91

ИС-11

500.00

100019

ГОРОХОВ

15.09.90

ИС-11

500.00

Ниже приведен код программы, выполняющий эту задачу. В качестве рабочей таблицы для промежуточного хранения информации о студентах используется массив записей MSTD. Программа работает в два в два этапа. Первый этап состоит в вводе информации о всех 20 студентах (цикл FOR). На втором этапе создается новый файл A:\STUDENTS.DAT и содержимое таблицы MSTD строка за строкой переносится в этот файл.

PROGRAM PR2;

TYPE STUDENT = RECORD

TAB: LONGINT; {НОМЕР ЗАЧЕТНОЙ КНИЖКИ}

FIO: STRING[20]; {ФАМИЛИЯ И.О.}

DATA: STRING[8]; {ДАТА РОЖДЕНИЯ}

GRUP: STRING[7]; {НОМЕР ГРУППЫ}

STEPA: REAL {РАЗМЕР СТИПЕНДИИ, РУБ.}

END;

VAR MSTD: ARRAY[0..19] OF STUDENT;

I: INTEGER; FSTD: FILE OF STUDENT;

BEGIN {ИНИЦИАЛИЗАЦИЯ ТАБЛИЦЫ}

WRITELN('ВВЕДИТЕ ДАННЫЕ О 20 СТУДЕНТАХ');

FOR I := 0 TO 19

DO WITH MSTD[I] {ВВОД ДАННЫХ В I-ю СТРОКУ ТАБЛИЦЫ}

DO BEGIN

WRITE(I+1: 2,'. НОМЕР ЗАЧЕТНОЙ КНИЖКИ: '); READLN(TAB);

WRITE(' ФАМИЛИЯ И.О. : '); READLN(FIO);

WRITE(' ДАТА РОЖДЕНИЯ : '); READLN(DATA);

WRITE(' НОМЕР ГРУППЫ : '); READLN(GRUP);

WRITE(' РАЗМЕР СТИПЕНДИИ,РУБ.: '); READLN(STEPA)

END;

{ЗАПИСЬ ТАБЛИЦЫ MSTD В ФАЙЛ}

ASSIGN(FSTD, 'A:\STUDENTS.DAT');

REWRITE(FSTD);

FOR I := 0 TO 19

DO IF LENGTH(MSTD[I].FIO) > 0

THEN WRITE(FSTD, MSTD[I]);

CLOSE(FSTD)

END.

В результате выполнения программы в файл STUDENTS.DAT будет занесена информация из табл. 3.1.

Пример 3. В файле STUDENTS.DAT, расположенном в корневом каталоге диска A хранятся сведения о 20 студентах (см. табл. 3.1). Требуется вывести на экран монитора в алфавитном порядке фамилии студентов группы "Информационные системы и технологии" (код ИС-11) и номера зачетных книжек тех студентов, которые получают стипендии указанного размера.

Решение этой задачи осуществляется в три этапа. На первом этапе следует прочитать по порядку все записи из файла режиме последовательного доступа. Каждую запись проанализировать на условия отбора (то есть, отфильтровать). При выполнении условий GRUP = 'ИС-11' и STEPA = 1000 запись о студенте следует поместить в промежуточный массив записей MSTD. Подсчитать K - число записей в массиве.

На втором этапе, если K > 1, следует отсортировать записи в массиве MSTD в порядке возрастания значений поля FIO.

На последнем этапе в зависимости от значения K следует на экран монитора вывести сообщения:

  • при K = 0 - 'В группе ИС-11 нет студентов не получающих стипендию 1000 руб.';

  • при K > 0 - список студентов, содержащий поля FIO (Фамилия) и TAB (Номер зачетной книжки).

PROGRAM PR3;

TYPE STUDENT = RECORD

TAB: LONGINT; {НОМЕР ЗАЧЕТНОЙ КНИЖКИ}

FIO: STRING[20]; {ФАМИЛИЯ И.О.}

DATA: STRING[8]; {ДАТА РОЖДЕНИЯ}

GRUP: STRING[7]; {НОМЕР ГРУППЫ}

STEPA: REAL {РАЗМЕР СТИПЕНДИИ, РУБ.}

END;

VAR STD, RAB: STUDENT; MSTD: ARRAY[0..19] OF STUDENT;

FSTD: FILE OF STUDENT; SFILE, SGR: STRING;

I, J, K: LONGINT; STP: REAL;

BEGIN

WRITELN('ВВЕДИТЕ ДИСК, ПУТЬ И ИМЯ ФАЙЛА'); READLN(SFILE);

WRITELN('УКАЖИТЕ НОМЕР ГРУППЫ'); READLN(SGR);

WRITELN('УКАЖИТЕ РАЗМЕР СТИПЕНДИИ'); READLN(STP);

{ЧТЕНИЕ ДАННЫХ ИЗ ФАЙЛА}

ASSIGN(FSTD, SFILE);

RESET(FSTD);

K:=0; {Число записей удовлетворяющих условиям поиска}

WHILE NOT EOF(FSTD)

DO BEGIN

READ(FSTD, STD);

IF (STD.GRUP = SGR) AND (STD.STEPA = STP)

THEN BEGIN

MSTD[K]:=STD; {Копирование записи STD в массив MSTD}

K := K + 1

END

END;

CLOSE(FSTD);

IF K > 0

THEN BEGIN

FOR I := 1 TO K-1

DO FOR J := K-1 DOWNTO I

DO IF MSTD[J-1].FIO > MSTD[J].FIO

THEN BEGIN {Перестановка записей местами}

RAB := MSTD[J-1]; MSTD[J-1] := MSTD[J];

MSTD[J] := RAB

END

END;

IF K>0

THEN FOR I:= 0 TO K-1

DO WRITELN(MSTD[I].FIO:22, MSTD[I].TAB:9, MSTD[I].STEPA: 9:2)

ELSE WRITELN('В группе ',SGR,' нет студентов имеющих стипендию ',

STP: 2: 2, 'руб.')

END.

Если задать значения SGR = 'ИС-11' и STP = 500, то результатом работы программы будет таблица представленная на рис. 3.4.

Рис. 3.4 Результаты работы программы PR3 в окне DOS