- •Тема 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 ()
Void main()
{person p={"Чапаев", "Василий", "Иванович",
{28, "янв" , 1887}};
cout << Rus(p.fam) << "\n";
cout << Rus(p.name)<< " " << Rus(p.sname) << "\n";
cout << p.bdate.day << " "
<< Rus (p.bdate.mon) << " "
<< p.bdate.year;
getch();
}
Перечислим операции, которые допустимы над структурами:
- доступ к элементу структуры с помощью операции "." (точка).
- доступ к элементу структуры по указателю с помощью операции "->" в виде: <указатель на структуру> -> <элемент_структуры>. Так, обращения pd->year и (*pd).year эквивалентны. Круглые скобки (*pd) необходимы, поскольку операция "." доступа к элементу структуры старше, чем "*";
- определение адреса структуры с помощью операции "&";
- инициализация структур внешнего и статического класса памяти;
- присваивание структуры как единого целого;
- передача структуры в качестве параметра функции и возвращение структуры в результате работы функции;
- передача отдельных компонент структуры в качестве аргументов функции;
#include <stdio.h>
#include <windows.h>
#include <conio.h>
char bufRus[256];
char* Rus(const char* text){
CharToOem(text, bufRus);
return bufRus;}
struct Name
{char fam[10];
char name[10];};
Void NamePrint(Name a)
{printf("%-15s%-10s\n",a.fam,a.name);}
Void NameInput(Name *a)
{printf(Rus("Введите фамилию: "));
scanf("%10s",a->fam);
printf(Rus("Введите имя: "));
scanf("%10s",a->name);}
Void main()
{
Name first,second;
clrscr();
printf(Rus("Программа использующая структуры\n"));
NameInput(&first);
NameInput(&second);
NamePrint(first);
NamePrint(second);
printf(Rus("\nДля завершения нажмите любую клавишу"));
getch();
}
#include <stdio.h>
#include <windows.h>
#include <conio.h>
char bufRus[256];
char* Rus(const char* text){
CharToOem(text, bufRus);
return bufRus;}
struct Name
{char fam[15];
char name[10];};
Void NamePrint(Name a)
{printf("%-15s%-10s\n",a.fam,a.name);}
Void NameInput(Name *a, int n)
{clrscr();
printf(Rus("Введите фамилию и имя: "));
scanf("%s%s",a[n].fam,a[n].name);}
Void main()
{Name list[5];
for (int i=0; i<5; i++) NameInput(list,i);
clrscr();
printf(Rus("Введен список:\n"));
for (int i=0; i<5; i++) NamePrint(list[i]);
printf(Rus("\nДля завершения нажмите любую клавишу"));
getch();
}
Если p - указатель на структуру, то
(++p)->x - операция увеличивает p до доступа к x;
(p++)->x - операция увеличивает p после доступа к x (круглые скобки не обязательны, так как по старшинству раньше будет применена операция "->");
*p->y - выбирается содержимое объекта, на который указывает y;
*p->y++ - увеличивается y после обработки того, на что он указывает (аналогично *s++);
*p++->y - увеличивает p после выборки того, на что указывает y;
(*(*p).y)++ - увеличивает то, на что указывает y.
Можно отметить одно очень важное использование структур: создание новых типов данных. Существуют типы данных, гораздо более эффективные при решении определенных задач, чем массивы и структуры. Это очереди, двоичные деревья, множества, таблицы и графы. Многие из этих типов создаются из "связанных" структур. Обычно каждая такая структура содержит один или два типа данных плюс один или два указателя на другие структуры такого же типа. Указатели служат для связи одной структуры с другой и для обеспечения пути, позволяющего вести поиск по всей структуре.
