188.59K
Category: programmingprogramming

Составные типы данных: массивы, структуры, объединения Факультет электротехники и автоматики. Тема 5

1.

Тема 5.
Составные типы данных:
массивы, структуры, объединения
Факультет электротехники и автоматики

2.

Классификация типов данных С
Типы данных
Встроенные
Составные
Целочисленные Вещественные
Логический
Символьные
Перечисления
Массивы
Структуры
Объединения
2

3.

Перечисления
Перечисление – тип данных, все возможные значения
которого задаются списком целочисленных констант:
enum
[имя_типа] { значение1, значение2,
… };
Элементы, которые не инициализированы явно, получают
значения предшествующих им элементов, увеличенные на
единицу. Первому элементу присваивается значение 0.
Пример кода
enum Animal {Cat, Dog, Tiger, Elephant};
enum Error {ERR_READ = 101, ERR_WRITE};
// Animal – это новый тип, Elephant - константа
Animal a1 = Elephant; //инициализация a1 <- 3
Error e1;
e1 = ERR_WRITE;
// e1 <- 102
3

4.

Перечисления. Пример.
//создание нового типа Animal
enum Animal{Cat, Dog, Tiger, Elephant};
int x;
//ввод числа в диапазоне 0…3
do {
cout << "Введите зверя (0-3)\n";
cin >> x;
} while(x < 0 || x > 3);
Animal animal = (Animal)x; //преобразование
switch (animal){ //выбираем с кем играть
case Cat: cout << "PLAY with CAT\n"; break;
case Dog: cout << "PLAY with DOG\n"; break;
case Tiger: cout << "PLAY with TIGER\n"; break;
case Elephant: cout << "PLAY with ELEPHANT\n";
}
4

5.

Объявление массивов
Массив - это объединение нескольких элементов данных
одного типа: Тип_данных имя_массива[число_элементов];
Тип и число элементов определяют объем памяти,
выделяемой под массив. Число элементов должно быть
целым положительным числом и может быть задано
константами или константными выражениями.
Пример кода
int months[12];
Animal animals[200];
enum {MIN = 20, MAX = 200};
double values[MIN*10];
5

6.

Инициализация массивов
6
При определении можно инициализировать элементы массива,
для этого после имени ставят знак равенства и в фигурных
скобках по порядку перечисляют значения элементов:
Тип имя[число_элементов] = { значение1, значение2, … };
Неинициализированным элементам присваивается значение
0 (глобальный массив) и неопределенное значение
(локальный массив). Если значений больше, чем размер
массива, то выдается сообщение об ошибке. Если размер не
указан, то он вычисляется по числу элементов.
Пример кода
double values[3] = {1.23, 4.56}; //размер 3
double values[] = {1.23, 4.56};
//размер 2

7.

Доступ к элементам массива
Доступ к элементам массива осуществляется при помощи
индекса, указанного в квадратных скобках. Индекс первого
элемента массива всегда равен 0. Индекс последнего
элемента равен числу элементов массива минус единица.
Пример кода
int values[3];
values[0] = 1;
values[1] = 4;
values[2] = 7;
//доступ к ячейке массива через переменную
for(int i = 0; i < 3; i++)
cout << values[i] << endl;
int z = values[values[0]+1];
//z <- values[2]
int x = values[3]; //ошибка, выход за размер
7

8.

Строки как массивы
Строки символов представляют собой массив типа char. В
стандарте языка С предусмотрены ASCIIZ строки,
заканчивающиеся символом '\0' (нуль-терминатором). При
инициализации
строки
константой
нуль-терминатор
автоматически подставляется компилятором в конец строки.
Пример кода
char country[] = "Russia";
char country[7] = {'R', 'u', 's', 's', 'i', 'a', '\0'};
char country[7];
country[0] = 'R';
//нет оператора
country[1] = 'u';
//для присваивания строк,
country[2] = 's';
//только для символов
country[3] = 's';
country[4] = 'i';
//строки копируются
country[5] = 'a';
//функцией strcpy
country[6] = ‘\0';
8

9.

Многомерные массивы
Язык С поддерживает многомерные массивы. Размерность
определяется числом индексов, используемых для ссылки
на конкретный элемент массива. Элементы многомерного
массива последовательно размещаются в памяти, при этом
быстрее всего меняется последний индекс.
Пример кода
int matrix[3][2]; //размер:строк = 3,столб. = 2
//два варианта инициализации двумерного массива
int matrix[3][2] = {{11, 12}, {21, 22}, {31, 32}};
// массив в С и С++ хранится по строкам
int matrix[3][2] = {11, 12, 21, 22, 31, 32};
matrix[0][0] = 11; matrix[0][1] = 12;//доступ к
matrix[1][0] = 21; matrix[1][1] = 22;// ячейкам
matrix[2][0] = 31; matrix[2][1] = 32;// массива
9

10.

Объявление структур
10
Структура является набором элементов (почти) произвольных
типов:
struct [имя_структуры]
{
тип_1 элемент_1;
тип_2 элемент_2;

};
Пример кода
struct Product
{
int
code;
char
name[20];
//массив внутри структуры
double price;
char
comment[256];//массив внутри структуры
};

11.

11
Объявление структурных переменных
Структурные переменные объявляются стандартным образом.
В качестве типа используется имя структуры (только С++).
Структурные переменные могут быть элементами массивов.
Пример кода
Product product1;
//объявлена переменная
Product products[20]; //объявлен массив структур
struct MyComplex
{
double real, imag;
} value1, value2;
//объявлено две переменные

12.

Инициализация структурных
переменных
12
Структурные переменные могут инициализироваться при их
определении. Для этого после имени переменной
располагают оператор присваивания и в фигурных скобках
перечисляют значения полей структуры. Нет необходимости
инициализировать все элементы структуры.
Пример кода
Product products[20] =
{
{1, "Яблоки",
55.50, "Сорт \"Гольден\""},
{2, "Апельсины", 45.00},
{5, "Бананы",
22.00},
{8, "Груши",
64.45, "Очень спелые!"},
{4, "Сливы",
82.50},
{6, "Грейпфруты"}
};

13.

Доступ к элементам структур
13
Для доступа к отдельным элементам (полям) структурных
переменных используется оператор ".", который связывает
имя структурной переменной и имя поля.
Пример кода
Product product;
product.code
= 1;
//задать код
// копирование строки при помощи функции strcpy
strcpy(product.name, "Яблоки");
product.price = 55.50;
product.comment[0] = 0;
//задать цену
//комментариев нет
MyComplex complex[2]= {{1, 2},{3, 4}};
double value = complex[1].real; //value <- 3

14.

Объединения
Объединения можно рассматривать как структуру, все поля
которой располагаются по одному и тому же адресу:
union [имя_объединения]
{
тип_1 элемент_1;
тип_2 элемент_2;

};
Длина объединения равна длине наибольшего поля.
Пример кода
union Number
{
char
b1;
short b2;
long
b4;
};
14

15.

Доступ к элементам объединений
15
В любой момент времени в объединении может храниться
актуальное значение только для одного поля.
Пример кода
Number num;
num.b4 = 0xAABBCCDD;
cout << hex << num.b4 << endl;
num.b1 = 'a';
cout << hex << num.b4 << '\t' << num.b1 << endl;
num.b2 = 0xFFFF;
cout << hex << num.b4 << endl;
aabbccdd
aabbcc61
aabbffff
a

16.

Безымянное объединение
16
Когда объединение расположено внутри структуры, то имеет
смысл сделать его безымянным. В этом случае обращение к
его полям упрощается.
Пример кода
struct Т
{
bool type;
//type хранит информацию,
//какое поле с или i активно
union {
//безымянное объединение
char c;
int i; };
} Value;
//Value переменная типа Т
if(Value.type) cout << Value.c << endl;
else cout << Value.i << endl;

17.

Создание новых типов данных
17
Оператор typedef позволяет определять новые типы
данных на основе уже существующих.
Пример кода
typedef double real; //real синоним для double
real v1, v2;
//определение типа структуры Vector
//старый способ, был изначально в языке С
typedef struct {int x; int y} Vector;
Vector vec[1000];
typedef long[64] LONG_ARRAY;
LONG_ARRAY arr;
//long arr[64]

18.

Определение размера переменных
в памяти с помощью sizeof
18
Оператор sizeof позволяет определить размер в байтах,
занимаемый в памяти переменной, массивом, структурой
или любым типом данных.
Пример кода
long y[] = {43, 56, 34};
int s1 = sizeof(long); //размер типа long
int s2 = sizeof(y);
//размер массива y
int n = sizeof(y)/sizeof(long); //n <- 3

19.

19
Выравнивание данных в структурах
a
A
b
Пример структуры
c
sizeof(A) = 12
a1
a
b
c
a2
a
b
c
struct A
{
short a;
float b;
char c;
} a1, a2;
В структурах компилятор
применяет выравнивание.
Каждое поле
выравнивается на границу,
кратную параметру
выравнивания.

20.

Оптимальное размещение данных
в структурах
Пример структур
A1
b
a
c
sizeof(A1) = 12
a
c
A2
b
sizeof(A2) = 8
struct A1
{
short a;
float b;
char c;
};
struct A2
{
short a;
char c;
float b;
};
20

21.

Пример определения данных
различной размерности (1)
Простые данные (переменные)
Время, Температура, Влажность,
чч:мм
С
%
10:25
24.4
21
struct Time
{
char h;
char m;
};
42
Time time;
time.h = 10;
time.m = 25;
double temp = 24.4;
double humi = 42;

22.

Пример определения данных
различной размерности (2)
Наборы данных (массивы)
Время, Температура, Влажность,
чч:мм
С
%
10:25
24.4
42
11:19
24.2
47
Time time[2];
time[0].h = 10;
time[0].m = 25;
time[1].h = 11;
time[1].m = 19;
double temp[2];
temp[0] = 24.4;
temp[1] = 24.2;
double humi[2];
humi[0] = 42;
humi[1] = 47;
22

23.

Пример определения данных
различной размерности (3)
Группы данных (структуры)
Время, Температура, Влажность,
чч:мм
С
%
10:25
24.4
42
struct Mesure
{
Time time;
double temp;
double humi;
};
Mesure mes;
mes.time.h = 10;
mes.time.m = 25;
mes.temp = 24.4;
mes.humi = 42;
23

24.

Пример определения данных
различной размерности (4)
Наборы групп данных
Время, Температура, Влажность,
чч:мм
С
%
10:25
24.4
42
11:19
24.2
47
24
Mesure mes[2];
mes[0].time.h = 10;
mes[0].time.m = 25;
mes[0].temp = 24.4;
mes[0].humi = 42;
mes[1].time.h = 11;
mes[1].time.m = 19;
mes[1].temp = 24.2;
mes[1].humi = 47;
English     Русский Rules