- •2 Введение в язык Паскаль Лекция 2
- •2.1 Историческая справка
- •2.2 Алфавит языка Паскаль
- •2.3 Переменные
- •2.4 Основные понятия языка Паскаль
- •2.5 Правила записи текста программы
- •Разделители
- •Правила записи
- •2.6 Система типов языка
- •2.7 Основные вычислительные структуры в Паскале
- •2.8 Выражения
- •2.9 Оператор присваивания
- •2.10 Ввод-вывод
- •2.11 Последовательное выполнение и составной оператор
- •2.12 Условный оператор
- •2.13 Оператор цикла с предусловием
- •2.14 Оператор цикла с постусловием
- •2.15 Оператор цикла с параметром
- •2.16 Примеры бесконечных циклов
- •2.17 Пустой оператор
- •2.18 Ограниченные типы
- •2.19 Функции
- •2.20 Примеры программ для задач без массивов
- •2.21 Более подробно о символьном типе
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;