Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
lesson_16.doc
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
134 Кб
Скачать
☆

Особенности структур.

1. Описание структуры начинается со служебного слова struct, за которым может следовать необязательное имя, называемое именем типа структуры (здесь это date). Это имя типа структуры используется в дальнейшем для создания конкретного объекта.

2. За именем типа структуры идет заключенный в фигурные скобки список элементов структуры, с описанием типа каждого элемента (элементом структуры может быть переменная, массив или структура). Элементы структуры отделяются друг от друга точкой с запятой. Например:

struct date

{

int day;

int month;

int year;

int yearday;

char mon_name[5];

};

3. За правой фигурной скобкой, закрывающей список элементов, может следовать список объектов. Например, оператор struct date {...} x,y,z; определяет переменные x,y,z в качестве структур описанного типа и приводит к выделению памяти.

Изобразим распределение памяти для структуры x типа date:

4. Описание структуры, за которым не следует список объектов, не приводит к выделению памяти (как в программе выше); оно только определяет шаблон (форму) структуры. Однако, если такое описание снабжено именем типа (например, date), то это имя типа может быть использовано позднее при определении объектов структур (определение структур your_birthday и my_birthday в программе).

5. Структуру можно инициализировать, поместив вслед за ее определением список инициализаторов для ее компонент, заключенный в фигурные скобки. В программе таким образом инициализирована структура my_birthday.

date my_birthday={20,7,1981,1,"July"};

6. Обращение к определенному члену структуры производится с помощью конструкции вида:

<имя структуры>.<имя элемента>

7. Структуры могут вкладываться одна в другую, но самовложение структур запрещено!

Например, учетная карточка служащего может выглядеть так:

struct date

{

int day; // День.

char month[10]; // Месяц.

int year; // Год.

};

struct person

{

char name[namesize]; // Имя, фамилия, отчество.

char address[adrsize]; // Домашний адрес.

int zipcode[2]; // Почтовый индекс.

int s_number [2]; // Код соц.обеспечения.

int salary[4]; // Зарплата.

date birthdate; // Дата рождения.

date hiredate; // Дата поступления на работу.

};

Структура person содержит две структуры типа date и наша программа должна содержать шаблон для структуры date.

Если определить переменную Nick следующим образом:

struct person Nick;

то Nick.birthdate.month будет обозначать месяц рождения. Операция доступа к элементу структуры "." вычисляется слева направо.

А, теперь, рассмотрев основы, перейдем к тому, что же можно делать со структурами. Для этого открываем следующий раздел данного урока.

Действия над структурами.

Итак, разберем операции, которые допустимо производить над структурами.

  1. Доступ к элементу структуры с помощью операции "." (точка).

  2. Доступ к элементу структуры по указателю с помощью операции "->" в виде: <указатель на структуру>"->"<элемент_структуры>. Так, обращения pd->year и (*pd).year эквивалентны. Круглые скобки (*pd) необходимы, поскольку операция "." доступа к элементу структуры старше, чем "*".

  3. Определение адреса структуры с помощью операции "&".

    #include <iostream>

    using namespace std;

    //Описание структуры с именем date.

    struct date

    {

    int day;

    int month;

    int year;

    char mon_name[12];

    };

    //Создание и инициализация объекта структуры.

    date d = { 2,5,1776,"July" }; //d - переменная типа date.

    void main ()

    {

    // Указатель p указывает на структуру типа date.

    struct date *p;

    // Показ содержимого структуры на экран

    //(обращение через объект)

    cout<< d.day << " ";

    cout<< d.year << " ";

    cout<< d.month << " ";

    cout<< d.mon_name << "\n\n";

    // запись адреса объкта структуры в указатель

    p = &d;

    // Показ содержимого структуры на экран

    //(обращение через указатель)

    cout << p->day << " ";

    cout << p->month << " ";

    cout << p->year << " ";

    cout << p->mon_name << "\n\n";

    }

  4. Присваивание структуры как единого целого.

    #include <iostream>

    using namespace std;

    struct date

    {

    int day;

    int month;

    int year;

    char mon_name[12];

    };

    date a = { 14,7,1954,"July" };

    date b;

    void main ()

    {

    // показ содержимого объекта a

    cout<< a.day << " ";

    cout<< a.year << " ";

    cout<< a.month << " ";

    cout<< a.mon_name << "\n\n";

    // инициализация объкта b объектом a

    b = a;

    // показ содержимого объекта b

    cout<< b.day << " ";

    cout<< b.year << " ";

    cout<< b.month << " ";

    cout<< b.mon_name << "\n\n";

    }

  5. Передача структуры в качестве параметра функции и возвращение структуры в результате работы функции.

    #include <iostream>

    using namespace std;

    struct date

    {

    int day;

    int month;

    int year;

    char mon_name[12];

    };

    void Show(date a){

    // показ содержимого объекта a

    cout<< a.day << " ";

    cout<< a.year << " ";

    cout<< a.month << " ";

    cout<< a.mon_name << "\n\n";

    }

    date Put(){

    // формирование объкта

    date temp;

    cout<<"DAY ? ";

    cin>>temp.day;

    cout<<"MONTH ? ";

    cin>>temp.month;

    cout<<"YEAR ? ";

    cin>>temp.year;

    cout<<"MONTH NAME ? ";

    cin>>temp.mon_name;

    return temp;

    }

    date a = { 14,7,1954,"July" };

    date b;

    void main ()

    {

    // передача объекта в функцию

    Show(a);

    // получение объекта в качестве возвращаемого значения

    b=Put();

    // показ содержимого объекта b

    Show(b);

    }

  6. Передача отдельных компонент структуры в качестве аргументов функции. Например, для функции day_of_year1:

#include <iostream>

using namespace std;

// вспомогательный массив, отвечающий за месяцы в году

int day_tab[2][13]=

{0,31,28,31,30,31,30,31,31,30,31,30,31,

0,31,29,31,30,31,30,31,31,30,31,30,31};

struct date

{

int day;

int month;

int year;

int dayyear;

char mon_name[12];

};

void Show(date a){

// показ содержимого объекта a

cout<< a.day << " ";

cout<< a.year << " ";

cout<< a.month << " ";

cout<< a.dayyear << " ";

cout<< a.mon_name << "\n\n";

}

int day_of_year1 (int day,int month,int year)

{

//Вычисление дня в году с помощью месяца и года.

int i, leap;

leap = year%4==0 && year%100!=0 || year%400==0;

for (i=1; i < month; i++)

day += day_tab[leap][i];

return (day);

}

date a = {20,7,1981,0,"July"};

void main ()

{

// передача отдельных членов функцию

a.dayyear=day_of_year1(a.day,a.month,a.year);

// показ содержимого объекта a

Show(a);

}

А теперь, рассмотрим порядок выполнения некоторых наиболее распространенных операций над элементами структуры на примере следующего описания:

struct

{

int x;

int *y;

} *p; // p - указатель на структуру.

  • (++p)->x - операция увеличивает p до доступа к x;

  • (p++)->x - операция увеличивает p после доступа к x (круглые скобки не обязательны, так как по старшинству раньше будет применена операция "->");

  • *p->y - выбирается содержимое объекта, на который указывает y;

  • *p->y++ - увеличивается y после обработки того, на что он указывает (аналогично *s++);

  • *p++->y - увеличивает p после выборки того, на что указывает y;

  • (*(*p).y)++ - увеличивает то, на что указывает y.

Можно отметить одно очень важное использование структур: создание новых типов данных. Существуют типы данных, гораздо более эффективные при решении определенных задач, чем массивы и структуры. Это очереди, двоичные деревья, множества, таблицы и графы. Многие из этих типов создаются из "связанных" структур. Обычно каждая такая структура содержит один или два типа данных плюс один или два указателя на другие структуры такого же типа. Указатели служат для связи одной структуры с другой и для обеспечения пути, позволяющего вести поиск по всей структуре.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]