В предыдущих разделах мы изучили:
· объявление переменных и массивов символьного типа;
· правила записи символьных констант (п. 3.1 гл. 1);
· ввод, вывод символьных переменных (§ 4 гл. 2);
· передачу символьной переменной в функцию (§ 1 гл. 2);
· анализ символов(§ 4 гл. 2);
· вывод кодов всех символов, т. е. кодовую таблицу (задача 8, § 2 гл. 2);
Среди символов есть такие, которые нельзя ввести обычным способом, т. е. с помощью соответствующих клавиш, так как их нет на алфавитно–цифровой клавиатуре. Они называются символами псевдографики. Для их ввода курсор подводим в нужное место и нажимаем “Alt”. При включённом цифровом режиме (клавиша NumLock) соответствующий код символа набираем справа на клавиатуре, а не в верхнем ряду. Во время набора ничего не отображается, но когда отпустим клавишу “Alt”, в соответствующем месте появится символ псевдографики с набранным кодом. Такие символы в функцию в качестве фактических параметров можно передать, как и обычные символы, двумя способами: можно указать числовой код символа или вышеописанным способом набрать такой символ.
Анализ кодовой таблицы позволяет отметить следующие особенности, которые необходимо учитывать при программировании:
· цифры в таблице располагаются подряд, цифра 0 имеет код 48, у цифры 1 код 49, и т. д., цифра 9 имеет код 57;
· как прописные, так и строчные латинские буквы располагаются в алфавитном порядке с кодами 65—90 для больших и
97—122 для маленьких букв;
· русские прописные буквы располагаются также подряд (коды 128—159);
· маленькие русские буквы терпят разрыв, буквы от ‘а’ (код 160) до ‘п’ (175) следуют подряд. После буквы ‘п’ размещаются символы псевдографики, а затем русский алфавит продолжается с буквы ‘р’ (224) до ‘я’(239).
Другие особенности символьной кодовой таблицы можно увидеть, выполнив вышеприведённую программу (задача 8, § 2 гл. 2).
Рассмотрим совместимость символьного и целого типов, что характерно для языка С++. В переменной типа char можно хранить как символы (точнее, их коды), так и целые однобайтные числа. Для переменных типа char определены те же операции, что и для типа int, например, целочисленное деление (/), получение остатка от целочисленного деления (%) и другие. Поэтому в языке С++, в отличие от Pascal, можно выполнить следующий фрагмент:
char a='5', b=5;
cout<<a<<”, “<<b<<”, “<<a%b<<", "<<a/b<<'\n';
В результате получим 5, символ с кодом 5(см. кодовую таблицу), 3, 10. Почему? В переменной a хранится код символа ‘5’, т. е. целое число 53, а в переменной b — обычное целое число 5,
а 53 % 5 = 3, 53 / 5 = 10. Заметим, что если объявим int a=53, b=5; то выведем 53, 5, 3, 10. Если, что интереснее, int a=’5’, b=5; то получим то же, что и в предыдущем варианте, т. е. 53, 5, 3, 10, так как значением целочисленной переменной a будет код символа 5, т. е. целое число 53.
При вводес помощью cin результат зависит от того, как переменная объявлена и что набираем при вводе.
Пусть char a, b; cin>>a>>b; При выполнении введём 5 и 3. Тогда с помощью того же cout получим 5, 3, 2, 1. Здесь число 2 получено не как остаток от деления 5 на 3, а как результат операции % для кодов этих символов, т. е. 53 % 51 = 2. Для этих же чисел получено и число 1. В этом можно убедиться, если вместо частного вывести произведение cout << a*b. На экране мы увидим не 15 (5*3), а 2703, т. е. произведение кодов символов 5 и 3 (51* 53 = 2703).
Пусть по–прежнему char a, b; cin>>a>>b; При выполнении наберем два символа, например, a и с, коды которых 97 и 99. Тогда по той же причине будет выведено: a, c, 97, 9603, где 97=97%99, а 9603=97*99. “Числа”, которые больше, чем 9, при таком объявлении ввести не сможем. Если введём, например, 123, то a примет значение символа ‘1’, b= ‘2’, а символ 3 игнорируется. Получим 1, 2, 49, 2450, где 49=49 % 50, 2450 = 49*50.
Если объявлено int a, b; и вводим целые числа, то значениями этих переменных будут введённые числа. При вводе символов ничего хорошего не получим, хотя программа будет выполняться.
Символы лучше вводить с помощью специальных функций getch, getchar или getche (см. § 4 гл. 2).
Вывод символов или их кодов удобнее выполнять не с помощью cout, а используя функции printf или cprintf (см. вывод кодовой таблицы).