- •Тема 6. Определяемые пользователем типы: структуры, объединения и поля
- •6.1. Перечисления
- •Void main()
- •6.2. Структуры
- •Int date, code;
- •Int date, code;
- •Int date, code;
- •Int month;
- •Int year;
- •Void main ()
- •Int year;}; // Год.
- •Void main()
- •Void NamePrint(Name a)
- •Void NameInput(Name *a)
- •Void main()
- •Void NamePrint(Name a)
- •Void NameInput(Name *a, int n)
- •Void main()
- •6.2 Битовые поля
- •Void main()
- •6.3. Объединения
- •Void main ()
Int date, code;
double money;
} mas[200], *ps;
Если список отсутствует, описание структуры определяет новый тип, имя которого можно использовать в дальнейшем наряду со стандартными типами, например:
struct Man
{ //описание нового типа Man
char Surname [25];
или char* Surname;
Int date, code;
double money;
}; // описание заканчивается точкой с запятой
// определение массива типа Man и указателя на тип Man:
. . .
Man mas[200], *ps;
Для инициализации структуры значения ее элементов перечисляют в фигурных скобках в порядке их описания:
struct
{
char Surname [25];
Int date, code;
double money;
} Man = {"Иванов", 26, 119, 195000.5};
При инициализации массивов структур следует заключать в фигурные скобки каждый элемент массива (учитывая, что многомерный массив - это массив массивов):
struct complex
{float Real, Im;}
compl [2][3] = {
{{1, 1}, {1, 1}, {1, 1}}, // строка 1, то есть массив compl[0]
{{2, 2}, {2, 2}, {2, 2}} // строка 2, то есть массив compl[1]
};
Доступ к полям структуры выполняется с помощью операций выбора “.” (точка) при обращении к полю через имя структуры и -> при обращении через указатель, например:
Man men, mas[200], *ps;
men.Surname = "Иванов";
mas[8].code = 119;
ps->money = 9500.55;
strcpy(men.Surname, "Иванов");
Пример:
#include <iostream.h>
#include <conio.h>
#include <windows.h>
char bufRus[256];
char* Rus(const char* text){
CharToOem(text, bufRus);
return bufRus;}
struct date
{ int day;
Int month;
Int year;
char mon_name[8];
};
date d = { 4,10,2011,"окт"};
Void main ()
{ struct date *p;
cout << Rus("\nДоступ к структуре по имени: \n");
cout << d.day << "."<< d.month <<"." << d.year;
p = &d;
d.day=14;
p->year=2010;
strcpy(p->mon_name, "янв");
cout << Rus("\nДоступ к структуре по указателю: \n");
cout << p->day << " " << Rus(p->mon_name) << " " << p->year;
getch();
}
Если элементом структуры является другая структура, то доступ к ее элементам выполняется через две операции выбора:
struct A {int a; double x;};
struct B {A a; double x;} x[2], n, *pB;
...
x[0].a.a = 1; x[0].a.x = 13.54; x[0].x = 0.1;
pB=&n;
pB->a.a=4; pB->a.x=25.454; pB->x=0.35;
Как видно из примера, поля разных структур могут иметь одинаковые имена, поскольку у них разная область видимости. Более того, можно объявлять в одной области видимости структуру и другой объект (например, переменную или массив) с одинаковыми именами, если при определении структурной переменной использовать слово struct.
#include <iostream.h>
#include <conio.h>
#include <windows.h>
char bufRus[256];
char* Rus(const char* text){
CharToOem(text, bufRus);
return bufRus;}
struct date
{ int day; // День.
char mon[8]; // Месяц.
Int year;}; // Год.
struct person
{ char fam[15]; // Фамилия
char name[10]; // Имя
char sname[15];// Отчество
date bdate;}; // Дата рождения.
