Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АрхитектураБиологияГеографияДругоеИностранные языки
ИнформатикаИсторияКультураЛитератураМатематика
МедицинаМеханикаОбразованиеОхрана трудаПедагогика
ПолитикаПравоПрограммированиеПсихологияРелигия
СоциологияСпортСтроительствоФизикаФилософия
ФинансыХимияЭкологияЭкономикаЭлектроника

Основы теории

Читайте также:
  1. III. СТРУКТУРА, ОРГАНИЗАЦИОННЫЕ ОСНОВЫ ДЕЯТЕЛЬНОСТИ И КАДРЫ ПРОФСОЮЗНОЙ ОРГАНИЗАЦИИ СТУДЕНТОВ
  2. III. СТРУКТУРА, ОРГАНИЗАЦИОННЫЕ ОСНОВЫ ДЕЯТЕЛЬНОСТИ, ПРОФСОЮЗНЫЕ КАДРЫ ПЕРВИЧНОЙ ПРОФСОЮЗНОЙ ОРГАНИЗАЦИИ
  3. Агаджанян Н.А. Основы физиологии человека. М., 2004.
  4. Аксиоматизация и формализация теории. Общая характеристика гипотетико-дедуктивного метода.
  5. Аксиомы теории вероятностей
  6. Ассимиляция теневой основы
  7. Биологические теории.

Лабораторная работа № 20

«Специализированные типы данных в объектно-ориентированном программировании»

Цель

Изучить специализированные типы данных в объектно-ориентированном программировании

 

Задание на самостоятельную работу

1. Изучить основные понятия и организацию класса как типа данных в объектно – ориентированном программировании [1], стр. [2], стр.

2. Изучить содержание и порядок выполнения лабораторной работы.

Основы теории

Класс является одним из основных понятий в объектно-ориентированном программировании.

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

Класс является типом данных, определяемым пользователем. В классе задаются свойства и поведение какого-либо предмета или процесса в виде полей данных и функций для работы с ними. Создаваемый тип данных обладает практически теми же свойствами, что и стандартные типы. Тип задает внутреннее представление данных в памяти компьютера, множество значений, которое могут принимать величины этого типа, а также операции и функции, применяемые к этим величинам.


Основными свойствами ООП являются инкапсуляция, наследование и полиморфизм. Ниже кратко поясняется их смысл.

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

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

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

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

Данные класса называются полями (по аналогии с полями структуры), а функции класса — методами. Поля и методы называются элементами класса. Описание класса в первом приближении выглядит так:

class <имя>

{

[ private:]

<описание скрытых элементов>

public:

<описание доступных элементов>

}; // Описание заканчивается точкой с запятой

Спецификаторы доступа private и public управляют видимостью элементов класса. Элементы, описанные после служебного слова private, видимы только внутри класса. Этот вид доступа принят в классе по умолчанию. Интерфейс класса описывается после спецификатора public. Действие любого спецификатора распространяется до следующего спецификатора или до конца класса. Можно задавать несколько секций private и public, порядок их следования значения не имеет.

Поля класса:

· могут иметь любой тип, кроме типа этого же класса (но могут быть указателями или ссылками на этот класс);

· могут быть описаны с модификатором const, при этом они инициализируются только один раз и не могут изменяться;

· могут быть описаны с модификатором static, но не как auto, extern и register.

Инициализация полей при описании не допускается.

Классы могут быть глобальными (объявленными вне любого блока) и локальными (объявленными внутри блока, например, функции или другого класса).

Ниже перечислены некоторые особенности локального класса:

· внутри локального класса можно использовать типы, статические (static) и внешние (extern) переменные, внешние функции и элементы перечислений из области, в которой он описан; запрещается использовать автоматические переменные из этой области;

· локальный класс не может иметь статических элементов;

· методы этого класса могут быть описаны только внутри класса;

· если один класс вложен в другой класс, они не имеют каких-либо особых прав доступа к элементам друг друга и могут обращаться к ним только по общим правилам.

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

class monstr

{

int health, ammo:

public:

monstr(int he = 100, int am = 10)

{health = he; ammo = am;

}

void draw(int x, int y, int scale, int position):

int get_health()

{

return health;

}

int get_ammo(){return ammo;

}

};

В этом классе два скрытых поля — health и ammo, получить значения которых извне можно с помощью методов get_health() и get_ammo(). Доступ к полям с помощью методов в данном случае кажется искусственным усложнением, но надо учитывать, что полями реальных классов могут быть сложные динамические структуры, и получение значений их элементов не так тривиально. Кроме того, очень важной является возможность вносить в эти структуры изменения, не затрагивая интерфейс класса.


Все методы класса имеют непосредственный доступ к его скрытым полям, иными словами, тела функций класса входят в область видимости private элементов класса.

В приведенном классе содержится три определения методов и одно объявление (метод draw). Если тело метода определено внутри класса, он является встроенным (inline). Как правило, встроенными делают короткие методы. Если внутри класса записано только объявление (заголовок) метода, сам метод должен быть определен в другом месте программы с помощью операции доступа к области видимости (::):

void monstr::draw(int x, int у, int scale, int position){ /* тело метода */

} Метод можно определить как встроенный и вне класса с помощью директивы inline (как и для обычных функций, она носит рекомендательный характер):

inline int monstr::get_ammo(){ return ammo;} В каждом классе есть хотя бы один метод, имя которого совпадает с именем класса. Он называется конструктором и вызывается автоматически при создании объекта класса. Конструктор предназначен для инициализации объекта. Автоматический вызов конструктора позволяет избежать ошибок, связанных с использованием неинициализированных переменных. Типы данных struct и union являются видами класса.

Конкретные переменные типа «класс» называются экземплярами класса, или объектами. Время жизни и видимость объектов зависит от вида и места их описания и подчиняется общим правилам C++:

monstr Vasia; // Объект класса monstr с параметрами по умолчанию

monstr Super(200, 300): // Объект с явной инициализацией

monstr stado[100]: // Массив объектов с параметрами по умолчанию

monstr *beavis = new monstr (10); // Динамический объект

//(второй параметр задается по умолчанию)

monstr &butthead = Vasia; // Ссылка на объект

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

Доступ к элементам объекта аналогичен доступу к полям структуры. Для этого используются операция. (точка) при обращении к элементу через имя объекта и операция -> при обращении через указатель, например:

int n = Vasia.get_ammo();

stado[5].draw;

cout << beavis->get_health();

Обратиться таким образом можно только к элементам со спецификатором publiс. Получить или изменить значения элементов со спецификатором private можно только через обращение к соответствующим методам.

Можно создать константный объект, значения полей которого изменять запрещается. К нему должны применяться только константные методы:

class monstr

{

int get_health() const {return health;}

}:

const monstr Dead(0,0); // Константный объект

cout << Dead.get_health();

Константный метод:

· объявляется с ключевым словом const после списка параметров;

· не может изменять значения полей класса;

· может вызывать только константные методы;

· может вызываться для любых (не только константных) объектов.

Рекомендуется описывать как константные те методы, которые предназначены для получения значений полей.

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

Данные характеризуют состояние объекта. Если аналогичные объекты описаны в терминах одних и тех же данных и операций, то можно обобщить идею объекта — появляется понятие класса. Класс — это не объект, а описание общих свойств (данных и операций), принадлежащих классу объектов. При выполнении программы класс не находится в памяти компьютера, как объект. Каждый объект конкретного класса содержит все определенные для этого класса поля данных. Например, каждый элемент InventoryItem может иметь идентификационный номер, описание элемента, имеющееся в наличии количество, закупочную цену, розничную цену и пр. Опишем эти общие свойства в определении класса InventoryItem. При выполнении программы создаются объекты класса InventoryItem, и для их полей данных распределяется память. Такие объекты можно изменять независимо друг от друга. Если изменяются значения полей данных, то говорят об изменении состояния объекта.

Все объекты одного класса характеризуются одинаковым поведением. Операции объекта (функции, методы) описываются в определении класса совместно с данными. Каждый объект конкретного класса может выполнять один и тот же набор операций. Эти операции выполняются "от лица" других объектов программы. Обычно они представляют собой операции над данными объекта: считывание значений полей, присваивание полям данных новых значений, печать значений и т. д. Например, объект InventoryItem может содержать среди прочего такие функции, как присваивание розничной цены или сравнение числовых идентификаторов элементов с заданным числом.
Часто программа содержит несколько объектов одного вида. Поскольку объект является экземпляром класса, термином "объект" называется каждый такой экземпляр. Некоторые называют объектом группу объектов одного вида, однако чаще для описания такой группы (потенциальных экземпляров объектов) используется термин "класс". Каждый объект одного класса имеет собственный набор полей данных, но соответствующие поля в разных объектах должны иметь одинаковые имена. Например, два объекта InventoryItem могут иметь одинаковые (или разные) значения розничной цены, а идентификационный номер в разных объектах, вероятно, будет различаться. Все объекты одного класса могут выполнять одинаковые операции, т. е. отвечают на одни и те же вызовы функций. Когда вызывается функция объекта, изменяющая состояние этого объекта или получающая информацию о состоянии объекта, говорят, что объекту передается сообщение.

Это очень важная деталь. В программе на C + + вызов функции обычно связан с использованием двух объектов. Один объект посылает сообщение (вызывает функцию), а другой — получает его (иногда говорят о нем как об адресате сообщения). Назовем объект, отправляющий сообщение, объектом-клиентом, а получателя сообщения — объектом-сервером. Подобная терминология напоминает системную архитектуру клиент/сервер, но смысл ее совсем иной. Эти термины стали применяться в объектно-ориентированном программировании намного раньше, чем приобрели популярность первые клиент-серверные системы. В данной книге много рассказывается о клиент-серверных связях между объектами в программе C++.

Как будет показано позднее, объекты в программе C + + синтаксически весьма напоминают обычные переменные — целочисленные, символьные, с плавающей точкой. Распределение памяти для них очень похоже на распределение памяти для обычных переменных: она выделяется в стеке или в динамической области (см. ниже). Класс в С++ – это синтаксическое расширение того, что в других языках называется структурами или записями, позволяющими сгруппировать компоненты данных. Класс C++ включает в себя описания данных и функций.

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

 

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

 

Задание

1. Описать класс плоских геометрических фигур: круга, квадрата, прямоугольника. Предусмотреть методы для создания объектов, перемещения на плоскости, изменения размеров и поворота на заданный угол.

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

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

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

5. Описать класс для объектов-векторов, задаваемых координатами концов в трехмерном пространстве. Обеспечить операции сложения и вычитания векторов с получением нового вектора (суммы или разности), вычисления скалярного произведения двух векторов, длины вектора, косинуса угла между векторами.

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

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

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

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

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

11. Описать класс, обеспечивающий представление матрицы произ­вольного размера с возможностью изменения числа строк и столбцов, вывода на экран подматрицы любого размера и всей матрицы.

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

12. Описать класс «домашняя библиотека». Предусмотреть возможность работы с произвольным числом книг, поиска книги по какому-либо признаку (например, по автору или по году издания), добавления книг в библиотеку, удаления книг из нее, сортировки книг по разным полям.

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

13. Описать класс «записная книжка». Предусмотреть возможность работы с произвольным числом записей, поиска записи по какому-либо признаку (например, по фамилии, дате рождения или номеру телефона), добавления и удаления записей, сортировки по разным полям.

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

14. Описать класс «студенческая группа». Предусмотреть возможность работы с переменным числом студентов, поиска студента по какому-либо признаку (например, по фамилии, дате рождения или номеру телефона), добавления и удаления записей, сортировки по разным полям.

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

15. Описать класс «множество», позволяющий выполнять основные операции — добавление и удаление элемента, пересечение, объединение и разность множеств.

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

16. Описать класс «предметный указатель». Каждый компонент указателя содержит слово и номера страниц, на которых это слово встречается. Количество номеров страниц, относящихся к одному слову, от одного до десяти. Предусмотреть возможность формирования указателя с клавиатуры и из файла, вывода указателя, вывода номеров страниц для заданного слова, удаления элемента из указателя.

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

17. Описать класс, реализующий стек. Написать программу, использующую этот класс для отыскания прохода по лабиринту.

Лабиринт представляется в виде матрицы, состоящей из квадратов. Каждый квадрат либо открыт, либо закрыт. Вход в закрытый квадрат запрещен. Если квадрат открыт, то вход в него возможен со стороны, но не с угла. Каждый квадрат определяется его координатами в матрице. После отыскания прохода программа печатает найденный путь в виде координат квадратов.

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

· перегруженные операции присваивания и конкатенации;

· операции сравнения и приведения типов;

· преобразование в число любого типа;

· форматный вывод строки.

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

19. Описать класс, реализующий тип данных «вещественная матрица» и работу с ними. Класс должен реализовывать следующие операции над матрицами:

· сложение, вычитание, умножение, деление (+, -, *, /) (умножение и деление, как на другую матрицу, так и на число);

· операции сравнения на равенство/неравенство;

· методы вычисления детерминанта;

· методы, реализующие проверку типа матрицы (квадратная, диагональная, нулевая, единичная, симметрическая, верхняя треугольная, нижняя треугольная);

· операция ввода/вывода в стандартные потоки.

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

20. Описать класс позволяющий выполнять следующие операции над обыкновенными дробями вида P / Q (P — целое, Q — натуральное):

· сложение;

· вычитание;

· умножение;

· деление;

· сокращение дроби.

 


Дата добавления: 2015-10-24; просмотров: 150 | Нарушение авторских прав


<== предыдущая страница | следующая страница ==>
Презентация в PowerPoint Presentation (не более 10 слайдов).| Исследование и расчет цепей постоянного тока

mybiblioteka.su - 2015-2024 год. (0.019 сек.)