Будь умным!


У вас вопросы?
У нас ответы:) SamZan.net

Если же требуется хранить набор разнородных но логически связанных данных описывающих например состояни

Работа добавлена на сайт samzan.net:

Поможем написать учебную работу

Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.

Предоплата всего

от 25%

Подписываем

договор

Выберите тип работы:

Скидка 25% при заказе до 9.11.2024

Структуры

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

struct этикетка [список элементов] [переменные];

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

struct Person (

char lastName[32]; // Фамилия.

char firstName[32]; // Имя.

Sex sex;

// Пол: перечислимый тип

// (male, female}.

short age; // Возраст.

long phoneNum; // Телефон как длинное целое.

}

aPerson; // Объявляет переменную типа

// struct Person.

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

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

struct Person *pPerson - SaPerson;

// Указатель на 

// структуру.

aPerson.age = atol(ageStr);

// Записать в структуру

// возраст aPerson.sex - male;

// и т.д.

pPerson->phoneNum = atol(phoneStr); //

/* Напечатать имя и фамилию (предполагается, что они уже инициализированы).*/

printf("%s %s\n", pPerson->firstName, pPerson->lastName);

Битовые поля

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

тип [имя поля]: ширина поля;

Тип поля может быть int или unsigned int. Доступ к битовым полям осуществляется так же, как и к регулярным элементам структуры. Если имя_поля отсутствует, место под поле отводится, но оно остается недоступным. Это будут просто “заполняющие” биты.

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

Объединения

Объединения, определяемые с помощью ключевого слова union, похожи по своему виду на структуры:

union этикетка {список_элементов] [переменные];

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

Объединения полезны, когда требуется обеспечить своего рода “полиморфное поведение” некоторого объекта. Например, вы хотите определить тип, реализующий представление различных геометрических фигур — прямоугольников, окружностей, линий, многоугольников. В зависимости от того, чем конкретно является данная фигура, для ее описания необходимы различные наборы значений. Круг описывается иначе, чем многоугольник и т. п. И вот из структур, описывающих различные фигуры, можно в свою очередь составить обобщенный тип-объединение, который будет обрабатываться различно в зависимости от значения специального поля, определяющего род фигуры. В то же время на все фигуры можно будет ссылаться через указатели одного и того же типа, что, в частности, позволит составлять динамические связанные списки из любых фигур.

Доступ к элементам объединения (их иногда называют разделами) осуществляется так же, как и в структурах, — посредством точки или стрелки, за которыми следует имя раздела.

В заключение разговора о типах, определяемых пользователем, приведем пример законченной программы. В ней определяется тип структуры, способной хранить данные различных “графических объектов”. В программе реализованы всего два их вида — прямоугольник и текстовая метка.

Листинг 3.5. Демонстрация работы со структурами

/*

** Struct.с: Структуры и объединения.

*/

#pragma hdrstop

#include <stdio.h>

#include <conio.h>

#include <string.h>

/* Тип для определения вида объекта */

typedef enum {Rect=l, Labi) Type;

/***********************************************

** Структура для хранения прямоугольников и текстовых меток.

*/ typedef struct _GForm { Type type;

struct _GForm *next;

/* Указатель для связанного списка. */

union {

/* Анонимное объединение. */

struct {

/* Прямоугольник. */

int left, top;

int right, bottom;

} rect;

struct {

/* Текстовая метка. */

int x, у;

char text [20];

} labi;

}

} Gform;

 

/****************************************

** Функция вывода данных объекта.

*/ void ShowForm(GForm *f)

{

switch (f->type) {

case Rect:

/* Прямоугольник. */

printf("Rectangle: (%d, %d) (%d, %d)\n",

f->data.rect.left, f->data.rect.top,

f->data.rect.right, f->data.rect.bottom);

break;

case Labi: /* Метка. */

printfC'Text label: (%d, %d) \"%s\"\n",

f->data.labl.x, f->data.labi.y, f->data.labi.text);

}

int main(void)

{

GForm formi, form2;

/* Инициализация первого объекта. */

forml.type = Rect;

forml.data.rect.left = 50;

forml.data.rect.top = 25;

forml.data.rect.right = 100;

forml.data.rect.bottom = 75;

/* Инициализация второго объекта. */

form2.type = Labi;

form2.data.labi.x = 60;

form2.data.labl.у = 40;

strcpy(form2.data.labi.text, "This is a Label!");

/* Распечатка... */ ShowForm(&formi);

ShowForm(&form2);

printf("\nPress any key...");

getch() ;

return 0;

}

Работу программы иллюстрирует рис. 3.5.

Рис. 3.5 Программа Struct.c (Project2)

Обратите внимание, что перечисления, структуры и объединения могут быть анонимными, т. е. не иметь имен-этикеток.

Внимательно рассмотрите определение типа Gform:

typedef struct _GForm { Type type;

struct GForm *next;

/* Указатель для связанного списка. */

union {

/* Анонимное объединение. */

struct {

/* Прямоугольник. */

int left, top;

int right, bottom;

} rect;

struct {

/* Текстовая метка. */

int x, у;

char text[20] ;

} labl;

} data;

} GForm;

Структура _Gform имеет, как таковая, три элемента: type, next (не используется) и data. Последний является анонимным объединением разделов rect и labl, каждый из которых, в свою очередь, является анонимной структурой. Элементы первой хранят значения координат верхнего левого и правого нижнего углов прямоугольника; элементами второй являются координаты, задающие положение текста, и сама текстовая строка. Получаются довольно длинные выражения для доступа к элементам данных (forml.data.rect.bottom).

Заключение

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

Кроме того, вам предстоит еще познакомиться с расширениями С, поддерживаемыми C++Builder, но выходящими за рамки стандарта ANSI. Такие расширения, связанные в основном с особенностями процессора и операционной системы, почти всегда имеются в любой реализации языка.

О них также будет говориться в следующей главе.

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

                struct anketa *uk;

     говорит , что uk - указатель на структуру типа anketa. Обозначение относится к конкретному элементу структуры и означает выборку этого элемента, например: uk-> tab_nom. Поскольку uk есть указатель на структуру anketa, то к элементу tab_nom можно обращаться и так:

   (*uk).tab_nom,

если учесть, чтоуказатель установлен на начало массива структур. Имя массива, как обычно, эквивалентно адресу его начального элемента и при добавлении к указателю на структуру или вычитании из него целого числа размер структуры учитывается автоматически  Так, оператор uk=a; устанавливает указатель на первый экземпляр массива структур, а запись ++a; обеспечивает автоматический переход к следующему экземпляру. В выражении (*uk).fio скобки обязательны, так как приоритет операции выделения элемента " . " выше чем у "*".

PAGE  7




1. Почвенно-климатические условия выращивания картофеля на территории Раменского района Московской области
2. Обмеження волі як вид кримінального покарання
3. Древний Новгород
4. Тема- Психологопедагогические условия развития эмоциональнотворческой культуры младшего школьника Огла
5. Особливості застосування наочності та технічних засобів навчання на уроках математики у початковій школі
6. На її території водиться 100 видів ссавців 360 видів птахів 200 видів риб 20 видів плазунів 17 видів земноводних
7. Чумацький промисел
8. Сестринское дело Студента Группы
9. Права осужденных к исправительным работам
10. марта 2013 года
11.  навыков высокоэффективных людей Стивен Кови2
12. История борьбы за скорострельность
13. Статья- Заметки о любви клиентов
14. Основа в бытовых вещах дозволенность кроме того на что пришел запрет в Коране и Сунне тогда как в поклонени
15. вариант ~ на природе
16. Лекции по дисциплине Контроль и диагностика режущего инструмента
17. Введение2
18. ТРУДОВОЕ ПРАВО1
19. тематическое обеспечение и администрирование информационных систем
20. Notebook Это не ldquo;любовный романrdquo; а роман о любви