МУ_ДЗ_2014 (Методические указания к лабораторным работам), страница 5

2018-01-11СтудИзба

Описание файла

Файл "МУ_ДЗ_2014" внутри архива находится в папке "Методические указания к лабораторным работам". Документ из архива "Методические указания к лабораторным работам", который расположен в категории "". Всё это находится в предмете "программирование на основе классов и шаблонов" из 2 семестр, которые можно найти в файловом архиве МГТУ им. Н.Э.Баумана. Не смотря на прямую связь этого архива с МГТУ им. Н.Э.Баумана, его также можно найти и в других разделах. Архив можно найти в разделе "книги и методические указания", в предмете "программирование на основе классов и шаблонов" в общих файлах.

Онлайн просмотр документа "МУ_ДЗ_2014"

Текст 5 страницы из документа "МУ_ДЗ_2014"

int iMas[10]; // Элементы массива одного типа int с номерами от 0 до 9-ти.

#define MAX 15

char cMas[MAX]; // Элементы массива одного типа char с номерами от 0 до 14-ти.

const int Razm = 5;

My_Obj oMas[Razm]; //Элементы массива одного типа My_Obj с номерами от 0 до 4-ти.

My_Obj * poMas[Razm]; //Массив указателей на объекты типа My_Obj 0-4

int iRaz = 10;

float * pfMas = new float[iRaz];//Динамический массив типа float с номерами от 0 до 9-ти.

// Доступ к элементом массивов выполняется с помощью индексных выражений

iMas[5] = 5;

cMas[k + 2] = ' А';

oMas[0] = new My_Obj;

pfMas [2] = 5.5f;

Первые четыре массива являются статическими (iMas, cMas, oMas, poMas). Размерность этих массивов определяется до начала компиляции. Изменить их размерность при выполнении программы невозможно. Четвертый массив, объявленный через указатель (pfMas), является динамическим, но с фиксированной размерностью: при выполнении программы увеличить или изменить размерность достаточно сложно. Недостатками таких массивов является также следующее: заранее определенный тип однородных элементных объектов; сложность добавления элементов массивов в середину массива; невозможность доступа к к такому массиву по имени (см. - ассоциативные массивы).

Для устранения перечисленных недостатков в современные системы программирования включены системы классов для работы с массивами, как с контейнерными объектами. Они определены в STL (vector), ATL (CAtlArray ) и MFC(CArray, CObArray). Эти классы имеют различные методы и обеспечивают много возможностей для описания и работы с объектами типа массив.

36 Операции с контейнерами

При работе с контейнерными объектами можно выделить следующие основные операции:

  • Создание (описание) контейнеров, с указанием размерности контейнера и его заполнения;

  • Добавление объектов в контейнер;

  • Удаление объектов из контейнера;

  • Доступ к объектам контейнера;

  • Очистка контейнера;

  • Распечатка содержимого контейнера;

  • Расширение размеров контейнера;

  • Получение числа элементных объектов в контейнере;

  • Обмен местоположения объектов в контейнере.

  • Сравнение контейнеров (операции отношения контейнеров).

37 Итераторы и их применение

Для удобства и универсализации работы с контейнерами используются специальные разновидности объектов – итераторы. Итераторы создаются для объектов контейнеров и позволяют обеспечить последовательный доступ к объектам контейнера. Доступ может выполняться как в прямом ( iterator), так и в обратном порядке (reverse_iterator). Итераторы обеспечивают выполнения следующих операций: последовательного движения по элементам контейнера (++, --), проверки достижения конца контейнера и доступа к конкретному элементу контейнера. Использование итераторов характерно для контейнеров библиотеки STL.

38 Операции с контейнерами типа массив

При работе с контейнерными объектами типа массив можно выделить следующие основные операции (в скобках показанные названия методов):

  • Создание (описание) контейнеров, с указанием размерности контейнера и его заполнения (vecror, CAtlArray, CArray, CObArray );

  • Добавление объектов в массив (например: push_back , add, InsertAt);

  • Удаление объектов из массива (например: pop_back , erase,RemoveAt);

  • Доступ к объектам массива (например: [], at, GetAt);

  • Очистка контейнера-массива (например: clear, Removeall);

  • Расширение размеров контейнера (например: resize, SetAtGrow);

  • Получение числа элементных объектов в контейнере (например: size, GetSize, GetCount);

  • Обмен местоположения объектов в контейнере (например: swap);

  • Операции над массивами (например: copy, append, assign);

  • Сравнение контейнеров (операции отношения контейнеров).

39 Контейнерные классы в VS

В системе программирования VS предусмотрено значительное разнообразие контейнерных классов для разных применений. Они содержатся в разных библиотеках:

  • Библиотеке STL (vector, list, map, stack, set, multiset, map, multimap и queue );

  • Библиотеке MFC (CArray, CList, CMap, CObArray, CObList, CMapPtrToPtr и др);

  • Библиотеке ATL (CAtlArray, CAtlList, CAtlMap и др.);

  • Библиотеке платформы .NET ( Array, List и др);

40 Контейнерные классы массивов в STL (vector)

В библиотеке STL описывается шаблонный класс vector, который позволяет описывать массивы переменных любого типа. Формальное определение шаблона дано ниже:

template <

class Type,

class Allocator = allocator<Type>

> class vector {…};

Для работы объектами этого класса необходимо подключить заголовочный файл:

#include <vector>

Для переменных вектора нужно указать тип:

vector <int> v1; // Вектор/массив - переменных целого типа

v1.push_back( 1 ); // Добавить в конец

v1.push_back( 2 ); // Добавить в конец

v1.insert( v1.begin( ), 55 );// Добавить в начало

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

for(int i = 0; (unsigned) i < v1.size( ) ; i++)

{ cout << "v1["<< i <<"] = " << v1[i] << endl;};

В результате работы данного фрагмента, совместно с предыдущим, получим:

v1[0] = 55

v1[1] = 1

v1[2] = 2

Перечень всех методов класса вектор приведен в разделе Справочные материалы (данных МУ), подробное описание методов вы можете найти в документации, литературе и справочной системе MSDN[5]. Рассмотрим еще несколько примеров использования объектов вектор. Для очистки массива может быть использован метод удаления (erase):

v1.erase( v1.begin( ), v1.end( ) ); // Очистить весь массив

v1.erase( v1.begin( ), v1. begin ( ) + 2 ); // Очистить 2 первых элемента

Получить текущую размерность массива можно так:

cout << "Размер массива v1 = "<< v1.capacity( ) << endl;

Получить предельную максимально возможную размерность массива:

cout << "Максимальный размер массива v1 = "<< v1.max_size( ) << endl;

Проверить является ли массив пустым можно специальным методом:

if ( v1.empty( ) )

cout << "Массив пуст." << endl;

else

cout << "Массив не пуст." << endl;

Поменять содержимое массивов местами:

v1.swap( v2 );

Рассмотрим использование итераторов для массива типа вектор. Итератор нужно предварительно описать, а затем использовать в цикле распечатки массива. Для навигации по массиву можно применить перегруженную для итератора операцию - “++”. Например:

vector<int>::iterator iter;

for( iter = v1.begin(); iter != v1.end() ; iter++)

{ cout << "v1[] = " << *iter << endl;};

Методы begin и end используются для управления циклом на основе итератора. Первый метод (begin) задает первый элемент вектора, а второй (end) указывает на последний элемент массива. Можно объявить реверсивный итератор и просматривать массив с конца до начала, тогда фрагмент программы может выглядеть так:

int i ;

vector <int>::reverse_iterator riter;

...

for( i= 0, riter = v1.rbegin(); riter != v1.rend() ; riter++, i++)

{

cout << "v1["<<i <<"] = " << *riter << endl;};};

В рамках ЛР необходимо продемонстрировать использование методов класса вектор для объектов целого типа и собственного класса по варианте ЛР. Использование собственного класса в качестве содержимого векторного массива имеет особенности. На примере простого класса Point покажем их. Пусть создан простой класс:

class Point {

public:

int x; int y;

Point(){ x =0 ; y = 0;};

Point(int a , int b ){ x = a ; y = b;};

friend ostream & operator <<( ostream & out , Point & obj );};

// Перегруженная дружественная операция вывода в поток

ostream & operator <<( ostream & out , Point & obj )

{

out <<"{ x = " << obj.x <<" y = " << obj.y << " } " <<endl;

return out;

};

Тогда мы можем описать вектор массив для этих объектов и итератор для него:

vector<Point> vP1;

vector<Point>::iterator PIter;

Опишем объекты типа Point и добавим их в конец массива:

Point P1(1,2);

Point P2(51, 52);

vP1.push_back( P1 );

vP1.push_back( P2 );

vP1.push_back( *new Point(31 ,32) ); // Динамические создание

Цикл печати построим с помощью итератора и вспомогательной переменной, позволяющей выводить индекс массива (i):

for( i = 0, PIter = vP1.begin() ; PIter != vP1.end( ) ; PIter++, i++)

{ cout << "vP["<<i<<"] = " << *PIter << endl;};

В результате получим в консольном окне:

vP[0] = { x = 1 y = 2 }

vP[1] = { x = 51 y = 52 }

vP[2] = { x = 31 y = 32 }

Особенностью использования собственных объектов является необходимость перегрузки операций ввода/вывода в поток. Другой особенностью класса vector является автоматическое корректное удаление динамических объектов, созданных в программе и включенных в массив. В ЛР необходимо описать собственный класс объектов и продемонстрировать все возможности массива типа vector.

41 Контейнерные классы массивов в MFC

В библиотеке MFC (Microsoft Foundation Class) предусмотрено два основных класса для работы с массивами: CArray и CObArray. Кроме этих классов предусмотрены классы для определенного типа включаемых объектов: CWordArray, CByteArray, CPtrArray, CDWordArray, CStringArray, CUintArray. Класс CArray является шаблонным, для создания объектов необходимо указать тип, а класс CObArray не требует типизации, в него могут включаться любые объекты, наследованные от класса CObject. Методы первого и второго классов практически совпадают по названию и назначению. Рассмотрим первоначально класс CArray. Для добавления в массив объектов используется метод Аdd. Элементы всегда добавляются в конец массива. Формально массивы типа CArray являются шаблонами:

template < class TYPE, class ARG_TYPE = const TYPE& > 

class CArray : 

public CObject { …};

Пример описания и добавления в массив переменных типа int.

CArray<int , int> IntMas;

for (i = 0 ; i < 5 ; i++ )

IntMas.Add(i);

for (i = 0 ; i < IntMas.GetCount() ; i++ )

cout << IntMas[i] << " " ;

cout << endl;

Метод GetCount позволяет получить текущий размер массива, поэтому он может быть использован для проверки завершения цикла. После выполнения получим результат:

0 1 2 3 4

Метод GetUpperBound позволяет получить последний занятый индекс в массиве:

cout << "GetUpperBound = " << IntMas.GetUpperBound() << endl;

Получим:

4

Метод GetAt позволяет получить значение элемента списка по индексу (номеру):

Свежие статьи
Популярно сейчас
Зачем заказывать выполнение своего задания, если оно уже было выполнено много много раз? Его можно просто купить или даже скачать бесплатно на СтудИзбе. Найдите нужный учебный материал у нас!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
5167
Авторов
на СтудИзбе
438
Средний доход
с одного платного файла
Обучение Подробнее