
** vcp1 ** 23.04.2004
Лекция 10 Mixtum Compositum
-
Символьные переменные и массивы
Помимо рассмотренных выше типов для вещественных и комплексных значений
(int, float, double, complex) очень важен символьный тип (char) . Например, возможности символьной обработки определяют эффективность разработки
программ для многих приложений в гуманитарной сфере, которая
в очень малой степени связана с численными расчетами.
Для символьных переменных оператор описания типа имеет вид
char имя; например, char sm, symbol, a ;
Слово “character” означает “буква или иероглиф” (англ. яз.).
Каждой переменной типа char отводится 1 байт в ОП. Этот байт позволяет хранить
код буквы в виде целого числа от 0 до 255 ( или от –128 до 127). Отметим разную
кодировку символов для DOS и для Windows. Код символа можно вывести,
например, так: cout << (int) sm; или cout << int (sm) ;
Уже есть новый код Unicode, использующий 2 байта для каждого символа.
Присваивание значения символьной переменной выполняется обычным образом, причем для символьной константы используются одиночные кавычки ( апострофы).
Сравним присваивания для char и int :
char
a = ‘$’; int b = 1;
a = ‘s’ ; b = 12;
char a1 = a; int b1 = b;
Массив символов объявляется обычным образом, например,
char A[ 80];
Здесь в скобках указывается количество символов в массиве. Он может быть
двумерным: char M[5][80]; В этом случае его можно рассматривать как матрицу из
символов. Так, в массиве M имеем 5 строк матрицы и в каждой строке 80 символов.
Напомним, что индексы всегда нумеруются с нуля.
Если последним символом символьного массива сделать нулевой байт, то
получаем строку. Нулевой байт - это символ '\0' с десятичным кодом 0 , т.е.
( int ) '\0' = 0. Следовательно, строка символов представляется одномерным символьным массивом с нулевым байтом в конце.
Нулевой байт должен учитываться при выделении памяти для массива.
Специального строкового типа в С++ нет.
Например, слово “МИЭМ” можно хранить в виде массива четырех или пяти байтов:
char M1[4] = {‘M’,’И’, ’Э’, ’М’}; (10.1)
или
char M1[5] = {‘M’,’И’, ’Э’, ’М’, ‘\0’}; (10.2)
При втором способе, т.е. хранении в виде строки, возможно использование
специальных функций для обработки строк, что очень удобно ( см. лекцию 13).
В (10.2) использована обычная инициализация массива M1 ( см. раздел 7.1).
Но можно эту запись упростить, используя строку в кавычках:
char M1[5] = “ MИЭМ ”; (10.3)
При таком способе инициализации в конце будет автоматически добавлен
нулевой байт. Оператор (10.3) можно ещё упростить, опустив значение в
квадратных скобках – длину массива:
char M1[ ] = “MИЭМ”; (10.4)
Здесь длина массива будет определена компилятором по количеству
символов в строке справа. В описаниях (10.1) - (10.3) можно
память для массивов выделять с запасом, т.е. в массивах могут быть
неопределенные элементы. Ещё раз отметим, что
кавычки используются для строк, а апостроф для одиночных символов.
Инициализации (10.2), (10.3), (10.4) эквивалентны, но (10.4) наиболее удобна.
Отличие их от (10.1) в том, что для работы со строками можно использовать
как отдельные их символы, так и специальные строковые функции,
а в случае (10.1) возможна работа только с отдельными символьными элементами.
Например, для любой из форм (10.1 - 10.4), возможны такие операторы:
cout << “ Символ = ” << M1[2];
cout << “Код символа = ” << (int) M1[2];
При вводе строки символ конца строки ‘\0’ не вводится, а вместо него нажимается
клавиша ЕNTER, что соответствует его добавлению.