Скачиваний:
3
Добавлен:
20.05.2014
Размер:
411.65 Кб
Скачать

** vcp1 ** 23.04.2004

Лекция 10 Mixtum Compositum

    1. Символьные переменные и массивы

Помимо рассмотренных выше типов для вещественных и комплексных значений

(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) можно ещё упростить, опустив значение в квадратных скобках – длину массива: 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

10.3 Операторы управления

Oбычно операторами передачи управления называют операторы

goto, break, return, continue.

Оператор return был рассмотрен в разделе 8.1.

Оператор безусловного перехода имеет вид

goto метка;

и служит для безусловной передачи управления оператору с указанной после

goto меткой, т.е. переходу к нему. В современном программировании

рекомендуется использовать данный оператор только в случае крайней

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

оператор goto легко может стать причиной зацикливания программы, т.е. её бесконечного выполнения. Кроме того, он затрудняет чтение программ.

Его частое применение характерно только для начинающих программистов.

Пример:

goto m25 ; / / (10.5)

...

...

m25: cout <<” произошел переход на метку m25”<< endl;

Оператор break используется для принудительного выхода из цикла или

переключателя. Он безусловно передает управление тому оператору, который

следует за циклом или переключателем (о переключателе см. ниже).

Оператор continue используется только в операторах цикла для прерывания

по какому-то условию текущей итерации и перехода к следующей

( см. Ишкова Э.А., с. 47-48).

10. 4 Оператор мультиветвления switch

Рассмотреный в разделе 6.3 оператор if позволяет реализовать выполнение двух ветвей программы, но, используя вложение этих операторов, ветвление можно сделать очень сложным. Это было показано в примере (6.8). Но при сложном вложении трудно понимать текст программы и поэтому в этом случае удобнее использовать оператор множественного выбора switch, т.е. переключатель.

Пример.

char a, ss ; int m; / / (10.6)

cout <<" Варианты a, b, c ? "; cin>>ss;

switch ( ss ) {

case 'a' : m=11; break;

case 'b' : m=22; break;

case 'c' : m=33; break;

default : m=0;

} cout<<"m= "<<m ;

В общем случае переключатель имеет следующую форму:

switch ( ПВ ) { case c1 : гр1 ;

case c2 : гр2 ;

case cп : грп ;

default : грdef ; }

Здесь с1, c2, . . , cп - целые или символьные константы,

гр1, гр2, . . - различные группы операторов,

ПВ – переключающее выражение, значение которого определяет выполняемую ветвь по совпадению с меткой после слова case. При несовпадении выполняется группа грdef

Обычно каждая из указанных групп завершается оператором break ( см. раздел 10.4).

    1. Структуры

В предыдущих лекциях рассматривали массивы. Массив – это последовательность

элементов одного типа. Обращение к конкретному элементу производится по его индексу. Но можно создавать группы из элементов разного типа. Такие группы

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

Структуру можно рассматривать как новый сложный тип, составленный из

других типов. Имя этого нового структурного типа указывается после

ключевого слова struct в виде: struct имя { . . . . } ;

где в фигурных скобках даются имена и типы его составляющих.

Пример :

struct stdnt { char Nm [20]; char Grup[5]; (10.8)

int godr; float srbal; float stip; } ;

Это опиcание структурного типа (tag в англ.). Типы элементов в описании разделяются знаками точка с запятой. Для выделения памяти структуре нужно

обычным образом описать одну или несколько структурных переменных, например,

stdnt s1, s2, s3;

Обычно работают с массивами структур: stdnt sts[60];

Такой массив можно рассматривать как таблицу, в которой строки

соответствуют индексам массива, а столбцы имеют имена и размеры,

указанные в описании типа stdnt в (10.11). Отметим, что в литературе

по базам данных строки называют записями, а столбцы полями.

Вызов конкретного элемента осуществляется через уточненное имя,

( есть и другие способы) :

имястp . имяэл

Здесь имястp – это имя структуры ( не имя типа!), а имяэл – это имя элемента.

Пример: s1.stip, s1. srbal, sts [13]. Nm, sts[7] . godr

Последнее значение в примере – это год рождения восьмого студента.

В заключение отметим ещё раз, что оператор struct определяет новый тип, но

не создаёт конкретного объекта, т.е. не выделяет память для него ( напомним, что

объект – это участок памяти). Создание объекта происходит при его описании,

т.е. когда определяется его имя и его структура по указанному в описании типу.

Соседние файлы в папке Шпора по информатике