Из урока 16 вы узнали, что C++ позволяет хранить в массиве связанную информацию одного и того же типа. Вы уже выяснили, что группировка связанных значений в массив очень удобна. В большинстве случаев программам необходимо группировать связанную информацию разного типа. Например предположим, что ваша программа работает с информацией о служащих. Она должна отслеживать данные о фамилии, возрасте, окладе, адресе, номере служащего и т. д. Для хранения этой информации программе потребуются переменные типаchar, int, float, а также символьные строки.

Если вашей программе требуется хранить связанную информацию разных типов, она может использовать структуру. Вы узнаете, что структура представляет собой переменную, группирующую связанные части информации, называемые элементами, типы которых могут различаться. Группируя данные в одну переменную подобным образом, вы упрощаете ваши программы, снижая количество переменных, которыми необходимо управлять, передавать в функции и т. д. В данном уроке рассматривается создание и использование структур. К концу этого урока вы освоите следующие основные концепции:

  • Структуры позволяют вашим программам группировать в одной переменной связанные данные, типы которых могут различаться.
  • Структура состоит из одной или нескольких частей данных, называемых элементами.
  • Для определения структуры внутри программы следует указать имя структуры и ее элементы.
  • Каждый элемент структуры имеет тип, напримерchar, int и float, и имя каждого элемента должно быть уникальным.
  • После того как ваша программа определит структуру, она может объявить переменные типа этой структуры.
  • Для изменения элементов структуры внутри функции ваши программы должны передать структуру в функцию с помощью адреса.

Ваше умение понимать структуры и работать с ними облегчит использование объектно-ориентированных классов C++ в части 4. Выберите время для эксперимента с программами, представленными в этом уроке.

ОБЪЯВЛЕНИЕ СТРУКТУРЫ

Структура определяет шаблон, с помощью которого ваша программа может позднее объявить одну или несколько переменных. Другими словами, ваша программа сначала определяет структуру, а затем объявляет переменные типа этой структуры. Для определения структуры ваши программы используют ключевое словоstruct, за которым обычно следует имя и левая фигурная скобка. Следом за открывающей фигурной скобкой вы указываете тип и имя одного или нескольких элементов. За последним элементом вы размещаете правую закрывающую фигурную скобку. В этот момент вы можете (необязательно) объявить переменные данной структуры:

struct name

{
   int member_name_l; |——————Объявления элементов структуры
   float member_name_2; } variable; |———————————————Объявление переменной
} 

Например, следующее определение создает структуру, содержащую информацию о служащем:

struct employee

{
   char name [64] ;
   long employee_id;
   float salary;
   char phone[10];
   int office_number;
};

В данном случае определение не объявляет какие-либо переменные типа этой структуры. После того как вы определите структуру, ваша программа может объявить переменные типа этой структуры, используя имя структуры (иногда называемое структурным тэгом), как показано ниже:

—————————————————————————— Тэг

employeeboss, worker, new_employee;Объявление переменных

В данном случае оператор создает три переменные структурыemployee. В некоторых случаях вы можете увидеть объявление, в котором тэг структуры предваряется ключевым словомstruct, как показано ниже:

struct employee boss, worker, new_employee;

Ключевое словоstruct является обязательным при программировании на С, так что некоторые программисты могут включать его по привычке. Однако в C++ использовать ключевое словоstruct необязательно.

Использование элементов структуры

Структура позволяет вашим программам группировать информацию, называемую элементами, в одной переменной. Чтобы присвоить значение элементу или обратиться к значению элемента, используйте оператор C++ точку (.). Например, следующие операторы присваивают значения различным элементам переменной с именемworker тута employee;

worker.employee_id = 12345;

worker.salary = 25000.00;

worker.оffice_number = 102;

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

#include  

#include

void main(void)

{
    struct employee

   {
      char name [64];
      long employee_id;
      float salary;
      char phone[10];
      int office_number;
   } worker;

// Копировать имя в строку strcpy(worker.name, "Джон Дой");

   worker.employee_id = 12345;
   worker.salary = 25000.00;
   worker.office_number = 102;

// Копировать номер телефона в строку strcpy(worker.phone, "555-1212") ;

   cout << "Служащий:" << worker.name << endl;
   cout << "Телефон:" << worker.phone << endl;
   cout << "Номер служащего: "<< worker.employee_id << endl;
   cout << "Оклад:" << worker.salary << endl;
   cout << "Офис:" << worker.office_number << endl;
}

Как видите, присваивание целому элементу и элементу с плавающей точкой очень просто. Программа использует оператор присваивания, чтобы присвоить значение соответствующему элементу. Однако обратите внимание на использование функцииstrcpy для копирования символьной строки в элементыname иphone. Если вы не инициализируете элементы при объявлении переменной типа данной структуры, вы должны копировать символьные строки в символьно-строковые элементы.

Объявление переменных структуры

Структуры C++ позволяют вашим программам группировать в одну переменную связанную информацию различных типов. Структура определяет шаблон для объявлений будущих переменных вашей программы. Каждая структура имеет уникальное имя (иногда называемое тэгом). Используя имя структуры, вы можете объявить переменные типа данной структуры. Биты информации, хранящиеся в структуре, называются элементами. Чтобы использовать или присвоить значение элементу, используйте оператор C++ точку, как показано ниже:

variable.member = some_value;
some_variable = variable.other_member;

СТРУКТУРЫ И ФУНКЦИИ

Если функция не изменяет структуру, вы можете передать структуру в функцию по имени. Например, следующая программа SHOW_EMP.CPP использует функциюshow_employee для вывода элементов структуры типаemployee:

#include  

#include

struct employee

{
   char name[64];
   long employee_id;
   float salary;
   char phone[10];
   int office_number;
};

void show_employee(employee worker)

{
   cout << "Служащий:" << worker.name << endl;
   cout << "Телефон:" << worker.phone << endl;
   cout << "Номер служащего: "<< worker. employee_id << endl;
   cout << "Оклад:" << worker.salary << endl;
   cout << "Офис:" << worker.office_number << endl;
}

void main(void)

{
   employee worker;

// Копировать имя в строку strcpy(worker.name, "Джон Дой");

   worker.employee_id = 12345;
   worker.salary = 25000.00;
   worker.office_number = 102;

// Копировать номер телефона в строку strcpy(worker.phone, "555-1212");

   show_employee(worker);
}

Как видите, программа передает переменную типа данной структуры worker в функциюshow__employee по имени. Далее функцияshow_employee выводит элементы структуры. Однако обратите внимание, что программа теперь определяет структуруemployee внеmain и до функцииshow_employee. Поскольку функция объявляет переменнуюworker типаemployee, определение структурыemployee должно располагаться до функции.

Функции, изменяющие элементы структуры

Как вы знаете, если функция изменяет параметр, вам следует передавать этот параметр в функцию с помощью адреса. Если функция изменяет элемент структуры, вы должны передавать эту структуру в функцию с помощью адреса, Для передачи переменной типа структуры с помощью адреса вы просто предваряете имя переменной оператором адреса C++ (&), как показано ниже:

some_function(&worker);

Внутри функции, которая изменяет один или несколько элементов, вам следует работать с указателем. Если вы используете указатель на структуру, легче всего обращаться к элементам структуры, используя следующий синтаксис:

pointer_variable->member = some_value;

Например, следующая программа CHG_MBR.CPP передает структуру типаemployee в функцию с именемget_employee_id, которая запрашивает у пользователя идентификационный номер служащего и затем присваивает этот номер элементу структурыemployee_id. Чтобы изменить элемент, функция работает с указателем на структуру:

#include  

#include

struct employee

{
   char name[64];
   long employee_id;
   float salary;
   char phone[10];
   int office_number;
};

void get_employee_id(employee *worker)

{
   cout << "Введите номер служащего:";
   cin >> worker->employee_id;
}

void main(void)

{
   employee worker;

// Копировать имя в строку strcpy(worker.name, "Джон Дой");

   get_employee_id(&worker) ;
   cout << "Служащий: "<< worker, name << endl;
   cout << "Номер служащего: "<< worker.employee_id << endl;
}

Как видите, внутриmain программа передает переменнуюworker типа структуры в функциюget_employee_id с помощью адреса. Внутри функции gel_employee_id значение, введенное пользователем, присваивается элементу employee_id с помощью следующего оператора:

cin >> worker->employee_id;

Работа с указателями на структуры

Если функция изменяет элемент структуры, вызвавшая программа должна передать структуру в функцию с помощью адреса. Функция, в свою очередь, использует указатель на структуру. Для обращения к элементу структуры функции следует использовать следующий формат:

value = variable->member;
variable->other_member = some_value;

ЧТО ВАМ НЕОБХОДИМО ЗНАТЬ

Структуры позволяют вашим программам группировать связанные части информации различных типов в одной и той же переменной. Комбинируя подобным образом данные в одной переменной, ваши программы могут лучше представлять объекты, состоящие из двух или более частей, например, информацию о служащих, книгах и т. д.Из урока 19 вы узнаете, как использовать объединения C++, которые, подобно структурам, используют элементы, но в отличие от структур по-другому хранятся в памяти. Независимо от количества элементов объединение может хранить только одно значение в каждый момент времени. Прежде чем вы приступите к уроку 19, убедитесь, что освоили следующие основные концепции:

  1. Структуры позволяют вашим программам группировать связанную информацию различных типов в одной переменной.
  2. Части информации, из которых состоит структура, называются элементами.
  3. Структура определяет шаблон, который ваши программы могут использовать для объявления переменных.
  4. После определения структуры вы можете использовать ее имя (тэг) для объявления переменных типа данной структуры.
  5. Чтобы присвоить значение или обратиться к значению элемента структуры, ваши программы используют оператор точку, например variable.member.
  6. Если функция изменяет значение элемента структуры, переменная структуры должна быть передана в функцию с помощью адреса.
  7. Если функция использует указатель на структуру, функция должна использовать форматvariable->member для обращения к элементу структуры.