Основы программирования на языке Паскаль
p align="left"> 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 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 | | | | | |
Страницы: 1, 2, 3, 4, 5, 6, 7
|