Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛР14-С++-24-мая-2012.doc
Скачиваний:
34
Добавлен:
23.09.2019
Размер:
2.26 Mб
Скачать

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 = {

“Евгений Онегин”,

“Пушкин А.С.”,

1995

};

При выполнении данного фрагмента программы в переменные структуры title, author и year будет записана соответственно информация: “Евгений Онегин”, “Пушкин А.С.”, 1995. Здесь следует обратить внимание, что последовательность данных при инициализации должна соответствовать последовательности полей в структуре. Это накладывает определенные ограничения, т.к. при инициализации необходимо помнить последовательность полей в структуре. Стандарт C99 допускает более гибкий механизм инициализации полей структуры:

struct book lib = {.year = 1995,

.author = “Пушкин А.С.”, .title = “Евгений Онегин” };

или

struct book lib = { .year = 1995, .title = “Евгений Онегин” };

или

struct book lib = {.author = “Пушкин А.С.”, .title = “Евгений Онегин”,

1995

};

В первом и во втором примерах при инициализации указываются наименования полей через точку. При этом их порядок и число не имеет значения. В третьем примере первые два поля указаны через имена, а последнее инициализируется по порядковому номеру – третьему, который соответствует полю year.