Основы программирования на языке Паскаль — страница 6
Обновлено
with rb do
while True do
begin writeln('ввести номер книги');
readln(nomer);
if nomer=9999 then
begin close(bf); Exit;
end;
writeln('ввести имя автора');
readln(avtor);
writeln('ввести название книги');
readln(nazv);
writeln('ввести название индекса');
readln(index);
write(bf,rb);
end;
end;
procedure Obr1;
begin
Assign(bf,'C:\TURBO\bibl.dos');
Reset(bf);
with rb do
while not eof(bf) do
Begin read(bf,rb);
writeln(nomer:5,avtor:16,Nazv:10,index:6);
end;
Close(bf);
writeln('нажмите enter'); readln;
end;
procedure Rash1;
begin Assign(bf,'C:\TURBO\bibl.dos');
Reset(bf);
Seek(bf,Filesize(bf));
with rb do
while True do
begin writeln('введите номер'); readln(nomer);
if nomer=9999 then begin Close(bf);exit end;
writeln('введите имя автора'); readln(avtor);
writeln('введите название книги'); readln(nazv);
writeln('введите значение индекса'); readln(index);
write(bf,rb);
end;end;
Работу построим в режиме меню.
Program Prim48;
label M;
type books=record
nomer:integer;
avtor:string[16];
nazv:string[30];
index:integer; end;
Var bf:file of books;
rb:books; regim:byte;
{$i C:\TURBO\Org1.pas}
{$i C:\TURBO\Obr1.pas}
{$i C:\TURBO\Rash1.pas}
BEGIN
M: writeln('введите режим работы');
writeln('1 - создание, 2 - обработка',
'3 - расширение, 4 - выход');
readln(regim);
case regim of
1:Org1;
2:Obr1;
3:Rash1;
4:Exit; else writeln('неправильно задан режим'); end;
goto M;
END.
Для обеспечения работы с различными именами файлов имя файла вначале запрашивается, а затем передается в процедуры. Таким образом, мы можем создавать несколько файлов, содержащих данные о книгах, их обрабатывать, расширять и т.п.
Program Prim49;
label M1,M2 ;
type books=record
nomer:integer;
avtor:string[16];
nazv:string[30];
index:integer; end;
Var bf:file of books;
rb:books; regim:byte; si:char; fl:string;
{$i C:\TURBO\Org.pas}
{$i C:\TURBO\Obr.pas}
{$i C:\TURBO\Rash.pas}
BEGIN
M1: writeln('где будет храниться файл? диск:\каталог\имя'),
readln(fl);
M2: writeln('введите режим работы');
writeln('1 - создание, 2 - обработка',
'3 - расширение, 4 - выход');
readln(regim);
case regim of
1:Org;
2:Obr;
3:Rash;
4:begin writeln('будем ещё работать с файлами? - "Y"');
writeln('или конец работы - любая клавиша');
readln(si);
if (si='Y')or(si='y') then goto M1 else HALT; end;
else begin writeln('неправильно задан режим');
goto M2; end; end; goto M2;
END.
Procedure Org2;
begin
assign(bf, fl);
Rewrite(bf);
with rb do
while True do
begin writeln('введите номер книги');
readln(nomer);
if nomer=9999 then
begin close(bf); Exit end;
writeln('введите имя автора');
readln(avtor);
writeln('введите название книги');
readln(nazv);
writeln('введите значение индекса');
readln(index);
write(bf,rb);
end; end;
Procedure Obr2;
begin
Assign(bf, fl);
Reset(bf);
with rb do
while not Eof(bf) do
begin read(bf, rb);
writeln(nomer:5,avtor:16,Nazv:10,index:6);
end; Close(bf);
end;
Procedure Rash2;
begin assign(bf, fl);
Reset(bf);
Seek(bf,Filesize(bf));
with rb do
while True do
begin writeln('введите номер'); readln(nomer);
if nomer=9999 then begin Close(bf);Exit end;
writeln('введите имя автора'); readln(avtor);
writeln('введите название книги'); readln(nazv);
writeln('введите значение индекса'); readln(index);
write(bf,rb);
end;end;
10.5. Файлы произвольного доступа
Файлы произвольного доступа используются при наличии зависимости значения какого-либо поля компоненты от ее порядкового номера в файле. Порядковый номер компоненты иногда называют ключом компоненты файла.
Организовать файл произвольного доступа можно двумя способами:
Создать последовательный файл и обращаться к компонентам по порядковому номеру, трактуя последовательный файл как файл прямого доступа.
Создать файл фиктивных (с пустыми полями) компонент, затем загрузить его по ключу фактическими данными. этот способ - создание файла с фиктивными компонентами - называется форматизацией.
Пример. Форматировать файл произвольного доступа из 20 компонент c:\turbo\bibl.dos. Структура компонент такая же, как и в Prim 47-49. Оформим алгоритм в виде процедуры form, запишем ее в c:\turbo\form.pas.
Procedure form;
Begin writeln ('дайте имя форматизируемому файлу');
readln(filname);
assign(booksfile, filname);
rewrite(booksfile);
with recbooks do
Begin writeln ('на сколько записей форматировать файл?');
readln(razmer);
for i:=l to razmer do
Begin nomer:=i; avtor:=' '; index:=0; nazv:=' ';
write ( books file, recbooks)
end; end; writeln(фopматизация ',razmer,' запись выполнена');
close(booksflle); end;
Напишем процедуру загрузки (procedure zagruz), которая будет заменять поля фиктивных записей реальными значениями, и запишем ее в c:\turbo\zagruz.pas;
procedure zagruz; Begin writeln('дать имя загружаемого по ключу файла');
readln(filname);
assign(booksfile,filname); reset(booksfile);
writeln('сколько записей будете вводить?'); readln(k);
with recbooks do
Begin for i:=1 to k do
Begin writeln('введите номер'); readln(nomer);
writeln('введите имя автора'); readln(avtor);
writeln('введите название книги'); readln(nazv);
writeln('введите индекс'); readln(index);
seek(booksfile,nomer-1); { номера компонент начинаются с 0 }
write(booksfile,recbooks); end; end;
close(booksfile); end;
Оформить процедуру прямого доступа по ключу к компонентам файла и выдачу их на экран монитора, записать ее в C:\TURBO\OBRAB.PAS;
Procedure Obrab;
Begin writeln('дайте имя файла'); readln(filname);
assign(booksfile,filname); reset(booksfile);
while true do
Begin writeln('укажите ключ обрабатываемой записи'); readln(k);
if k=9999 then Begin close(booksfile); exit; end;
seek(booksfile,k-1);
with recbooks do Begin read(booksfile,recbooks);
writeln(nomer:5,avtor:16,nazv:15,index:4);
end; end; end;
Написать процедуру корректировки файла произвольного доступа в которой будут предусмотрены режимы корректировки:
Замена всех полей компоненты.
Расширение файла в пределах отформатированного пространства.
все это делает процедура Кооr, записанная в c:\turbo\koor.pas.
Procedure Koor;
Var nevavtor:string[16]; nevnazv:string[30]; nevindex:integer;
Begin writeln('дайте имя файла'); readln(filname);
assign(booksfile,filname); reset(booksfile);
with recbooks do
Begin writeln('сколько записей будете корректировать?'); readln(k);
for i:=1 to k do
Begin writeln('дайте номер корректируемой записи'); readln(k1);
nevavtor:=' '; nevnazv:=' '; nevindex:=0;
writeln('введите имя автора'); readln(nevavtor);
writeln('введите название книги'); readln(nevnazv);
writeln('введите индекс'); readln(nevindex);
avtor:=nevavtor; nazv:=nevnazv; index:=nevindex;
seek(booksfile,k1-1); write(booksfile,recbooks);
end; end; close(booksfile); end;
В программе Prim 50, с помощью меню рассматриваются работа с файлами произвольного доступа во всех режимах; форматирование файла, его загрузка, обработка, корректировка. Здесь следует заметить, что программа универсальна в том смысле, что может работать с различными файлами.
Program Prim50;
Type books=record
nomer:integer; avtor:string[16];
nazv:string[30]; index:integer; end;
Var booksfile:file of books;
recbooks:books; razmer,k,k1,i,reg:integer;
filname:string[12];
{$i c:\turbo\form.pas}
{$i c:\turbo\zagruz.pas}
{$i c:\turbo\obrab.pas}
{$i c:\turbo\koor.pas}
Begin while true do
Begin writeln('укажите режим');
writeln('1: форматизация');
writeln('2: загрузка по ключу');
writeln('3: обработка по ключу');
writeln('4: корректировка');
writeln('5: выход из программы');
readln(reg);
case reg of 1:form; 2:zagruz; 3:obrab; 4:koor; 5:halt;
end;
end;
end.
10.6. Текстовые файлы
Компонентами текстовых файлов являются строки. Длина строки - 0-255 символов. Каждая строка завершается маркером строки, а файл - маркером конца файла. Для описания файловых переменных текстового типа используется зарезервированное слово text.
Var instrl, instr2: text;
dokulnent: text;
Для работы с текстовыми файлами используются упомянутые выше функции и процедуры assign, rewrite, reset, close, read, readln, write, writeln, seekeof, однако имеются и специфические функции и процедуры:
Append (fv) - открыть текстовый файл и установить указатель на маркер конца файла.
Eoln (fv) - возвратить true, если указатель файла достиг маркера конца строки, в противном случае, возвратить значения false.
Seekeoln(fv) - функция, аналогичная предыдущей, но указатель проходит все пробелы и знаки табуляции. возвращает true при достижении маркера конца строки.
Seekeof(fv) - возвращает true, если указатель файла находится на маркере конца файла.
Организация текстового файла производится по схеме:
1) объявляется файловая переменная текстового типа;
2) присваивается файлу имя (assign);
3) открывается файл (rewrite);
4) подготавливается строка - компонента для записи в файл;
5) записывается строка - компонента в файл (writeln);
6) повторяются п. 4, 5 столько раз, сколько нужно;
7) закрывается файл.
Доступ к компонентам текстового файла:
1) присвоить файлу имя (assign);
2) открыть файл для чтения (reset);
3) прочитать компоненту-строку (readln);
4) обработать компоненту-строку (например вывести на экран);
5) повторить п. 3, 4 столько раз, сколько нужно.
6) закрыть файл (close);
Расширение текстового файла производится путем добавления в конец файла компонент-строк:
1) присвоить имя файлу (assign);
2) установить маркер на конец файла (append);
3) подготовить строку для записи;
4) записать строку (writeln);
5) повторить нужное количество раз п. 3, 4.
6) закрыть файл (close).
Замечание. При записи файлов прямого и последовательного доступа, созданных пользователем, содержимое компонент упаковывается, и поэтому посмотреть их в vc или nc по f3 или f4 нельзя, а текстовый файл не упаковывается, и его можно просмотреть.
procedure sozdt;
Begin writeln('дайте имя создаваемому текстовому файлу');
readln(filename);
assign(stro,filename); rewrite(stro);
while true do
Begin writeln('напишите содержимое строки');
readln(s); if s='zzz' then {'zzz' - признак окончания ввода }
Begin close(stro); exit; end;
writeln(stro,s); end;end;
procedure obrt;
Begin writeln('дайте имя обрабатываемого файла');
; readln(filename);
assign(stro,filename); reset(stro);
repeat readln(stro,s); writeln(s);
until seekeof(stro); close(stro); exit; end;
procedure rasht;
Begin writeln('укажите имя корректируемого файла'); readln(filename);
assign(stro,filename); append(stro);
while true do
Begin writeln('введите строку'); readln(s);
if s='zzz' then Begin close(stro); exit; end;
writeln(stro,s); end; end;
Program Prim51;
Type dlina=string[60];
Var stro:text; s:dlina; reg:char; filename:string[12];
{$i c:\turbo\sozdt.pas}
{$i c:\turbo\obrt.pas}
{$i c:\turbo\rasht.pas}
Begin while true do
Begin writeln('укажите режим');
writeln('1: создание, 2: вывод на экран, 3: расширение, 4: выход');
readln(reg);
case reg of '1': sozdt;
'2': obrt;
'3': rasht;
'4': halt else writeln('повторите номер режима');
end;end;end.
11. Использование библиотеки CRTРазработчики Турбо-Паскаля предусмотрели несколько подпрограмм, существенно увеличивающих возможности текстового ввода-вывода. Эти подпрограммы сосредоточены в библиотеке (модуле) CRT, входящей в комплект поставки Турбо-Паскаля. В модуль включены также процедуры sound, no sound, delay, позволяющие программировать звуковой генератор компьютера.
11.1. Программирование клавиатуры
Дополнительные возможности управления клавиатурой реализуются двумя функциями: keypressed и ReadKey.
Функция keypressed возвращает значение типа boolean, указывающее состояние буфера клавиатуры: false означает, что буфер пуст, а true - что в буфере есть хотя бы один символ, еще не прочитанный программой.
В реализуется так называемый асинхронный буферизованный ввод с клавиатуры. По мере нажатия на клавиши соответствующие коды помещаются в особый буфер, откуда они могут быть затем прочитаны программой. Стандартная длина буфера рассчитана на хранение до 16 кодов символов. Если программа достаточно долго не обращается к клавиатуре, а пользователь нажимает клавиши, буфер может оказаться переполненным. В этот момент раздается звуковой сигнал и «лишние» коды теряются. Чтение из буфера обеспечивается процедурами read/rеadln и функцией ReadKey. обращение к функции keypressed не задерживает исполнения программы: функция немедленно анализирует буфер и возвращает то или иное значение, не дожидаясь нажатия клавиши.
Функция ReadKey возвращает значение типа char. При обращении к этой функции анализируется буфер клавиатуры: если в нем есть хотя бы один не прочитанный символ, код этого символа берется из буфера и возвращается в качестве значения функции, в противном случае функция будет ожидать нажатия на любую клавишу. Ввод символа с помощью этой функции не сопровождается эхо-повтором и содержимое экрана не меняется. Например, в какой-то точке программы необходимо игнорировать все ранее нажатые клавиши, коды которых еще непрочитаны из буфера, т.е. необходимо очистить буфер. Этого можно достичь следующим способом:
Uses CRT;
Var
с; char;
Begin
while Keypressed do
c:== ReadKey;
. . . . .
end.
При использовании процедуры ReadKey следует учесть, что в клавиатурный буфер помещаются так называемые расширенные коды нажатых клавиш. Если нажимается любая алфавитно-цифровая клавиша, расширенный код совпадает с ASCII-кодом соответствующего символа. Например, если нажимается клавиша с латинской буквой «а» (в нижнем регистре), функция ReadKey возвращает значение chr(97), а если - «а» (в верхнем регистре) - значение chr(65). При нажатии функциональных клавиш F1...F10 (клавиш управления курсором), клавиш Ins, Home, Del, End, PgUp, PgDn в буфер помещается двухбайтовая последовательность: сначала символ #0, а затем расширенный код клавиши. Таким образом, значение #0, возвращаемое функцией ReadKey, используется исключительно для того, чтобы указать программе на генерацию расширенного кода. Получив это значение, программа должна еще раз обратиться к функции, чтобы прочитать расширенный код клавиши.
Следующая простая программа позволит определить расширенный код любой клавиши. Для завершения работы программы нужно нажать клавишу esc.
Uses CRT;
Var с: char;
Begin
repeat
c:= ReadKey;
if c< >#0 then
writeln (ord(c))
else
writeln ('0', ord (ReadKey):8)
until c=#27 {27 - расширенный код клавиши esc}
end.
Если вы воспользуетесь этой программой, то обнаружите, что нажатие на некоторые клавиши игнорируется функцией ReadKey. Это прежде всего так называемые сдвиговые клавиши - Shift, Ctrl, Alt. Сдвиговые клавиши в MS-DOS обычно используются для переключения регистров клавиатуры и нажимаются в сочетании с другими клавишами. Именно таким способом, например, различается ввод прописных и строчных букв. Кроме того, функция игнорирует переключающие клавиши Caps Lock, Num Lock, Scroll Lock.
в таблице приведены расширенные коды клавиш, возвращаемые функцией ord(ReadKey).
Расширенные коды клавиш
Таблица
Код | Клавиша или комбинация клавиш | Код | Клавиша или комбинация клавиш | |||
первый байт | второй байт | первый байт | второй байт | |||
Алфавитно-цифровые клавиши | ||||||
8 | - | backspace (забой) | 9 | - | tab (табуляция) | |
13 | - | enter | 32 | - | пробел | |
33 | - | ! | 34 | - | « | |
35 | - | # | 36 | - | $ | |
37 | - | % | 38 | - | & | |
39 | - | " | 40 | - | ( | |
41 | - | ) | 42 | - | * | |
43 | - | + | 44 | - | , | |
45 | - | - | 46 | - | . | |
47 | - | / | 48...57 | - | 0...9 | |
58 | - | : | 59 | - | ; | |
60 | - | < | 61 | - | = | |
52 | - | > | 63 | - | ? | |
64 | - | @ | 65...90 | - | A...Z | |
91 | - | [ | 92 | - | / | |
93 | - | ] | 94 | - | ^ | |
95 | - | _ | 96 | - | " | |
97...122 | - | a...z | 123 | - | { | |
124 | - | ?? | 125 | - | } | |
126 | - | ~ | 128...159 | - | A...Я | |
160...175 | - | а...п | 224...239 | - | р...я | |
Управляющие клавиши и их сочетания со сдвиговыми | ||||||
0 | 3 | Ctrl-2 | 0 | 15 | Shift - Tab | |
0 | 16...25 | Alt-Q...Alt-P (верхний ряд букв) | 0 | 30...38 | Alt-A...Alt-L (средний ряд букв) | |
0 | 44...50 | Alt-Z...Alt-M (нижний ряд букв) | 0 | 59...68 72 | F1...F10 курсор вверх | |
0 | 71 | Home | 0 | 75 | курсор влево | |
0 | 73 | PgUp | 0 | 79 | End | |
0 | 77 | курсор вправо | 0 | 81 | PgDn | |
0 | 80 | курсор вниз | 0 | 83 | Del |
код | клавиша или комбинация клавиш | код | клавиша или комбинация клавиш | |||
первый байт | второй байт | первый байт | второй байт | |||
0 | 82 | Ins | 0 | 94...103 | Ctrl-F1...Ctrl-F10 | |
0 | 84...93 | Shift-F1... Shift-F10 | 0 | 114 | Ctrl- PrtScr | |
0 | 104...113 | Alt-F1...Alt-F10 | 0 | 116 | Ctrl - курсор вправо | |
0 | 115 | Ctrl - курсор влево | 0 | 118 | Ctrl - PgDn | |
0 | 117 | Ctrl - End | 0 | 120...131 | alt-1...alt- = (верхний ряд клавиш) | |
0 | 119 | Ctrl - Home | ||||
0 | 132 | Ctrl - PgUp |
