Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Л2.doc
Скачиваний:
13
Добавлен:
11.04.2015
Размер:
233.47 Кб
Скачать

2.21 Более подробно о символьном типе

Таблица кодов ASCII использует 8 двоичных разрядов и состоит из двух частей. Первая, в которую входят символы с кодами 0 - 127, является универсальной, а вторая (коды 128 - 255) предназначена для специальных символов и букв национальных алфавитов (в том числе и русского).

Универсальная таблица (коды 0 - 127), кроме обычных символов (латинских букв, цифр и др.), имеет специальные управляющие символы. Они представляют собой команды, вывод которых на стандартное выходное устройство приводит к выполнению определенных действий. Эти символы имеют мнемонические двух- или трехбуквенные сокращения, пришедшие к нам из эры телеграфа. К управляющему символу можно обратиться по его ASCII-коду или по Ctrl-последовательности. Последняя представляет собой код, порожденный одновременным нажатием клавиши Ctrl и какой-либо другой клавиши.

Предположим, например, что в программе имеется описание

Var ch: Char;

Тогда операторы

ch:= chr(7);

ch:= #7;

ch:= ^G;

присваивают символьной переменной ch одно и то же символьное значение. Здесь ^G обозначает Ctrl-последовательность Ctrl+G (управляющий символ BEL - звуковой сигнал). Знак # и следующая за ним целая константа без знака обозначают код символа.

Из 32 управляющих символов вам, скорее всего, могут понадобиться те, которые сведены в таблицу 2.4.

Таблица 2.4

Код

Ctrl-последова-тельность

Использование функции Chr

Мнемоническое обозначение

Действие

#7

^G

Chr(7)

BEL

Звуковой сигнал динамика

#8

^H

Chr(8)

BS

Возврат курсора на одну позицию

#9

^I

Chr(9)

HT

Горизонтальная табуляция

#10

^J

Chr(10)

LF

Перевод строки

#12

^L

Chr(12)

FF

Прогон страницы

#13

^M

Ctrl(13)

CR

Возврат каретки

#26

^Z

Ctrl(26)

SUB

Конец файла

#27

^[

Ctrl(27)

ESC

Символ Escape

До сих пор мы занимались вопросами вывода символов на экран. Обратимся теперь к их вводу с клавиатуры. При нажатии на символьную клавишу естественно ожидать увидеть на экране в месте расположения курсора тот символ, который был введен.

var

ch: Char;

begin

Writeln('Введите символ: '); Readln(ch);

Writeln('Введен символ: ',ch);

Writeln('Нажмите <Enter>: '); Readln;

end.

Эта программа использует оператор Readln для того, чтобы считать с клавиатуры один символ и вывести в следующей строке то, что было считано. В данном случае при вводе символа вы увидите его на экране еще до того, как будет нажата клавиша Enter. Нажмем клавишу с символом «a», а затем Enter, и программа сообщит, что она считала символ «a». Запустим программу, в ответ на приглашение «Введите символ» нажмем любую символьную клавишу и будем держать ее, не отпуская. На экране при этом будут отображаться символы, и происходить это будет до тех пор, пока количество символов не достигнет 127. После этого нажатие клавиш уже не будет приводить к отображению новых символов, только динамик компьютера будет недовольно пощелкивать. Это сигнал о том, что полностью заполнен буфер клавиатуры - рабочая область памяти, в которой временно могут храниться до 127 символов, введенных с клавиатуры.

Можно ли прочитать значение нажатой клавиши так, чтобы она не отображалась при этом на экране? Да, можно. Для этого надо подключить к программе дополнительный модуль CRT и использовать из этого модуля в программе функцию ReadKey, которая именно это и делает. (Что такое модули и как их использовать - будет рассмотрено в одной из последних лекций, а сейчас достаточно знать, что доступ к модулю CRT обеспечивается строчкой программы «uses CRT».) При вводе символа функция ReadKey не сдвигает курсор и поэтому дает возможность вместо введенного символа вывести любой другой. Следующая программа, используя эту функцию, заменяет каждую строчную букву заглавной.

uses CRT;

var

ch: Char;

begin

Writeln('Вводите строчные латинские буквы ',

'или z для того, чтобы выйти из программы');

repeat

ch:=ReadKey;

Write(UpCase(ch));

until ch = 'z';

end.

Функция UpCase преобразует маленькую латинскую букву в соответствующую большую, а любой другой символ оставляет без изменения.

Реакция на нажатие специальных клавиш при чтении с клавиатуры отличается от реакции на нажатие алфавитно-цифровых клавиш. Чтобы понять, как это происходит, познакомимся с тем, как работает клавиатура. При нажатии клавиши формируются два кода - код символа и код сканирования (называемый также расширенным кодом). Код сканирования важен для тех клавиш, которым не сопоставлены обычные символы. Это, например, клавиши перемещения курсора, функциональные клавиши и т.д. Расширенный код является двухбайтовым. При считывании функцией ReadKey специальной клавиши (например, F1) сначала возвращается код символа, равный 0, а второй вызов ReadKey возвращает значение кода сканирования.

Таблица 2.5

Нажатые

клавиши

Код сканирования

Нажатые клавиши

Код сканирования

Ctrl+@ или Ctrl+3

3

PgDn

81

Shift+Tab

15

Ins

82

Alt+1 .. Alt+=

120..131

Del

83

Alt+Q .. Alt+P

16..25

F1..F10

59..68

Alt+A .. Alt+L

30..38

Shift+F1 .. Shift+F10

84..93

Alt+Z .. Alt+M

44..50

Ctrl+F1 ..Ctrl+F10

94..103

Alt+Enter

28

Alt+F1 .. Alt+F10

104..113

Home

71

Ctrl+Prt Sc

114

72

Ctrl+Home

119

PgUp

73

Ctrl+PgUp

132

75

Ctrl+←

115

77

Ctrl+→

116

End

79

Ctrl+End

117

80

Ctrl+PgDn

118

Следующий фрагмент программы предназначен для определения кода сканирования, соответствующего нажатой клавиши.

uses CRT;

var

ch: Char;

.............................

Write('Нажмите клавишу');

ch := ReadKey;

Writeln;

if ch <> #0 then Writeln('Обычная клавиша, Ord(ch) = ', Ord(ch))

else begin

Write('Символьный код: #0. ');

ch:= ReadKey;

Writeln('Код сканирования: ', Ord(ch));

end;