Автор: Пользователь скрыл имя, 20 Ноября 2012 в 13:07, курсовая работа
Цель работы: получение навыков разработки объектных программ, включая создание набора собственных взаимосвязанных классов для объектной реализации специализированного контейнера. Контейнер предназначен для хранения и обработки, данных некоторой информационной задачи. Контейнер представляет собой двухуровневую структуру данных, в которой уровни реализуются разными способами – один статически на базе массива (непрерывная реализация), другой – динамически с использованием адресных связей (связная реализация).
Выданная задача «Сеть библиотек»
* информационные объекты: книги (свойства – Название, Количество экземпляров)
* книги объединяются в рамках объекта Библиотека (свойство – Номер)
*библиотеки объединяются в рамках объекта-контейнера Библиотечная Сеть
Постановка задачи 3
Описание основных понятий и механизмов ООП 4
Теоретическое описание используемых структур данных 10
Описание разработанных классов 10
Алгоритмы реализации основных операций 13
Описание демонстрационного модуля 16
Описание использованных стандартных компонентов 19
Описание структуры проекта 21
Листинги подпрограмм разработанной программы 22
Список использованной литературы 40
НЕГОСУДАРСТВЕННОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ
ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ
«УНИВЕРСИТЕТ УПРАВЛЕНИЯ «ТИСБИ»
Отделение по дистанционному обучению
по курсу: ««Объектно-ориентированное программирование»»
на тему: «Объектная реализация контейнера на основе комбинированной структуры «Упорядоченный массив динамических стеков»»
Работу выполнил
Студент гр.
_________________
Набережные Челны, 2011 г.
Оглавление | |
Постановка задачи |
3 |
Описание основных понятий и механизмов ООП |
4 |
Теоретическое описание используемых структур данных |
10 |
Описание разработанных классов |
10 |
Алгоритмы реализации основных операций |
13 |
Описание демонстрационного модуля |
16 |
Описание использованных стандартных компонентов |
19 |
Описание структуры проекта |
21 |
Листинги подпрограмм разработанной программы |
22 |
Список использованной литературы |
40 |
Постановка задачи
Тема курсовой работы «Объектная реализация контейнера на основе комбинированной структуры «Упорядоченный массив динамических стеков»»
Цель работы: получение навыков разработки объектных программ, включая создание набора собственных взаимосвязанных классов для объектной реализации специализированного контейнера. Контейнер предназначен для хранения и обработки, данных некоторой информационной задачи. Контейнер представляет собой двухуровневую структуру данных, в которой уровни реализуются разными способами – один статически на базе массива (непрерывная реализация), другой – динамически с использованием адресных связей (связная реализация).
Выданная задача «Сеть библиотек»
* информационные объекты: книги (свойства – Название, Количество экземпляров)
* книги объединяются в рамках объекта Библиотека (свойство – Номер)
* библиотеки объединяются
в рамках объекта-контейнера
Описание основных понятий и механизмов ООП
Основными понятиями объектно-
Объектно-ориентированное программирование возникло как дальнейшее развитие процедурного программирования, где данные и подпрограммы (процедуры и функции) и их обработки формально не связанны. Процедуры описывают сами алгоритмы обработки вводимых данных, и могут вызываться основной программой или другими процедурами для самых разных данных. При этом процедура инкапсулирует (то есть скрывает) от других процедур и основной программы обработку вводимых данных. То есть она работает по принципу «чёрного ящика» - как правило, другим подпрограммам доступны только ввод и вывод процедуры.
Дальнейшим развитием процедурного программирования было так называемое «модульное программирование» - процедуры сформировались в более крупные единицы – модули. Модули могли отдельно компилироваться, и подключаться к другим модулям, а также к основной программе. При этом модуль также инкапсулировал свою внутреннюю структуру.
Объектно-ориентированное программирование основано на использовании понятия «класс». Этот тип данных, который может содержать поля – то есть данные других типов в виде полей, а также методы - процедуры и функции для обработки этих данных. Данные типа «класс» называются экземплярами класса. При этом отдельные поля или методы могут быть как доступны извне (публичные поля и методы), так и доступны только другим методам объекта (приватные или защищённые поля и методы).
Среди методов выделяют два
особых – конструктор и деструктор.
Первый вызывается при создании экземпляра
класса, и выполняет выделение
места в памяти для экземпляра
и инициализацию полей
Объектно-ориентированное программирование держится на следующих трёх концепциях:
Инкапсуляция — свойство языка программирования, позволяющее пользователю не задумываться о сложности реализации используемого программного компонента (то, что у него внутри), а взаимодействовать с ним посредством предоставляемого интерфейса (публичных методов и членов), а также объединить и защитить жизненно важные для компонента данные. При этом пользователю предоставляется только спецификация (интерфейс) объекта.
Пользователь может
Пользователь не может использовать закрытые данные и методы. Реализуется с помощью ключевых слов: private, protected, internal.
Сокрытие реализации целесообразно применять в следующих случаях:
- предельная локализация изменений при необходимости таких изменений,
- прогнозируемость изменений (какие изменения в коде надо сделать для заданного изменения функциональности) и прогнозируемость последствий изменений.
Пример C++
class A
{
public:
int a, b; //данные открытого интерфейса
int ReturnSomething(); //метод открытого интерфейса
private:
int Aa, Ab; //скрытые данные
void DoSomething(); //скрытый метод
};
Класс А инкапсулирует свойства Aa, Ab и метод DoSomething, представляя внешний интерфейс ReturnSomething, a, b.
Пример Delphi
В Delphi для создания скрытых полей или методов их достаточно объявить в секции private.
TMyClass = class
private
FMyField: Integer;
procedure SetMyField(const Value: Integer);
function GetMyField: Integer;
protected
public
property MyField: Integer read GetMyField write SetMyField;
end;
Для создания интерфейса доступа к скрытым полям в Delphi введены свойства.
Пример Java
class A
{
private int a;
private int b;
private void DoSomething() //скрытый метод
{
//actions
}
public int ReturnSomething() //открытый интерфейс
{
return a;
}
}
Наследование — механизм позволяющий описать новый класс на основе уже существующего (родительского), при этом свойства и функциональность родительского класса заимствуются новым классом.
Другими словами, класс-наследник реализует спецификацию уже существующего класса (базовый класс). Это позволяет обращаться с объектами класса-наследника точно так же, как с объектами базового класса.
Простое наследование
Класс, от которого произошло наследование, называется базовым или родительским (англ. base class). Классы, которые произошли от базового, называются потомками, наследниками или производными классами (англ. derived class).
В некоторых языках используются абстрактные классы. Абстрактный класс — это класс, содержащий хотя бы один абстрактный метод, он описан в программе, имеет поля, методы и не может использоваться для непосредственного создания объекта. То есть от абстрактного класса можно только наследовать. Объекты создаются только на основе производных классов, наследованных от абстрактного. Например, абстрактным классом может быть базовый класс «сотрудник вуза», от которого наследуются классы «аспирант», «профессор» и т. д. Так как производные классы имеют общие поля и функции (например, поле «год рождения»), то эти члены класса могут быть описаны в базовом классе. В программе создаются объекты на основе классов «аспирант», «профессор», но нет смысла создавать объект на основе класса «сотрудник вуза».
Множественное наследование
При множественном наследовании
у класса может быть более одного
предка. В этом случае класс наследует
методы всех предков. Достоинства такого
подхода в большей гибкости. Множественное
наследование реализовано в C++. Из других
языков, предоставляющих эту
Множественное наследование — потенциальный источник ошибок, которые могут возникнуть из-за наличия одинаковых имен методов в предках. В языках, которые позиционируются как наследники C++ (Java, C# и др.), от множественного наследования было решено отказаться в пользу интерфейсов. Практически всегда можно обойтись без использования данного механизма. Однако, если такая необходимость все-таки возникла, то, для разрешения конфликтов использования наследованных методов с одинаковыми именами, возможно, например, применить операцию расширения видимости — «::» — для вызова конкретного метода конкретного родителя.
Попытка решения проблемы наличия одинаковых имен методов в предках была предпринята в языке Эйфель, в котором при описании нового класса необходимо явно указывать импортируемые члены каждого из наследуемых классов и их именование в дочернем классе.
Большинство современных
объектно-ориентированных
Наследование в C++
class A{ //базовый класс
};
class B : public A{ //public наследование
};
class C : protected A{ //protected наследование
};
class Z : private A{ //private наследование
};
Для использования механизма наследования в Delphi необходимо в объявлении класса справа от слова class указать класс предок:
Предок:
TAncestor = class
private
protected
public
// Виртуальная процедура
procedure VirtualProcedure; virtual; abstract;
procedure StaticProcedure;
end;
Наследник:
TDescendant = class(TAncestor)
private
protected
public
// Перекрытие виртуальной процедуры
procedure VirtualProcedure; override;
procedure StaticProcedure;
end;
Полиморфизм. Здесь подразумевается свойство системы использовать объекты с одинаковым интерфейсом, не имея информации об их типе.
Полиморфизм позволяет писать более абстрактные программы и повысить коэффициент повторного использования кода. Общие свойства объектов объединяются в систему, которую могут называть по-разному — интерфейс, класс. Общность имеет внешнее и внутреннее выражение:
- внешняя общность проявляется как одинаковый набор методов с одинаковыми именами и сигнатурами (именем методов и типами аргументов и их количеством);
- внутренняя общность — одинаковая функциональность методов. Её можно описать интуитивно или выразить в виде строгих законов, правил, которым должны подчиняться методы. Возможность приписывать разную функциональность одному методу (функции, операции) называется перегрузкой метода (перегрузкой функций, перегрузкой операций).
Теоретическое описание используемых структур данных
Описание разработанных классов
Список книг по заданию должен быть организован в виде стека. Необходимые данные о книге это название книги и количество её экземпляров. Значит, класс TBook будет иметь два поля – название и количество экземпляров. Также он должен содержать конструктор и методы для доступа к полям. Схематически изобразим класс TBook.
Класс TBook |
FName: string (приватное поле) FCopyi: integer (приватное поле) |
constructor Create(const Name:string; Size: integer) function GetName: string (получаем название) procedure SetName(const Value: string) (задаём название) function GetCopyi: integer (получаем кол-во экземпляров) procedure SetCopyi(const Value: integer) (задаём кол-во экземпляров) |