бесплатные рефераты

Основы программирования на языке Паскаль

if nomer=9999 then begin Close(bf);Exit end;

writeln('ввести имя автора'); readln(avtor);

writeln('ввести название книги'); readln(nazv);

writeln('ввести значение индекса'); readln(index);

write(bf,rb); end;end;

BEGIN { основная программа }

Org; Obr; Rash; Obr; readln;

END.

При создании больших программ их части удобно создавать в виде отдельных файлов (объектов), которые затем с помощью директивы компилятора {$i...} можно объединить в одну программу. Это удобно еще и тем, что несколько программистов могут создавать различные программы, что в несколько раз может ускорить процесс их создания.

Создадим ту же программу, что и Prim 47, только пообъектно, тогда процедуру Org запишем в C:\TURBO\Org1.pas, процедуру Obr - в C:\TURBO\Orb1.pas, процедуру Rash - в C:\TURBO\Rash1.pas, а вызывающую (основную программу - в C:\TURBO\Prim. 48, в которой предусмотрим подключение объектов - процедур Org, Obr, Rash к основной программе через директивы компилятора $i.

procedure Org1;

begin

assign(bf,'C:\TURBO\bibl.dos');

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

Страницы: 1, 2, 3, 4, 5, 6, 7, 8


© 2010 РЕФЕРАТЫ