Доступ к значению поля в структуре
ЛАБОРАТОРНАЯ РАБОТА №9
Комбиированный тип - Структура
Тип данных –- struct
Структура – тип определяемый пользователем. Этот тип данных используется для представления в программе объектов, обладающих несколькими свойствами возможно различного типа. Например, объект Книга, может быть определена свойствами: фамилия автора, название книги, год издания, издательство. Структура позволяет представить объект, обладающий несколькими свойствами, одной переменной.
Формат определения типа
struct ИМЯ
{
список определений простых полей – переменные и константы любого типа языка;
[список битовых полей – переменные, позволяющие именовать последовательность битов]
}
Формат определения простого поля
Простое поле – это переменная или константа. Они определяются по тем же правилам, то и просто переменная и константа.
спецификатор типа имя поля
Пример определения структуры с простыми полями для хранения данных по служащему: ФИО – строка длиной 20, возраст – целое число целое, пол – символ, количество детей – целое число.
struct Employee
{
char fio [20];
unsigned sort age; //возраст 0..100 – 2байта
unsigned char sex; // пол М или Ж -1 байт
unsigned sort children; // количество детей – 2 байта
};
Employee e; // e – переменная типа Employee
Формат определения списка битовых полей
Используется для более экономного использования памяти. Очень эффективно использовать структуру с битовыми полями в структуре типа uion.
|
|
В списке битовых полей могут быть указаны два вида полей:
· Битовое поле;
· Заполнитель.
Формат определения битового поля
спецификатор типа имя типа:количество битов
Формат определения заполнителя
Поле – заполнитель используется для выравнивания битовых полей на границу определенного бита.
спецификатор типа : количество битов
Пример определения битовых полей
Организации прямого доступа к трем первым битам, двум битам с номерами, 7 и 8, и четырем старшим битам ячейки типа short.
struct two_byte
{
unsigned short bit13_14_15:3;
unsigned short : 4;
unsigned short bit7_8:2;
unsigned short : 4;
unsigned short bit0_1_2:3;
};
two_byte x; //переменная типа two_byte
Правила создания типа struct
1. Имя поля должно быть уникально в пределах одного типа struct.
2. Тип поля – это любой тип языка, включая массивы и структуры Си.
3.Если несколько полей имеют одинаковый тип, то их имена можно перечислить через запятую.
Примеры определения переменных типа struct
1) Для хранения информации о точке на плоскости.
struct point
{
double x,y;
};
point P;
2) Определение переменной и ее инициализация
|
|
struct point
{
double x,y;
};
point P={0,1};
3) Переменная должна хранить фамилию студента и шесть оценок за экзамены в сессию.
struct TSessia
{
char Fam[40];
unsigned short marks[6];
};
TSessia S;
TSessia S={“Иванов”,{4, 5, 4, 5, 4, 5};
4) Переменная должна хранить анкетные данные сотрудника: фамилия, дата рождения, адрес.
Дата рождения характеризуется тремя значениями: номер дня, номер месяца, номер года.
Адрес характеризуется значениями: город, улица, номер дома, номер квартиры.
Определим три структуры: Tdate, Tadress, TEmploye
struct Tdate
{
unsigned short day;
unsigned short month;
unsigned short year;
};
struct Tadress
{
char city[30];
char street[50];
unsigned short NumHause, NumRoom;
};
struct Temploye
{
char Fam[40];
Tdate Date;
Tadress Adress;
};
Temploye E;
Temploye E1={“Иванов”,{1,12,1999},{“Москва”, “ул.Xxxxxx”, 15,20}};
Tadress A;
Tdate d;
5) Массив структур. Требуется хранить данные по 40 точкам на плоскости.
Tpoint mas[40];
Пример более экономного использования памяти для размещения переменной
struct emp
{
char fam[40];
unsigned short age; // возраст
unsigned short sex; //пол
unsigned short child; //количество детей
};
emp e; //для переменной 46 байт
Значение возраста до 120 – достаточно 7 бит, для значения пола достаточно одного бита, для количества детей достаточно 5 бит. В итоге всего достаточно 13 бит. Так как память выделяется байтами, то под эти значения достаточно двух байтов.
|
|
struct emp
{
char fam[40];
unsigned short age:7; // возраст
unsigned short sex:1; //пол
unsigned short child:5; //количество детей
unsigned short:3;
};
emp e; //объем памяти переменной 42 байта
Представление переменной типа struct в памяти
1) Переменная R для представления точки на плоскости
Tpoint R;
x | y |
2) Переменная S типа Tsession
Поле Fam | Поле marks-массив |
3) Переменная Е типа TEmploye
day | month | year | city | street | NumHouse | NumRoom | |
Fam | Date | Adress |
Доступ к значению поля в структуре
Доступ к полю прямой – по имени поля - уточненное имя. Уточненное имя формируется по правилу:
имя переменной.имя поля.
Если имя поля в свою очередь представляет переменную типа запись, то правило распространяется на имя этого поля.
Примеры формирования имени.
1) Имя поля переменной R
Tpoint R;
R.x или R.y
2) Доступ к значению оценки по третьему экзамену в сессию.
TSession S;
S.marks[3]
3) Доступ к значению поля сity переменной E.
TEmploye E;
E.Adress.сity или E.Adress.street
4) Доступ к полю элемента массива.
Tpoint mas[40];
mas[3].x или mas[3].y
5) Доступ к битовым полям
|
|
e.age=43;
6) Структура и указатель
TEmploye *e;
Доступ к полю через разыменование. Два способа:.
· явно
имя поля (*указатель).имя поля
· неявно
указатель->имя поля
Employee *e2;
int main(int argc, char* argv[])
{
// способ 1- явное разыменование
cout<<(*e2).fio; //скобки (*e2). т.к. операция «точка» имеет // приоритет выше чем *
cout<<(*e2).age<<endl;
//способ 2 – неявное разыменование
cin>>(e2->fio);
cin>>age;
e2->age=age;
cout<<(e2->fio);
cout<<(e2->age)<<endl; return 0;
}
Дата добавления: 2018-04-05; просмотров: 243; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!