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

Изменение структуры основного файла

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

Пример 7. Требуется, во-первых, сохранив всю хранимую информацию, изменить в файле STUDENTS.DAT поле FIO: STRING[20], сократив его размер на 5 байт, то есть на FIO: STRING[15]. Во-вторых, добавить два новых поля: DEL: BYTE и DATE: STRING[8].

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

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

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

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

  • Создать рабочий файл TEMP на диске A: (процедура Rewrite);

  • Читать основной файл запись за записью. Каждую запись копировать в соответствующую компоненту рабочего файла. Новые поля DEL и DATE заполнять величинами - $0 и пробел, соответственно. Сформированную таким образом запись писать в файл TEMP.

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

  • Удалить основной файл (процедура Erase);

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

  • Рабочему файлу присвоить имя основного файла (процедура Rename).

Ниже приведен код программы.

PROGRAM PR7;

TYPE OLD = RECORD

TAB : LONGINT;

FIO : STRING[20];

DATA : STRING[8];

GRUP : STRING[7];

STEPA: REAL

END;

NEW = RECORD

TAB: LONGINT;

FIO : STRING[15]; {МЕНЯЕМ РАЗМЕР ПОЛЯ}

DATA : STRING[8];

GRUP : STRING[7];

STEPA: REAL;

DEL: BYTE; {ДОБАВЛЯЕМ НОВЫЕ ПОЛЯ DEL И DATE}

DATE: STRING[8]

END;

VAR S:OLD; N:NEW; ST:STRING;

FS:FILE OF OLD; FI:FILE OF NEW;

BEGIN

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

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

ASSIGN (FI,'A:\TEMP'); REWRITE(FI); {СОЗДАНИЕ РАБОЧЕГО НАБОРА}

WHILE NOT EOF(FS) {ПРОСМОТР ОСНОВНОГО ФАЙЛА}

DO BEGIN

READ(FS, S);

N.TAB := S.TAB; N.FIO := S.FIO; {КОПИРОВАНИЕ ИНФОРМАЦИИ}

N.DATA := S.DATA; N.GRUP := S.GRUP; N.STEPA := S.STEPA;

N.DEL := $0; N.DATE := ' ';

WRITE(FI, N);

END;

CLOSE(FS);

ERASE(FS); {УДАЛЕНИЕ ОСНОВНОГО ФАЙЛА}

CLOSE(FI);

RENAME(FI, ST); {ПЕРЕИМЕНОВАНИЕ РАБОЧЕГО НАБОРА В ОСНОВНОЙ ФАЙЛ}

END.

Использование клавиш для управления программой

Работа с файлом предусматривает ряд альтернативных процессов (действий). Инициировать эти процессы можно с помощью активных клавиш. Например, для удаления записи можно использовать клавишу  Del  , для перемещения к предыдущей записи – стрелка вверх, для перемещения к первой записи -  Home  , для выхода из программы – клавишу  Esc  .

Работа с клавишами, в том числе и управляющими  Shift  ,  Ctrl  ,  Alt  - осуществляется с помощью функции ReadKey. При этом считываемый символ не отображается на экране. Если перед вызовом ReadKey функция KeyPressed имеет значение True, то символ считывается немедленно. В противном случае, функция ожидает нажатия клавиши. Специальные клавиши на PC клавиатуре генерируют расширенные коды сканирования. (Расширенные коды сканирования приведены в табл. 5). К специальным клавишам относятся функциональные клавиши, клавиши управления курсором, клавиши Alt и т.п.

При нажатии специальной клавиши ReadKey сначала возвращает нулевой символ (#0), а затем возвращает расширенный код сканирования. Нулевые символы не могут быть получены никаким другим путем, что гарантирует то, что следующим символом будет расширенный код сканирования.

Пример 8. Разработать программу, которая с помощью функции READKEY отображает на экране ASC II код, нажатой клавиши, а для служебных клавиш или их комбинаций с другими клавишами второй (расширенный) код.

PROGRAM PR8;

USES CRT;

Var CH, CH1:CHAR;

Begin

Writeln('Нажимайте клавиши, или их комбинации и смотрите коды');

Writeln('Клавиша ESC - конец');

While TRUE {БЕСКОНЕЧНЫЙ ЦИКЛ}

Do begin

CH := READKEY; {ОЖИДАНИЕ НАЖАТИЯ КЛАВИШИ}

IF ORD(CH) = 0

THEN BEGIN CH1:=READKEY; {КЛАВИШИ ВТОРОЙ ГРУППЫ}

WRITELN('КОД КЛАВИШИ -> 0, РАСШИРЕНИЕ -> ', ORD(CH1))

END

ELSE BEGIN {КЛАВИШИ ПЕРВОЙ ГРУППЫ}

WRITELN('КОД КЛАВИШИ - ', ORD(CH));

IF ORD(CH) = 27

THEN BREAK {ВЫХОД ИЗ ЦИКЛА WHILE ПО КЛАВИШЕ Esc}

END

END {WHILE}

END.

В программе PR8 активной является только клавиша Esc, потому, что только ее код обрабатывается программным путем и влияет на ход вычислительного процесса. Остальные клавиши пассивно фиксируются (после нажатия их коды высвечиваются на экране монитора). С помощью программы PR8 можно получить табл. 3.3.

Таблица 3.3.

Возвращаемые коды

Клавиши

Первый

Второй

13

-

Enter

27

-

Esc

32

-

Пробел

0

3

Ctrl + C (Null – нулевой символ)

0

15

Shift + Tab

0

16 - 25

Alt + Q/W/E/R/T/Y/0/I/O/P

0

30 - 38

Alt + A/S/D/F/e/H/J/K/L

0

44 - 50

Alt + Z/X/C/У/В/М/М

0

59 - 68

Ключи F1 – F10

0

71

Home (начало)

0

72

Стрелка вверх

0

73

PgUp (страница в верх)

0

75

Стрелка влево

0

77

Стрелка вправо

0

79

End (конец)

0

80

Стрелка вниз

0

81

PgDn (страница в низ)

0

82

Ins (вставка)

0

83

Del (удалить)

0

84 - 93

Shift + F1 / … / Shift + F10

0

94 - 103

Ctrl + F1 / … / Ctrl + F10

0

104 - 113

Alt + F1 / … / Alt + F10

0

114

Ctrl + PrtScr (копия с экрана)

0

115

Ctrl + Стрелка влево

0

116

Ctrl + Стрелка вправо

0

117

Ctrl + End (конец)

0

118

Ctrl + PgDn (страница в низ)

0

119

Ctrl + Home (начало)

0

120 - 131

Alt + 1/2/3/4/5/6/7/8/9/0/-/=

0

132

Ctrl + PgUp (страница в верх)