Использование динамического массива

 

// есть группа из 10 целых чисел

int * psome = new int [10];

 

Как осуществить доступ к элементам динамического массива? Нужно просто применять указатель так, как будто он является именем массива. Иными словами, для первого элемента можно ис­пользовать обозначение psome[0] вместо *psome, для второго — psome[2] и т.д.

Пример.

// область памяти для трех элементов

// типа double

double * рЗ = new double [3];

// рЗ трактуется как имя массива

р3[0] = 0.2;

рЗ[1] = 0.5;

рЗ[2] = 0.8;

// высвобождение памяти

delete [] рЗ;

Структуры

 

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

Иначе говоря, один массив может содержать двадцать эле­ментов типа int, а другой — десять элементов типа float, но один и тот же массив не может содержать элементы типа int и float. Решение состоит в применении структуры. Структура — более универсальная фор­ма данных, чем массив, поскольку может содержать элементы, относящиеся к различ­ным типам данных. Использование структуры позволяет унифицировать представление данных путем сохранения в нашем случае всей связанной с работником информации в единствен­ной переменной структуры. А для ведения данных по целому отделу можно использо­вать массив структур. Тип структуры также служит мостиком к классу, который являет­ся основой объектно-ориентированного программирования языка C++. Изучение структур позволит гораздо глубже понять, что представляет собой класс.

Структура — определяемый пользователем тип данных. Объявление структуры слу­жит для того, чтобы задавать свойства типов данных. После определения типа можно создавать переменные этого вновь созданного типа. Таким образом, создание структу­ры предусматривает два этапа.

ü Сначала создается описание структуры. При этом опи­сываются и именуются различные типы данных, которые могут содержаться в структу­ре.

ü Затем можно создавать структурные переменные или, более обобщенно, структурные объекты данных, которые соответствуют схеме описания.

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

 

struct produce // описание структуры

{

char name[20]; // элемент типа array

float mass; // элемент типа float

double price; // элемент типа double

};

Ключевое слово struct указывает на то, что код определяет компоновку структуры. Идентификатор produce — имя структуры, или дескриптордля этой формы. Таким образом, produce представляет собой имя нового типа данных. Теперь можно создавать пе­ременные типа produce так же, как переменные типа char или int. Между фигур­ными скобками находится список типов данных, которые будут содержаться в структу­ре. Каждый элемент списка — это оператор объявления. Здесь можно использовать любой из типов данных C++, включая массивы и другие структуры. В этом примере применяется массив типа char, удобный для сохранения строки, а также float и double. Каждый отдельный элемент в списке называется элементомструктуры, так что структура produce включает три элемента.

Когда шаблон готов, можно создавать переменные данного типа:

 

//структурные переменные

// типа produce

Produce engine;

Produce pump;

Produce sensor;

 

Для обращения к отдельным элементам структурной переменной нужно использовать оператор принадлежности ( . ). Например, выражение engine.mass указывает на элемент mass структуры, a engine.price — на элемент price. Аналогично pump.price — элемент price переменной pump.

Итак, име­на элементов предоставляют возможность обращения к элементам структуры во многом подобно тому, как индексы позволяют обращаться к элементам массива. Поскольку элемент price объявлен как тип double, элементы engine.price и pump.price экви­валентны переменным типа double, и их можно использовать так же, как используется обыкновенная переменная типа double. Таким образом, engine — это структура, но engine.price — элемент типа double.

Пример.

struct produce // описание структуры

{

char name[20]; // элемент типа array

float mass; // элемент типа float

double price; // элемент типа double

};

Void main(void)

{

produce engine=

{

“Komatsu 198ER”, // модель

Масса

Цена

};

printf(“Engine information\n”);

printf(“Model: %s\n”, engine.name);

printf(“Mass: %f\n”, engine.mass);

printf(“Price: %f\n”, engine.price);

}

Результат:

Engine information

Model: Komatsu 198ER

Mass: 50.000000

Price: 300.000000

 

В языке C++ определяемые пользователем типы данных очень близки по свойствам к встроенным типам. Например, можно передавать структуры функциям в качестве аргументов, а также использовать структуру, как возвращаемое значение функции. Кроме того, допускается использование оператора присвоения ( = ), чтобы присвоить значение одной структуры другой структуре того же типа. Такое дей­ствие приводит к тому, что каждому элементу одной структуры будет присвоено значе­ние соответствующего элемента другой структуры, даже если этот элемент — массив. Данный вид операций называется поэлементным присваиванием. Тему передачи и воз­вращения структур в функции мы пока отложим до момента ознакомления с фун­кциями в следующей лекции.

Пример поэлементного присваивания одной структуры другой.

 

Void main(void)

{

produce engine={"AEG 198ER",50.0,300.0};

Produce engine1;

// присвоение одной структуры другой

engine1=engine;

printf("Engine information\n");

printf("Model: %s\n", engine1.name);

printf("Mass: %f\n", engine1.mass);

printf("Price: %f\n", engine1.price);

}

Результат будет как и в предыдущем примере:

Engine information

Model: AEG 198ER

Mass: 50.000000

Price: 300.000000

 

Можно комбинировать определение формы структуры с созданием переменных структуры. Для этого после закрывающей фигурной скобки следует указать имена од­ной или нескольких переменных:

Struct perks

{

Int key_number;

char car[12] ;

} mr_smith, ms_jones;

// две переменные типа perks

 

Можно создавать массивы, элементы которых будут структурами. Методика точно такая же, как и при создании массивов базовых типов данных.

Пример:

produce engine[100];

Доступ к элементу price для структуры №52 в массиве структур будет выполняться следующим образом:

double price = engine[52].price;

 

Можно использовать вложенные структуры.

 

struct worker // описание сотрудника

{

char name[20];// ФИО

int age; // возраст

int skill; // характеристика опыта

};

struct department // описание отдела

{

// название отдела

char name[20];

// массив описания работников

worker group[50];

};

 

Описание шаблона структуры вводит по сути новый тип данных. А раз так, то ничто не мешает использовать указатель на введенный тип. Для доступа к полям структурной переменной через указатель используется операция ->.

Пример.

struct UDC // описание УДК книги

{

Char class;

Char subclass;

Int number;

};

struct BOOK // описание книги

{

UDC udc_str;

char name[20];

char title[100];

Int year;

Float price;

};

……………………………

BOOK first_book, *ptr_book;

// инициализация указателя

ptr_book=&first_book;

ptr_book->year=2006;

ptr_book->udc_str.class=’A’;

ptr_book->udc_str.number=681;

……………………………

 

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








Дата добавления: 2016-04-22; просмотров: 674;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.026 сек.