- •Введение.
- •Переменные, основные типы и операции над ними. Ввод/вывод.
- •Управление выводом информации на экран
- •Операторы ветвления
- •Условный оператор if
- •Оператор Switch.
- •Операторы цикла
- •Цикл с предусловием (while)
- •Цикл с постусловием (do while)
- •Цикл с параметром (for)
- •Операторы передачи управления
- •Оператор goto
- •Оператор break
- •Оператор continue
- •Оператор return
- •Случайные числа
- •Вложенные циклы.
- •Массивы
- •Указатели.
- •Динамические массивы
- •Многомерные массивы
- •Строки
- •Типы пользователя
- •Перечисления (enum)
- •Функции
- •Приложение
- •Рекомендуемая литература.
Одесский колледж компьютерных технологий "СЕРВЕР"
#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