Объектная реализация контейнера на основе комбинированной структуры «Упорядоченный массив динамических стеков»

Автор: Пользователь скрыл имя, 20 Ноября 2012 в 13:07, курсовая работа

Описание работы

Цель работы: получение навыков разработки объектных программ, включая создание набора собственных взаимосвязанных классов для объектной реализации специализированного контейнера. Контейнер предназначен для хранения и обработки, данных некоторой информационной задачи. Контейнер представляет собой двухуровневую структуру данных, в которой уровни реализуются разными способами – один статически на базе массива (непрерывная реализация), другой – динамически с использованием адресных связей (связная реализация).
Выданная задача «Сеть библиотек»
* информационные объекты: книги (свойства – Название, Количество экземпляров)
* книги объединяются в рамках объекта Библиотека (свойство – Номер)
*библиотеки объединяются в рамках объекта-контейнера Библиотечная Сеть

Содержание

Постановка задачи 3
Описание основных понятий и механизмов ООП 4
Теоретическое описание используемых структур данных 10
Описание разработанных классов 10
Алгоритмы реализации основных операций 13
Описание демонстрационного модуля 16
Описание использованных стандартных компонентов 19
Описание структуры проекта 21
Листинги подпрограмм разработанной программы 22
Список использованной литературы 40

Работа содержит 1 файл

Объектно-ориентированное программирование.docx

— 246.56 Кб (Скачать)

 

НЕГОСУДАРСТВЕННОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ

ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО  ОБРАЗОВАНИЯ

«УНИВЕРСИТЕТ  УПРАВЛЕНИЯ «ТИСБИ»


Отделение по дистанционному обучению

 

 

 

 

Курсовая работа

 

 

 

 

по курсу: ««Объектно-ориентированное программирование»»

 

на тему: «Объектная реализация контейнера на основе комбинированной  структуры «Упорядоченный массив динамических стеков»»

 

 

 

 

 

 

 

 

 

 

 

 

Работу выполнил

Студент гр.                                               _________________                

                                                                               подпись

 

 

 

 

 

 

 

Набережные Челны, 2011 г.

Оглавление

Постановка задачи

3

Описание основных понятий  и механизмов ООП

4

Теоретическое описание используемых структур данных

10

Описание разработанных  классов

10

Алгоритмы реализации основных операций

13

Описание демонстрационного  модуля

16

Описание использованных стандартных компонентов

19

Описание структуры проекта

21

Листинги подпрограмм  разработанной программы

22

Список использованной литературы

40


 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Постановка  задачи

Тема курсовой работы «Объектная реализация контейнера на основе комбинированной структуры «Упорядоченный массив динамических стеков»»

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

Выданная задача «Сеть  библиотек»

* информационные объекты:  книги (свойства – Название, Количество  экземпляров) 

* книги объединяются в  рамках объекта Библиотека (свойство  – Номер) 

* библиотеки объединяются  в рамках объекта-контейнера Библиотечная  Сеть

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Описание  основных понятий и механизмов ООП

Основными понятиями объектно-ориентированного программирования являются «объекты»  и «классы».

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

Дальнейшим развитием  процедурного программирования было так  называемое «модульное программирование» - процедуры сформировались в более  крупные единицы – модули. Модули могли отдельно компилироваться, и  подключаться к другим модулям, а  также к основной программе. При  этом модуль также инкапсулировал свою внутреннюю структуру.

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

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

Объектно-ориентированное  программирование держится на следующих  трёх концепциях:

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

Пользователь может взаимодействовать  с объектом только через этот интерфейс. Реализуется с помощью ключевого  слова: public.

Пользователь не может  использовать закрытые данные и методы. Реализуется с помощью ключевых слов: 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++. Из других языков, предоставляющих эту возможность, можно отметить Python и Эйфель. Множественное наследование поддерживается в языке UML.

Множественное наследование — потенциальный источник ошибок, которые могут возникнуть из-за наличия  одинаковых имен методов в предках. В языках, которые позиционируются  как наследники C++ (Java, C# и др.), от множественного наследования было решено отказаться в пользу интерфейсов. Практически всегда можно обойтись без использования данного механизма. Однако, если такая необходимость все-таки возникла, то, для разрешения конфликтов использования наследованных методов с одинаковыми именами, возможно, например, применить операцию расширения видимости — «::» — для вызова конкретного метода конкретного родителя.

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

Большинство современных  объектно-ориентированных языков программирования (C#, Java, Delphi и др.) поддерживают возможность одновременно наследоваться от класса-предка и реализовать методы нескольких интерфейсов одним и тем же классом. Этот механизм позволяет во многом заменить множественное наследование — методы интерфейсов необходимо переопределять явно, что исключает ошибки при наследовании функциональности одинаковых методов различных классов-предков.

 

 

 

 

Наследование  в 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) (задаём кол-во экземпляров)

Информация о работе Объектная реализация контейнера на основе комбинированной структуры «Упорядоченный массив динамических стеков»