Урок 8.1.1. Описание структурных переменных

8.1. Структуры

В практических задачах часто возникает необходимость хранить и обрабатывать логически связанные между собой данные различных типов. Например, в задаче составления платежной ведомости логически связаны между собой данные о фамилии и имени служащего (символьная строка), его табельном номере (целое), заработной плате (число с плавающей точкой) и другие.

Такую совокупность разнородных данных удобно рассматривать как нечто единое, характеризующее некоторый объект задачи. Для представления подобных объектов используются структуры.

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

8.1.1. Описание структурных переменных

Как и любые другие объекты программы, переменные типа структура, то есть структурные переменные, должны быть описаны. При этом необходимо четко различать понятия структуры и структурной переменной. Структура определяет составные части структурной переменной другими словами определяет новый составной тип данных, этот тип данных определяет сам пользователь. Описания структурных переменных синтаксически аналогичны ранее изученным описаниям Си: <тип> <список_переменных>;

Для структурных переменных <тип> задается ШАБЛОНОМ структуры, который может иметь один из видов:

Структурный шаблон с именем:

struct ИМЯ ШАБЛОНА { <описание полей структуры>

                                       };

Структурный шаблон с именем и списком переменных:

struct ИМЯ ШАБЛОНА { <описание полей структуры>    

                                       }<список переменных>;

Структурный шаблон без имени:

struct { <описание полей структуры>          

           } <список переменных>;

 

где struct – ключевое слово, объявляющее структуру, ИМЯ ШАБЛОНА – имя структурного типа, а в качестве полей задаются переменные. В языке С++ в качестве полей можно задавать и определения функций. Фактически ИМЯ ШАБЛОНА это имя нового типа, созданного пользователем. Приведем примеры синтаксически правильных описаний структурных переменных:

1. Например, объявим структуру для описания данных для хранения информации о служащем:

struct RECORD
{
int num;                /* Табельный номер */
char name[20];      /* Имя служащего     */
float wage;             /* Зарплата в месяц */
};

struct RECORD pos1, pos2;
struct RECORD pos3;

Имя структурного типа данных (шаблона) обычно записывается строчными буквами с целью лучшего визуального отличия от имен переменных. После создания типа объявлены три структурные переменные: pos1, pos2, pos3. В языке С++ слово struct при объявлении переменных указывать необязательно.

Можно было объявить переменные одновременно с созданием шаблона:

struct RECORD
{
int num;                /* Табельный номер */
char name[20];      /* Имя служащего    */
float wage;              /* Зарплата в месяц */
}  pos1, pos2, pos3;

но первый способ предпочтительнее: тип отдельно, объявление переменные отдельно.

С одной стороны данные, содержащиеся в переменных pos1, pos2 и pos3, рассматриваются как нечто единое, например, можно присвоить переменной pos1 значение переменной pos2 и при этом все подполя, составляющие значение pos2 будут скопированы в соответствующие подполя переменной pos1, а с другой стороны, Си обеспечивает возможность доступа и к отдельным подполям структурной переменной.

Для определения размера памяти занимаемой структурной переменной рекомендуется использовать операцию sizeof.

Обычно, при разработке больших программ с большим количеством структур описания структурных шаблонов помещаются в файлы-заголовки и включаются в программу при помощи директивы препроцессора include.

2. Иногда бывает удобно, чтобы одна структурная переменная содержалась или была "вложена" в другую. Так как Си не накладывает никаких ограничений на типы полей структуры, то структурная переменная вполне допускается в качестве элемента

шаблона. Например, в описанной выше структуре RECORD элемент name может в свою очередь представлять структуру:

struct NAME
{ char fam[10]; /* Фамилия */
   char im[10];   /* Имя */
};

Тогда описание структуры будет иметь вид:

struct RECORD
{ int num;
   struct NAME name;
   float wage;
};

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

struct MORE
{ int volna;
char veter [21];
struct MORE black; /* Неправильно */
};

Однако все будет нормально, если такое описание шаблона задано структурной переменной:

struct MORE
{ int volna;
char veter [21];
struct MORE *black; /* Правильно */
};

так как в этом случае переменная black является указателем на тип struct MORE, а не структурной переменной типа struct MORE.

3. По аналогии с простыми переменными несколько структурных переменных с одинаковыми шаблонами могут быть объединены в массив структур. Описание массива структур аналогично описанию массива любого другого типа: после имени массива в квадратных скобках записывается константа, определяющая количество элементов в массиве. Например, описание

struct RECORD pos[12];

определяет массив из 12 элементов, где pos[0], pos[1], ..., pos[11] – суть структурные переменные типа RECORD.

4. Можно объявлять структурные переменные используя шаблон без имени:

struct
{ int i;
char c;
float x;
} s1, s2;

Здесь объявлены две структурные переменные s1 и s2 с соответствующими полями: полем для хранения значения типа int, полем для хранения значения типа char и полем для хранения значения типа float.

Недостатком этого способа является то, что структурный шаблон нельзя будет использовать для объявления других переменных, т.к. у него нет имени. Так можно делать, чтобы, например, подчеркнуть что переменные такого типа используются только в этой части программы.

5. В С++ в качестве полей структуры можно указывать функции. Например,

struct RECORD
{
int num;
char name[20];
float wage;
void print_rec()
{
printf(" num = %d \n name = %s \nwage = %f \n\n",num,name,wage);
}
void init(int num1, char *name1, float wage1)
{
num = num1; strcpy(name,name1); wage = wage1;
}
float wage_raise(int d)
{
return wage *= d;
}
};

Как использовать поля–функции рассмотрим в следующем параграфе.

6. Структурные переменные и массивы, как и простые переменные и массивы, при описании могут получать начальные значения – инициализироваться. В Си разрешается инициализация любых структурных переменных независимо от класса памяти. Тип и порядок инициализирующих значений должны соответствовать типу и порядку элементов в структурном шаблоне. В качестве инициализирующих значений допускается использовать только константы (как явные, так и определенные через директиву препроцессора define) и константные выражения. Инициализирующие значения записываются через запятую и заключаются в фигурные скобки. Если инициализирующих значений больше чем элементов шаблона структуры, то компилятор сообщает об ошибке, если меньше, то оставшиеся элементы заполняются нулями либо нуль-символами для строковых элементов.

Например, массив структур с ранее описанным шаблоном RECORD может быть инициализирован следующим образом:

struct RECORD pos[3]=
{ 1328, "Иванов В.А.", 190.5,
1329, "Волков Г.И.", 220.0
};

В этом случае элементы массива структур получат значения, представленные на рис. 8.1.

  int num char name[20] float wage

pos[0]

1328 Иванов_В.А.\\\\\\\\\ 190.5

pos[1]

1329 Волков_Г.И.\\\\\\\\\ 220.0

pos[2]

0 \\\\\\\\\\\\\\\\\\\\ 0.0

Рис. 8.1. Массив структур (знаком _ обозначен символ пробела, знаком \ нуль-символ).

В С++ инициализировать структурные переменные можно также при помощи полей–функций. В этом случае управление инициализацией осуществляется соответствующей функцией. Пример смотрите в следующем параграфе.

рассказать друзьям и получить подарок

Оставить комментарий

Ваш email не будет опубликован. Обязательные поля отмечены *

Вы можете использовать это HTMLтеги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Translate Переводчик

Подписка на новости

SmartResponder.ru
Ваш e-mail: *
Ваше имя: *

Хостинг для Wordpress сайтов