Использование динамического массива
// есть группа из 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; просмотров: 742;