Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование на C / C++ / Лекции по C++ ОККТ "Сервер" [12].pdf
Скачиваний:
124
Добавлен:
02.05.2014
Размер:
1.04 Mб
Скачать

Одесский колледж компьютерных технологий "СЕРВЕР"

#include <iostream> int main(){

string name("AnnaBelle"); int pos = name.find("Anna"); if (pos == string::npos)

cout<<"Anna не найдено!\n";

else cout << "Anna найдено в позиции: "<< pos << endl;

}

Функция find_first_of() позволяет все вхождения символа, а не только первое. Пример: найти все цифры в строке.

#include <string> #include <iostream> int main(){

string numerics("0123456789"); string name("r2d2"); string::size_type pos = 0;

while ((pos=name.find_first_of(numerics, pos)) !=string::npos){

cout<<"найдена цифра в позиции: ";

<<pos << "\tэлемент равен ";

<<name.pos<<endl;

++pos;

}

Типы пользователя

В реальных задачах информация, которую требуется обрабатывать, может иметь достаточно сложную структуру. Для её адекватного представления используются типы данных, построенные на основе простых типов данных, массивов и указателей. Язык С++ позволяет программисту определить свои типы данных и правила работы с ними.

Переименование типов

Для того, чтобы сделать программу более ясной, можно задать типу новое имя с помощью ключевого слова typedef:

typedef тип новое_имя [размерность];

В данном случае квадратные скобки являются элементом синтаксиса. Размерность может отсутствовать. Примеры:

typedef unsigned int UINT;

//тип unsigned int переименовывается в UINT

typedef char Msg[100];

//строка из 100 символов названа Msg

Имена введённых типов можно использовать таким же образом, как и имена стандартных типов:

UINT i, j; //две переменные типа unsigned int

46

Одесский колледж компьютерных технологий "СЕРВЕР"

Msg str[100]; //массив из 10 строк по 100 символов Кроме задания типам с длинными описаниями более коротких псевдонимов, typedef используется для облегчения переносимости программ: если машин- но-зависимые типы объявить с помощью операторов typedef, при переносе программы потребуется внести изменения только в эти операторы.

Перечисления (enum)

При написании программ часто возникает потребность определить несколько именованных констант, для которых требуется, чтобы все они имели различные значения (при этом конкретные значения могут быть не важны).Для этого удобно воспользоваться перечисляемым типом данных, все возможные значения которого задаются списком целочисленных констант. Формат:

enum [имя_типа] {список_констант};

Имя типа задаётся в том случае, если в программе требуется определять переменные этого типа. Компилятор обеспечивает, чтобы эти переменные принимали значения только из списка констант. Константы должны быть целочисленными и могут инициализироваться обычным образом. При отсутствии инициализатора первая константа обнуляется, а каждой следующей присваивается на единицу большее значение, чем предыдущей:

enum svetofor{RED, YELLOW, GREEN};

svetofor svet;

 

 

switch (svet){

 

case red:

/*операторы*/ break;

case yellow:

/*операторы*/ break;

case green:

/*операторы*/ break;

}

Константам RED, YELLOW, GREEN присваиваются значения 0,1 и 2 соответственно.

Другой пример:

enum {two = 2, three, four, ten = 10, eleven, fifty = ten+40};

Константам THREE, FOUR и ELEVEN присваиваются значения 3,4 и 11 соответственно.

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

Структуры (struct)

Хранить данные в массивах не всегда удобно: массивы могут содержать элементы только одного типа, и если данные будут разного типа, придется их разбрасывать по разным массивам. Например, программа должна работать с базой данных о сотрудниках фирмы. Упрощенно, в такой базе

47

Одесский колледж компьютерных технологий "СЕРВЕР"

должно быть хотя бы фамилия, код, год рождения и зарплата. Фамилия – это символьная строка, год рождения и код – целые числа, зарплата - вещественное число. Если пользоваться массивами для работы с такой базой, придется хранить фамилии в массиве символьных строк, годы рождения и коды – в массивах int, а зарплату - в вещественном массиве. Утомительно.

Для работы с такими конструкциями в С++ используются структуры. Структура это набор элементов, возможно разного типа. Структуры имеют имена, и элементы этой структуры имеют имена. Синтаксис описания структуры:

struct [имя_типа]{

тип_1 элемент_1; тип_2 элемент_2;

тип_n элемент_n; } [список_описателей];

Например:

struct Worker{ //описание нового типа Worker char fio[30];

int date, code; double zarplata;

};

//описание заканчивается точкой с запятой

Имя описанного типа можно использовать в дальнейшем наряду со стандартными типами, например можно определить массив типа Worker и указателя на тип Worker:

Worker stuff [100], *ps;

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

//Определение массива структур и указателя на структуру: struct {

char fio[30]; int date, code; double zarplata;

} stuff [100], *ps;

Для инициализации структуры значения её элементов перечисляют в фигурных скобках в порядке их описания:

struct {

48

Одесский колледж компьютерных технологий "СЕРВЕР"

char fio[30]; int date, code; double zarplata;

} worker = {"Страусенко", 31, 215, 3400.55};

При инициализации массивов структур следует заключать в фигурные скобки каждый элемент массива (учитывая, что многомерный массив - это массив массивов):

struct coordinata{ int x, y;

} coord[2][3] = {

{{1, 1}, {3, 2}, {-1,4}}, //строка 1, то есть массив coord[0] {{-1, 0}, {1, -2}, {1,0}}, //строка 2, то есть массив coord[1] };

Для переменных одного и того же структурного типа определена операция присваивания, при этом происходит поэлементное копирование. Размер структуры не обязательно равен сумме размеров её элементов.

Доступ к полям структуры осуществляется с помощью операции выбора . (точка) при обращении к полю через имя структуры и -> при обращении через указатель, например:

Worker worker, stuff [100], *ps;

worker.fio = "Страусенко"; stuff [8].code = 215;

ps-> zarplata = 0.12;

Если элементом структуры является другая структура, то доступ к её элементам выполняется через две операции выбора:

struct A {int a; double x;} struct B {A a; double x;} x[2]; x[0].a.a = 1;

x[1].x = 0.1;

Поля разных структур могут иметь одинаковые имена, поскольку у них разная область видимости.

Вот пример описания структуры, объявления и доступа к ее элементам:

struct NAME{

//описываем структуру NAME

char familiya[30],

//она имеет три элемента -

 

imya[30],

//три символьных массива

}

otchestvo[30];

 

 

 

struct sluj{

//Описываем структуру sluj

NAME sluj_name;

//В нее входит структура

49