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

Редактирование записей

Одной из наиболее часто встречающихся задач, является редактирование записей основного набора данных. Например, Вахрушеву лишили стипендии. Для поиска записи используется индексный файл. Проблема возникает в том случае, если приходится изменить значение ключевого поля, которое является основой индексного файла. В этом случае по окончании редактирования записи основного файла следует внести изменения в индексный файл. Например, студентка с фамилией Вейнерман вышла замуж за студента Яковлева и изменила свою фамилию на Яковлеву. Одним из простейших способов решения этой проблемы является переиндексация. То есть повторное создание индексного файла. Это самый долгий по времени, но и самый надежный способ. Остальные способы мы рассматривать не будем, так это прерогатива специальных разделов информатики, а именно разработки программного обеспечения СУБД.

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

Алгоритм функционирования программы следующий:

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

  • Открыть уже существующий на диске основной файл (процедура Reset);

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

  • Открыть уже существующий на диске индексный файл (процедура Reset);

  • Ввести с клавиатуры имя студента сведения о котором вы хотите посмотреть и возможно откорректировать.

  • Читать индексный файл запись за записью пока не будет достигнута метка EOF, сверяя имя студента с указанным. При совпадении организовать диалог для коррекции информации.

  • Скорректированную запись занести в соответствующую компоненту рабочего файла.

  • Если при коррекции было изменено ключевое поле, установить флаг FL в состояние TRUE.

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

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

  • Если ключевое поле изменялось (анализ FL), то сделать переиндексацию.

Код программы приведен ниже. В программе сформирована процедура IND, которая обеспечивает переиндексацию файла в случае изменения ключевого поля FIO.

PROGRAM PR6;

TYPE STUDENT = RECORD

TAB : LONGINT;

FIO : STRING[20];

DATA : STRING[8];

GRUP : STRING[7];

STEPA: REAL

END;

INDEX = RECORD

FIO : STRING[20];

NAMBER: INTEGER

END;

VAR L:INDEX; I,J,N: INTEGER; ST,STI:STRING; STUD:STRING[20];

S:STUDENT; FS:FILE OF STUDENT; FI:FILE OF INDEX;

FL:BOOLEAN; {ФЛАГ: TRUE - ИЗМЕНИЛОСЬ КЛЮЧЕВОЕ ПОЛЕ}

PROCEDURE IND; {ПРЕРИНДЕКСАЦИЯ ФАЙЛА}

VAR MS: ARRAY[0..20] OF STUDENT;MI: ARRAY[0..20] OF INDEX;

BEGIN {ЧТЕНИЕ ФАЙЛА В МАССИВ MS}

ASSIGN (FS, ST); RESET(FS);

N:= -1; {НОМЕР ЗАПИСИ В ОСНОВНОМ ФАЙЛЕ}

WHILE NOT EOF(FS)

DO BEGIN

N:=N+1;

READ(FS, MS[N])

END;

CLOSE(FS);

IF N > -1

THEN BEGIN

{ЗАПОЛНЕНИЕ МАССИВА ИНДЕКСОВ MI}

FOR I := 0 TO N

DO BEGIN MI[I].FIO := MS[I].FIO; MI[I].NAMBER := I END;

{СОРТИРОВКА ИНДЕКСНОГО МАССИВА ПО КЛЮЧЕВОМУ ПОЛЮ FIO}

FOR I := 0 TO N

DO FOR J := N DOWNTO I+1

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

THEN BEGIN

L := MI[J-1]; MI[J-1] := MI[J]; MI[J] := L

END;

{ФОРМИРОВАНИЕ ИНДЕКСНОГО ФАЙЛА}

WRITELN('ЖДИТЕ ИДЕТ ИНДЕКСАЦИЯ ФАЙЛА ...',STI);

ASSIGN(FI, STI); REWRITE(FI);

FOR I := 0 TO N

DO WRITE(FI, MI[I]);

CLOSE(FI)

END;

END; {INDEX}

BEGIN

WRITE('ВВЕДИТЕ ИМЯ ОСНОВНОГО ФАЙЛА: '); READLN(ST);

ASSIGN (FS, ST); RESET(FS);

WRITE('ВВЕДИТЕ ИМЯ ИНДЕКСНОГО ФАЙЛА: '); READLN(STI);

ASSIGN (FI, STI); RESET(FI);

FL := FALSE;

WRITE('ВВЕДИТЕ ФАМИЛИЮ СТУДЕНТА: '); READLN(STUD);

WHILE NOT EOF(FI) {ПРОСМОТР ИНДЕКСНОГО ФАЙЛА}

DO BEGIN

READ(FI, L);

IF L.FIO = STUD {Найдена запись, подлежащая коррекции}

THEN BEGIN

SEEK(FS, L.NAMBER); READ(FS, S); {Чтение записи из файла}

WRITE(S.TAB, '=> '); READLN(S.TAB); {Коррекция}

WRITE(S.FIO, '=> '); READLN(S.FIO); {полей }

WRITE(S.DATA, '=> '); READLN(S.DATA); {записи }

WRITE(S.GRUP, '=> '); READLN(S.GRUP);

WRITE(S.STEPA, '=> '); READLN(S.STEPA);

IF S.FIO<>STUD THEN FL:=TRUE; {Ключевое поле FIO изменено}

SEEK(FS,L.NAMBER); WRITE(FS,S) {Сохранение изменений}

END

END;

CLOSE(FS); CLOSE(FI);

IF FL

THEN IND; {ПРИ ИЗМЕНЕНИИ КЛЮЧЕВОГО ПОЛЯ ИДЕТ ПЕРЕИНДЕКСАЦИЯ}

END.