Описание шаблона является описанием нового типа данных. Далее можно описывать переменные, используя имя шаблона. Министерство финансов Российской Федерации Всероссийская государственная налоговая академия ИНФОРМАТИКА И ПРОГРАММИРОВАНИЕ Бакалавры: 230700 "Прикладная информатика" Язык программирования С++ Лабораторная работа № 14 ПРОГРАММИРОВАНИЕ С ИСПОЛЬЗОВАНИЕМ СТРУКТУР Автор профессор кафедры "Прикладной информатики в экономике" кандидат технических наук Л.К. Кузнецов Мая 2012 г. Москва ВГНА Лабораторная работа № 14 Программирование с использованием структур Цель работы: Ознакомиться: Ø с понятием структуры; Ø с назначением структур; Ø с видами структур; Ø с понятием структурированной переменной; Ø с правилами описания структур в программах на языке С++; Ø с инициализацией структур; Ø с выражениями над структурами (с правилами действия с структурами); Ø с организацией циклов при работе с структурами. Изучить типовые алгоритмы обработки структур. Научиться разрабатывать и отлаживать в среде программирования программы с использованием структур. Получить практические навыки разработки программ, работающих с структурами данных на языке С++. 1. КРАТКИЕ ТЕОРЕТИЧЕСКИЕ СВЕДЕНИЯ Ниже приводятся минимальные сведения, необходимые только для выполнения лабораторной работы 1.1. Понятие структуры Вы уже знаете, что C++ позволяет хранить в массиве связанную информацию одного и того же типа. Вы уже выяснили, что группировка связанных значений в массив очень удобна. В большинстве случаев программам необходимо группировать связанную информацию разного типа. Например, предположим, что ваша программа работает с информацией о служащих. Она должна отслеживать данные о фамилии, возрасте, окладе, адресе, номере служащего и т. д. Для хранения этой информации программе потребуются переменные типа char, int, float, а также символьные строки. Если вашей программе требуется хранить связанную информацию разных типов, она может использовать структуру. Неоднородный тип (структура, запись) позволяет конструировать структуры данных самой произвольной природы. Он используется для представления объектов, имеющих достаточно сложное, неоднородное строение и, как правило, используется при создании различного рода информационных систем. Значение неоднородного типа состоит из фиксированного количества элементов (полей) разных типов, поэтому каждый элемент должен иметь уникальное имя, которое используется для доступа к элементу. Программист сам описывает неоднородный (структурный) тип, задавая его “внутреннее строение”: количество элементов, их тип и имена. Таким образом, структуры представляют собой способ организации данных в программе. Обработка этих данных (если необходимо) происходит с помощью функций. Дальнейшим развитием способов программирования стало объединение данных с обрабатывающими их подпрограммами и появление понятий «класс» и «объект». Структуры являются развитием понятия массив. Массивы представляют собой объединения однотипных переменных. Однако зачастую логика программы требует объединения разнотипных переменных. Пусть, например, программа оперирует описаниями радиоэлектронных компонентов, для определённости — интегральных схем. Каждая их них имеет характеристики различных типов: маркировка, количество контактов, тип корпуса, напряжение питания, потребляемая мощность и т.д. Можно объединить эти разнотиптые характеристики в единую переменную — структуру. Элементами или полями структуры могут быть переменные, массивы, ранее определенные структуры. В языке Си функции не могут быть полями структуры. В языке С++ функции могут быть полями структуры и такие структуры называются классами. Они определяются с помощью ключевого слова class. Приведем несколько определений структуры: Структура – это совокупность логически связанных переменных, возможно, различных типов, сгруппированных под одним именем для удобства дальнейшей обработки. Структура – это объединенное в единое целое множество поименованных элементов данных. Элементы структуры (поля) могут быть различного типа, они все должны иметь различные имена. Структура – это составной тип данных, в котором под одним именем объединены данные различных типов. Отдельные данные структуры называются полями. Структура — это составной тип данных, который состоит из элементов разных типов. Объявление структуры следует рассматривать как объявление типа. Структура является собранием одного или более объектов (переменных, массивов, указателей, других объектов), которые для удобства работы с ними объединены под одним именем. Структура – это способ связать воедино данные разных типов и создать пользовательский тип данных. Структура представляет собой переменную, группирующую связанные части информации, называемые элементами, типы которых могут различаться. Группируя данные в одну переменную подобным образом, вы упрощаете ваши программы, снижая количество переменных, которыми необходимо управлять, передавать в функции и т. д. Структура - это набор данных, где данные могут быть разного типа. Например, структура может содержать несколько переменных типа int и несколько переменных типа char. Переменные, которые содержаться в структуре называются членами или полями структуры. Структуры можно определять с помощью ключевого слова struct. Структуры в С++ используются для логического и физического объединения данных произвольных типов, так же как массивы служат для группирования данных одного типа. Объединив в структуре набор значений различного типа, впоследствии с этим набором можно обращаться как с одним элементом. Пример 14.1 Рассмотрим музыкальную коллекцию на компакт-дисках (CD). Такая коллекция может включать следующую информацию: – название CD; – имя исполнителя; – число песен; – стоимость CD; – дату покупки. Эта структура имеет пять полей. Определим тип для поля структуры: Имя элемента | Тип данных | Название CD | Символьный массив из 25 символов | Имя исполнителя | Символьный массив из 20 символов | Число песен | Целый | Стоимость CD | С плавающей точкой | Дата покупки | Символьный массив из 8 символов | В программирование часто структуры называют записями. В базах данных и в языке Pascal подобная конструкция носит название записи. Объясняется это тем фактом, что понятие структура в языке С++ полностью идентичено понятию запись в базах данных. Запись (record) – структурированный (составной) тип данных, состоящий из фиксированного числа компонентов разного типа, называемых полями (Helds) записи. Записи (структуры) являются одними из основных структур данных в языках программирования высокого уровня. Понятие записи используется при машинной обработке различных документов, таблиц, баз данных. Запись — это структура, состоящая из фиксированного числа компонент, называемых полями. В одном поле данные имеют один и тот же тип, а в разных полях могут иметь разные типы, за исключением функций. Запись связывает элементы разных типов в один объект. Этим запись отличается от массива (в массиве все элементы имеют одинаковый тип). Чтобы можно было ссылаться на тот или иной компонент записи, поля именуются, т.е. каждому полю записи присваивается имя. Например, такую информацию о студенте, как фамилия, имя, отчество, адрес, возраст, экзаменационные оценки, средняя успеваемость можно объединить в одну запись, имеющую пять полей. Имена и типы полей приведены в таблице 14.1. Таблица 14.1 | Поля записи | Запись | Fio | Adress | Age | Oc | Sr | Типы полей | Строка | Строка | Целое | Массив целочис. | Вещ. | Поля записи могут иметь любой допустимый в С++ тип данных, в том числе поля сами могут быть структурами (записями). Но поле не может иметь тип этой же структуры, но может быть указателем на нее. Записи (структуры) являются одними из основных структур данных в языках программирования высокого уровня. Понятие записи используется при машинной обработке различных документов, таблиц, баз данных. Запись — это структура, состоящая из фиксированного числа компонент, называемых полями. В одном поле данные имеют один и тот же тип, а в разных полях могут иметь разные типы, за исключением функций. Замечание 1. В C++ структуры заключают в себе не только данные, но и код и относятся к средствам объектно-ориентированного программирования. В данном разделе объектные свойства структур не рассматриваются. Замечание 2. Запись является частным, но наиболее востребованным случаем структуры. Понятие структура является более мощным, поскольку допускает вложение одной структуры в другую, в то время, как для записей вложение запрещено. Использование структур Структуры в С++ используются для логической или физической группировки объектов, имеющих общий контекст. Наиболее очевидным использованием является создание пользовательских типов данных, упрощающих написание, понимание и сопровождение программы. Использование структур при написании собственных типов данных рекомендуется в том случае, если выполняется ряд условий: Ø Создаваемый тип данных не имеет собственного поведения. То есть объект такого типа рассматривается как пассивный набор данных. Ø Члены данных создаваемого типа данных не могут находиться во взаимно противоречивом состоянии. То есть любая комбинация значений членов структуры является допустимой. Для более сложных пользовательских типов данных в языке С++ используются классы. До того, как будет изучен материал по классам, необходимо использовать структуры для описания пользовательских типов данных во всех случаях, когда это позволяет улучшить читаемость программы. В общем случае при работе со структурами следует выделить четыре момента: - объявление и определение типа шаблона структуры, - объявление структурной переменной, - инициализация структурной переменной, - использование структурной переменной. Рассмотрим эти четыре момента в последующих разделах. 1.2. Определение (описание) шаблона структуры Структура определяет шаблон, с помощью которого ваша программа может позднее объявить одну или несколько переменных. Другими словами, ваша программа сначала определяет структуру, а затем объявляет переменные типа этой структуры. Для определения структуры используется ключевое слово struct, за которым указывается ее имя и список элементов, заключенных в фигурные скобки. Общий вид описания структуры: struct имя_шаблона { описание поля1; . . . описание поляn; } описатель; Шаблон структуры определяет новый тип, имя которого можно использовать наряду со стандартными типами. Переменные, которые объединены структурой, называются её полями (или элементами). Это могут быть обычные переменные, массивы, указатели, другие структуры, объединения. Описание элемента (поля) складывается из указания типа элемента и имени элемента, поэтому подробное описание структуры выглядит так: struct имя_структуры { тип_элемента_1 имя_элемента_1; тип_элемента_2 имя_элемента_2; ... тип_элемента_n имя_элемента_n; } описатель; где тип_элемента_1, тип_элемента_2, … , тип_элемента_n - любые основные типы (int, char, float, и т. д.), массив, указатель, структура, объединение. На месте конструкции описатель может указываться одна или более (через запятую) переменных, которые будут использоваться впоследствии в программе как переменные указанного структурного типа. Объявление структуры является оператором, и поэтому после такого объявления должна стоять точка с запятой. Особо отметим, что объявление структуры не приводит к выделению памяти под переменную. Это лишь описание каркаса будущей переменной, её шаблон. С точки зрения компилятора объявление структуры является описанием нового пользовательского типа данных. Описание шаблона является описанием нового типа данных. Далее можно описывать переменные, используя имя шаблона. Элементами или полями структуры могут быть переменные, массивы, ранее определенные структуры. В языке Си функции не могут быть полями структуры. В языке С++ функции могут быть полями структуры и такие структуры называются классами. Они определяются с помощью ключевого слова class. Отметим, что определение типа структуры может быть задано в программе на внешнем уровне, при этом имя пользовательского типа имеет глобальную видимость (при этом память не выделяется). Определение типа структуры также может быть сделано внутри функции, тогда имя типа структуры имеет локальную видимость. Пример 14.1 Структура с информацией о CD: struct cd_info { char titlel[25]; // название CD char artist[20]; // исполнитель int num_songs; // число песен float price; // стоимость CD char date_bought[8];// дата покупки }col1,col2,col3; Пример 14.2 Структура с информацией о студенте struct student { char *fio; // Фамилия - указатель на char char Adress[40]; // Адрес - строка int Age; // Возраст - целое int oc[4]; // Оценки - целочис. массив float sr; // Средний балл - вещественное } ; Пример 14.3 Структура с информацией о дате struct Date //определение структуры { int day; int month; int year; }; Пример 14.23 Объявление структуры, которая хранит сведения о журнале: название, год, номер. struct magazin { char* tittle; int year; int number; }; Пример 14.24 Традиционным примером структуры служит учетная карточка работающего: служащий предприятия описывается набором атрибутов, таких, как табельный номер, имя, дата рождения, пол, адресс, зарплата. В свою очередь, некоторые из этих атрибутов сами могут оказаться структурами. Таковы, например: имя, дата рождения, адресс, имеющие несколько компонент. Элементы структуры обозначаются идентификаторами, с которыми можно связывать описатели типов. В результате структуру можно рассматривать как единое целое и осуществлять при необходимости выбор составляющих ее элементов. Для образования структуры присваиваются имена каждому из включаемых элементов и структуре в целом. Затем посредством спечиального описания задают иерархию, порядок следования и типы элементов, включаемых в структуру. Так, для реализации структуры с анкетой служащего можно выбрать имена: tab_nom - табельный номер; fio - фамилия, имя, отчество; pol - пол; summa - зарплата; //Все эти понятия можно объединить в такую, например, структуру: struct anketa { int tab_nom; char fio[30]; char data[10]; int pol; char adres[40]; float summa; }; Эта запись называется описанием структуры. Она начинается с ключевого слова struct и состоит из заключенного в фигурные скобки списка описаний. За словом struct может следовать необязательное имя, которое называется именем типа структуры (иногда его называют тэгом или ярлыком структуры). Этот ярлык именует структуру и в дальнейшем может использоваться для сокращения подробного описания. Переменные, упоминающиеся в записи, называются элементами. Следом за правой фигурной скобкой, заканчивающей список элементов, может следовать список переменных, так же, как и в случае базисных типов. Вот почему в приведенном выше описании структуры после закрывающей фигурной скобки стоит точка с запятой; она завершает пустой список. Пример 14.25 Описание структуры о студенте struct student { char name[50]; int kurs; int age; }; Мы определили структуру в которую входят переменные kurs, age и массив name. В этом описании student является шаблоном структуры, struct student является типом данных. После описания структуры нужно ставить точку с запятой. Пример 14.49 Описание шаблона для даты (день, месяц, год), struct data { int day; char month[10]; int year; }; struct data dl,d2,d3; /*описание переменных*/ При описании возможна инициализация переменной. struct data e1={4,"Сентябрь",1998}; Пример 14.60 Следующее определение создает структуру, содержащую информацию о служащем: struct employee { char name [64] ; long employee_id; float salary; char phone[10]; int office_number; }; Пример14.66 Описание переменных datel и date2. Каждая переменная содержит два поля, struct { int year; short day; } datel, date2; Пример 14.70 Инвентарный перечень книг При разработке программ важным является выбор эффективного способа представления данных. Во многих случаях недостаточно объявить простую переменную или массив, а нужна более гибкая форма представления данных. Таким элементом может быть структура, которая позволяет включать в себя разные типы данных, а также другие структуры. Приведем пример, в котором использование структуры позволяет эффективно представить данные. Таким примером будет инвентарный перечень книг, в котором для каждой книги необходимо указывать ее наименование, автора и год издания. Причем количество книг может быть разным, но будем полгать, что не более 100. Для хранения информации об одной книге целесообразно использовать структуру, которая задается в языке С++ с помощью ключевого слова struct, за которым следует ее имя. Само определение структуры, т.е. то, что она будет содержать, записывается в фигурных скобках {}. В данном случае структура будет иметь следующий вид: struct book { char title[100]; //наименование книги char author[100]; //автор int year; //год издания }; Такая конструкция задает своего рода шаблон представления данных, но не сам объект, которым можно было бы оперировать подобно переменной или массиву. Для того чтобы объявить переменную для структуры с именем book используется такая запись: struct book lib; //объявляется переменная типа book После объявления переменной lib имеется возможность работать со структурой как с единым объектом данных, который имеет три поля: title, author и year. Обращение к тому или иному полю структуры осуществляется через точку: lib.title, lib.author и lib.year. Таким образом, для записи в структуру информации можно использовать следующий фрагмент программы: printf(“Введите наименование книги: “); scanf(“%s”,lib.title); printf(“Введите автора книги: “); scanf(“%s”,lib.author); printf(“Введите год издания книги: “); scanf(“%d”,&lib.year); После этого в соответствующие поля будет записана введенная с клавиатуры информация и хранится в единой переменной lib. Однако по условиям задачи необходимо осуществлять запись не по одной, а по 100 книгам. В этом случае целесообразно использовать массив структур типа book, который можно задать следующим образом: struct book lib[100]; Структуры можно автоматически инициализировать при их объявлении подобно массивам, используя следующий синтаксис: struct bool lib = { “Евгений Онегин”, “Пушкин А.С.”, }; При выполнении данного фрагмента программы в переменные структуры title, author и year будет записана соответственно информация: “Евгений Онегин”, “Пушкин А.С.”, 1995. Здесь следует обратить внимание, что последовательность данных при инициализации должна соответствовать последовательности полей в структуре. Это накладывает определенные ограничения, т.к. при инициализации необходимо помнить последовательность полей в структуре. Стандарт C99 допускает более гибкий механизм инициализации полей структуры: struct book lib = {.year = 1995, .author = “Пушкин А.С.”, .title = “Евгений Онегин” }; или struct book lib = { .year = 1995, .title = “Евгений Онегин” }; или struct book lib = {.author = “Пушкин А.С.”, .title = “Евгений Онегин”, }; В первом и во втором примерах при инициализации указываются наименования полей через точку. При этом их порядок и число не имеет значения. В третьем примере первые два поля указаны через имена, а последнее инициализируется по порядковому номеру – третьему, который соответствует полю year. 1.3. Описатель типа Можно задавать имя типа структуры с помощью описателя типа typedef. Этот описатель позволяет создать свое собственное имя типа. Формат описателя типа: typedef спецификатор_типа описатели; Спецификатор типа — это основной или производный тип данных или тип, который ранее определен программистом. Описатель — это новое имя созданного нами типа. Пример 14.55 Описание нового типа данных «дата», состоящего их трех полей. typedef struct { int day; char month[10]; int year; }data; datadl,d2,d3; 1.4. Объявление переменных структурного типа Чтобы использовать структуру необходимо объявить переменные структурного типа. Переменные структурного типа можно объявлять так же, как и переменные стандартных типов. Объявлять переменные структурного типа можно двумя способами: – в виде переменных неименованного структурного типа; – в виде переменных именованного структурного типа. Определение переменной именованного структурного типа имеет вид: struct <имя шаблона структурного типа> < список структур>; или <имя шаблона структурного типа> < список структур>; где < список структур> – список, выбранных программистом, имен структур. Ключевое слово struct можно опускать в таком описании. Замечание: Ключевое слово struct является обязательным при программировании на С, так что некоторые программисты могут включать его по привычке. Однако в C++ использовать ключевое слово struct необязательно. Пример 14.2 Для структуры хранения данных о CD struct cd_info { char titlel[25]; // название CD char artist[20]; // исполнитель int num_songs; // число песен float price; // стоимость CD char date_bought[8]; // дата покупки }; чтобы объявить переменные типа cd_info, можно записать cd_info cd1, cd2, cd3; /*определение переменных cd1, cd2, cd3 */ Пример 14.3 Для структуры хранения данных о студенте struct student { char fio[30]; //Фамилия int kurs; //Курс char group[7]; //Группа }; чтобы объявить переменные типа student, можно записать struct student S3; /*определение переменной S3 */ student S, S1, S2; /*определение переменных S,S1, S2 */ student stud1, stud2; //. Здесь объявлены две переменные stud1 и stud2. Определение переменной неименованного структурного типа имеет вид: struct { <определения элементов>} < список структур>; Пример 14.4 Для структуры хранения данных о дате struct data { int day; int mounth; int year; } d1, d2; определены две структуры d1 и d2 неименованного структурного типа data, состоящего из трех элементов целого типа. Пример 14.5 Для структуры хранения данных о студенте struct student { char name[50]; int kurs; int age; } s1, s2; определены две переменные s1 и s2, являющиеся переменными типа struct student. Таким образом, структуры неименованного структурного типа определяются одновременно с описанием самого типа. Такой вариант используется для однократного определения структур. При определении структурной переменной язык C++ резервирует для нее место в памяти. При определении объекта структурного типа ему выделяетсяпамять в таком количестве, чтобы могли разместиться данные всех элементов. Под каждую из переменных типа структуры выделяется непрерывный участок памяти. Все переменные, использующие один шаблон (тип) структуры, имеют одинаковый набор полей, однако различные наборы значений, присвоенные этим полям. Компилятор выделяет под структурную переменную число байтов, не всегда равное сумме длин отдельных полей из-за влияния дополнительного фактора внутреннего представления структурных переменных, называемого выравниванием. Точный размер памяти в байтах, выделенный для структуры можно получить с помощью стандартной функции sizeof: sizeof(struct<имя_шаблона>); Например, sizeof (struct student); возвращает 56 байт. Если же был описан только структурный тип, а ни одной переменной данного типа определено не было, то место в памяти не выделяется. Пример 14.6 Объявлена структура с именем list, состоящая из трех полей, и переменная с именем L типа struct list struct list { char name[20]; char first_name[40]; int; }L; Для переменной L выделяется 64 байта памяти. 1.5. Инициализация переменной структурного типа Переменную структурного типа можно инициализировать одновременно с объявлением. Инициализация переменной структурного типа производится, если после имени типа следуют знак "=" и список значений полей структурного типа в фигурных скобках, разделенных запятой. Пример 14.3 Инициализация структуры, содержащей информацию о музыкальной коллекции на CD: struct cd_info { char titlel[25]; // название CD char artist[20]; // исполнитель int num_songs; // число песен float price; // стоимость CD char date_bought[8]; // дата покупки }; cd_info cd={"Red Moon Men", "Sam and the Snuds", 12, 11.95, "02.13.12"}; Значения переменным-полям присваиваются в порядке их объявления при определении структурного типа. Можно совмещать описание шаблона структуры и структурной переменной в одном предложении. Разрешается выполнять инициализацию полей структурной переменной при ее описании. Для инициализации структурной переменной значения ее полей перечисляются в фигурных скобках в порядке, соответствующему описанию полей. Пример 14.33 Пример совмещения описания шаблона, описания структурных переменных и инициализации полей переменный в одном предложении: struct Student // Описание шаблона структуры { char *fio; // Фамилия - указатель на char char Adress[40]; // Адрес - строка int Age; // Возраст-год рождения - целое int oc[4]; // Оценки - целочис. массив float sr; // Средний балл - вещественное } S, S1, // Описание переменных S,S1,S2 S2={ "Иванов", // и инициализация полей S2 "г. Москва, ул Цветочная, д.1, кв.43 ", 1991, {4,3,5,4,5}, //Инициализация поля - массива (int oc[4]; ) }; Внешние и статические структуры можно инициировать, помещая следом за определением список начальных значений элементов: struct anketa a0={ 1024, "Макагон В.М", "10.01.1943",0 , "Москва, Жукова, 23/99", 175.00}; Каждой структурной переменной в нашем случае могут быть присвоены шесть значений, имеющих соответствующие базовые типы. Ниже определена и инициализирована переменная структура mag. magazin mag = {"Nature", 3, 1995); 1.6. Операции со структурами Действия над структурами, в общем, ограничены. Над структурами возможны следующие операции: - присваивание значений одной структурной переменной другой структурной переменной, при этом обе переменные должны иметь один и тот же тип; - получение адреса переменной с помощью операции &; - осуществление доступа к членам структуры. –передавать в виде параметров функции, возвращать в виде результата функции. Для переменных одного и того же структурного типа определена операция присваивания. Например, можно записать s1=s2; при условии, что s1, s2 – переменные одного структурного типа созданы на базе одного шаблона student. При этом происходит поэлементное копирование значений соответствующих полей. После такого присваивания поля структуры s1 будут содержать ту же информацию, что и поля s2. Пример 14.78: struct point pt={105,15},pt1; pt1=pt; В результате выполнения этого присваивания в pt1.x будет записано значение 105, а в pt1.y – число 15. Если мы опишем две структуры с одними и теми же полями, но первая структура будет иметь шаблон student1, а вторая student2, то присваивание s1=s2 недопустимо. Структуры нельзя сравнивать. Структуры нельзя сравнивать операциями ==, /=, < , > и т.п. Сравнивать можно только значения конкретных полей. Все, что можно делать со структурой, - это взять ее адрес с помощью операции & и обращаться к ее элементам, как показано выше. Записи нельзя копировать или присваивать как единое целое; их нельзя передавать в функцию или получить оттуда целиком. Однако, к указателям на структуры это замечание не относится. 1.7. Доступ к значениям полей структурного типа Правила работы с полями структуры идентичны работе с переменными соответствующих типов. Доступ к значениям полей структурного типа осуществляется с помощью операции точка: Имя_переменной_структурного_типа . имя_поля или с помощью указателя на структуру: указатель_на_структуру–>имя_поля Операция точка в данных конструкциях означает доступ к элементу структуры, у нее самый высокий приоритет операций (см. лабораторную работу № 6). Примеры обращения к полям: d[i].year, (*(d+i)).year, (p+i)->year Пример 14.4 #include <stdio.h> struct cd_info { char titlel[25]; // название char artist[20]; // исполнитель int num_songs; // число песен float price; // стоимость char date_bought[8]; // дата покупки }; cd_info cd={"Red Moon Men", "Sam and the Snuds", 12, 11.95, "02.13.12"}; void main() { // вывод содержимого переменной cd printf("Название: %s\n",cd.titlel); printf("Исполнитель: %s\n",cd.artist); printf("Количество песен: %d\n",cd.num_songs); printf("Стоимость:%5.2f\n",cd.price); printf("Дата покупки %s\n", cd.date_bought); } Пример 14.41 Задание данных для структуры, задающей дату года: data.day = 12; // элементу, определяющему день месяца, //присвоено значение 12 data.month = 9; // элементу, определяющему месяц года //присвоено значение 9 data.year = 2002; // элементу, определяющему год //присвоено значение 2002 Пример 14.42 Массив с элементами структурного типа student, задающий информацию о студентах группы из 25 человек: stud [1].namestud.fam = “Иванов”; // элементу, //определяющему фамилию студента с номером 1 // в массиве stud присвоено значение строки “Иванов” stud [1].namestud.name = “Алексей”; // элементу, //определяющему имя студента с номером 1 в //массиве stud присвоено значение строки “Алексей” stud [1].age = 19; // элементу, определяющему возраст //студента с номером 1 в массиве stud присвоено //значение 19 stud [1].mark[4] = 5; // элементу, определяющему оценку //по пятому предмету студента с номером 1 в // массиве stud присвоено значение 5 Пример 14.43 Следующие операторы присваивают значения различным элементам переменной с именем worker типа employee; worker.employee_id = 12345; worker.salary = 25000.00; worker.оffice_number = 102; Пример 15.45 Для обращения к элементу структуры укажите имя переменной, за которым следует точка и имя элемента. Следующая программа иллюстрирует использование структуры типа employee: #include <iostream.h> #include <string.h> void main(void) { struct employee { char name [64]; //ФИО long employee_id; //табельный номер float salary; //оклад char phone[11]; //номер телефона int office_number; //номер структурного подразделения } worker; // Копировать имя в строку strcpy(worker.name, "Петров Иван Сергеевич"); worker.employee_id = 12345; worker.salary = 25000.00; worker.office_number = 102; // Копировать номер телефона в строку strcpy(worker.phone, "84957691212") ; 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. Если вы не инициализируете элементы при объявлении переменной типа данной структуры, вы должны копировать символьные строки в символьно-строковые элементы. Доступ к элементам структур может осуществляться и с помощью указателей. Если есть указатель на структуру, то доступ к элементу возможен при помощи операции косвенного выбора: указатель_на_структуру->имя_элемента. Стрелка, составленная из двух символов, обозначает оператор косвенного выбора. Пример 14.122 Описание указателя на структуру и обращение к ее элементам. data * ptr; ptr=&d2; ptr->day=4; ptr->month=" Декабрь"; ptr->year=1998; Обращение к элементам структуры можно записать еще следующим образом: (*ptr).day=4; (*ptr).month=" Декабрь"; (*ptr).year=1998; 1.8. Вложенные структурные типы Язык C++ позволяет определять один структурный тип в рамках другого. Полем структурной переменной может быть переменная любого типа, в том числе другая структурная переменная. Поле, представляющее собой структуру, называется вложенной структурой. Тип вложенной структуры должен быть объявлен раньше. Кроме того, структура не может быть вложена в структуру того же типа. Например, структурный тип PersonInfo для записи роста, веса и даты рождения человека может быть определен, как показано в примере 14.5. Пример 14.5 struct Date { int month; //месяц int day; //число int year; //год }; struct PersonInfo { float height; // рост float weight; // вес Date birthday; // дата рождения }; Обратите внимание, что структура Date, являющаяся вложенной для структуры PersonInfo, объявлена раньше структуры PersonInfo. Пример объявления переменной person типа PersonInfo: PersonInfo person; Чтобы получить доступ к значению поля birthday - переменной структурного типа PersonInfo, нужно использовать операцию точка: person.birthday, но так как birthday в свою очередь является полем структурного типа Date, то доступ, например, к году рождения осуществляется добавлением операции точка с именем year: person.birthday.year |