Разработка библиотеки классов "Заказ товаров"
Характеристика основных средств проектирования, абстрагирования и выделения классов. Моделирование иерархии классов. Анализ структуры программного продукта. Проектирование управляющих и интерфейсных классов. Описание структуры тестирующей программы.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | практическая работа |
Язык | русский |
Дата добавления | 17.01.2020 |
Размер файла | 929,2 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ
Федеральное государственное автономное образовательное учреждение
высшего образования
«САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
АЭРОКОСМИЧЕСКОГО ПРИБОРОСТРОЕНИЯ»
ИНСТИТУТ НЕПРЕРЫВНОГО И ДИСТАНЦИОННОГО ОБРАЗОВАНИЯ
КУРСОВАЯ РАБОТА
Разработка библиотеки классов «Заказ товаров»
по дисциплине: Объектно-ориентированное программирование
РАБОТУ ВЫПОЛНИЛ
СТУДЕНТ ГР. Z6432K
Гараненков А.М
Старший преподаватель
Шумова Е.О.
Санкт-Петербург, 2019
Задание на курсовое проектирование
1. Цели и задачи курсового проектирования
Целями курсового проекта являются:
- закрепление знаний, полученных в ходе изучения дисциплины «Объектноориентированное программирование»
- приобретение навыков практического программирования с использованием объектно-ориентированной парадигмы
- изучение отдельных разделов предметной области, не вошедших в программу теоретического обучения, формирование навыка поиска информации по конкретной теме, ее анализа и использования для решения задачи моделирование программа интерфейсный
- подготовка к выполнению выпускной квалификационной работы
Задачей курсового проекта является разработка иерархии типов в заданной предметной области, включающей в себя:
- разработку иерархии классов
- разработку приложения
- разработку документации
- подготовку презентации.
2. Тематика курсового проекта
В ходе выполнения курсового проекта студенты должны практически освоить общий методологический подход, используемый при проектировании и программной реализации системы классов, соответствующей объектно-ориентированной парадигме программирования. Создаваемая система классов описывает (моделирует) определённую предметную область и может служить основой для полноценной информационной системы, решающей задачи данной области. Спроектированная система классов должна быть не только реализована в виде программы, но и протестирована. Для тестирования классов студент должен разработать приложение, функциональные возможности которого должны демонстрировать различные варианты использования объектов созданных классов.
3. Задание на курсовое проектирование
В ходе курсового проекта необходимо разработать приложение, позволяющее протестировать взаимодействие объектов классов, спроектированных и реализованных студентом для решения конкретной задачи при заданных критериях. При разработке программного обеспечения следует использовать шаблоны проектирования. Также предпочтение должно быть отдано графическому приложению.
При этом подлежат разработке следующие вопросы:
а) анализ задания;
б) разработка библиотеки классов
в) разработка тестового приложения;
г) оформление расчётно-пояснительной записки по результатам выполнения проекта
д) создание презентации к проекту
1. Предметная область
1.1 Анализ задачи
В рамках курсовой работы необходимо разработать структуру классов для предметной области «Заказ товаров».
Некоторая компания торгует различными товарами. Каждый товар имеет название и цену. Товары бывают двух категорий. Первая категория товаров продается поштучно, и цена указывается за единицу товара. Другие товары могут иметь единицы измерения и продаваться на вес, отмер, объем и т.п. Для них цена указывается за выбранную для них единицу измерения.
Все товары находятся на складе. Товарной позицией на складе называют товар и его количество в наличии.
При формировании заказа покупатель формирует заказ, который также состоит из позиций необходимых ему товаров. Для каждого товара заказчик указывает необходимое количество. По заказу высчитывается общая сумма.
1.2 Требования к проекту
Программа для предметной области «Заказ товаров» должна выполнять следующие функции:
-хранить список товарных позиций на складе;
-выводить на экран или в файл список позиций на складе;
-добавлять новый товар на склад или изменять количество товара;
-выполнять поиск товара на складе;
-создавать новый заказ;
-просматривать список заказов;
-хранить список товарных позиций в заказе;
-выводить на экран или в файл список позиций в заказе;
-добавлять новый товар в заказ или изменять количество в заказе;
-выполнять поиск товара в заказе.
Программа должна быть разработана на языке С++.
Программа должна иметь консольный интерфейс и меню позволяющий выбирать функцию программы.
Для хранения данных программы используются текстовые файлы.
2. Проектная часть
2.1 Средства проектирования
В процессе проектирования необходимо выделить основные классы системы и составить диаграмму классов.
Для построения диаграммы классов будем использовать средство проектирования StarUML.
StarUML - это проект с открытым кодом для разработки быстрых, гибких, расширяемых, функциональных и, главное, распространяемых бесплатно платформ UML/MDA для 32-разрядных систем Windows. Цель проекта StartUML - создание универсальной бесплатной платформы для моделирования, которая послужит аналогом для таких коммерческих проектов, как Rational Rose, Together и других.
Простота использования является наиболее важной характеристикой в разработке приложений. Бесплатная платформа StarUML выгодно отличается от своих аналогов, в том числе и коммерческих, поддержкой множества особенностей, таких как быстрый диалог, управление с помощью клавиатуры, обзор диаграмм и многое другое. Кроме того, все эти дополнения понятны даже для неподготовленного пользователя.
2.2 Абстрагирование и выделение классов
В рамках системы выделим следующие классы:
-Класс Goods - класс, описывающий любой товар;
-Класс PieceGoods - класс, описывающий товар продаваемый поштучно. Класс будет наследоваться от класса Goods.
- Класс WeightGoods - класс, описывающий товар продаваемый на вес, отмер, объем и .п. Класс будет наследоваться от класса Goods.
- Класс GoodsPosition - класс, описывающий товарную позицию (пара товар/количество);
- Класс PositionList - класс, описывающий контейнер для товарных позиций. В программе класс может представлять как состояние склада, так и состояние заказа. И склад, и заказ, можно представить как список позиций.
- Класс Input - класс, обеспечивающий ввод данных с потока;
- Класс Print - класс, обеспечивающий вывод данных в поток;
- Класс Goods - класс, обеспечивающий вывод меню и организацию диалога с пользователем.
2.3 Моделирование иерархии классов
Диаграмма классов для системы показана на рисунке 2.1.
Рисунок 2.1 - Диаграмма классов
На диаграмме присутствуют следующие виды отношений между классами:
-обобщение (наследование) - для классов, описывающих товары;
-агрегация, для классов реализующих контейнеры и содержащие ссылки на другие классы;
-зависимость, для интерфейсных классов, реализующих ввод и вывод данных из потока.
Класс для вывода меню никак не зависит от остальных классов системы, поэтому не связан с ними никакими отношениями.
Детальный состав свойств и методов классов будет рассмотрен в следующем разделе.
3. Практическая часть
3.1 Структура программного продукта
Код программы состоит из следующих модулей:
-Goods.h - описание и реализация класса «Goods»;
-GoodsPosition.h- описание и реализация класса «GoodsPosition»;
-PieceGoods.h- описание и реализация класса «PieceGoods»;
-WeightGoods.h- описание и реализация класса «WeightGoods»;
-PositionList.h- описание и реализация класса «PositionList»;
-Input.h- описание и реализация класса «Input»;
-Print.h- описание и реализация класса «Print»;
-Menu.h- описание и реализация класса «Menu»;
-Source.cpp -главный модуль программы.
3.2 Проектирование классов сущностей
К классам сущностей относятся классы: Goods, PieceGoods, WeightGoods и GoodsPosition.
Класс Goods имеет следующие поля:
static int ID; //Генератор id
int id; //Уникальный номер
char Title[100]; //Название
double Cost; //Цена
В классе описано 2 конструктора:
- Goods() - конструктор по умолчанию;
- Goods(char * Title, double Cost) - конструктор с параметрами.
Спецификация методов класса приведена в таблице 3.1.
Таблица 3.1 - Спецификация методов класса Goods
Метод Type() |
||
Назначение |
Возвращает тип объета |
|
Область видимости |
public |
|
Заголовок |
virtual char Type() = 0 |
|
Параметры |
Нет |
|
Тип возвращаемого значения |
char |
|
Возвращаемое значение |
Тип объекта |
|
Примечание |
Метод абстрактный, будет переопределен у наследников |
|
Метод getID |
||
Назначение |
Вернуть ID |
|
Область видимости |
public |
|
Заголовок |
int getID() |
|
Параметры |
Нет |
|
Тип возвращаемого значения |
int * |
|
Возвращаемое значение |
ID товара |
|
Метод setID |
||
Назначение |
Установить ID |
|
Область видимости |
public |
|
Заголовок |
void setID(int value) |
|
Параметры |
int value - знаечение |
|
Тип возвращаемого значения |
void |
|
Метод getTitle |
||
Назначение |
Вернуть название |
|
Область видимости |
public |
|
Заголовок |
char * getTitle() |
|
Параметры |
нет |
|
Тип возвращаемого значения |
char * |
|
Возвращаемое значение |
Строка название |
|
Метод setTitle |
||
Назначение |
Присвоить название |
|
Область видимости |
public |
|
Заголовок |
void setTitle(char * value) |
|
Параметры |
char * value - название |
|
Тип возвращаемого значения |
void |
|
Метод getCost |
||
Назначение |
Вычислить цену |
|
Область видимости |
public |
|
Заголовок |
double getCost() |
|
Параметры |
нет |
|
Тип возвращаемого значения |
Double |
|
Возвращаемое значение |
Цена |
|
Метод setCost |
||
Назначение |
Присвоить цену |
|
Область видимости |
Public |
|
Заголовок |
void setCost(double value) |
|
Параметры |
double value - цена |
|
Тип возвращаемого значения |
Void |
|
Метод Write |
||
Назначение |
Печать в поток |
|
Область видимости |
Public |
|
Заголовок |
void Write(ofstream &f) |
|
Параметры |
ofstream &f - поток |
|
Тип возвращаемого значения |
Void |
|
Примечание |
Метод виртуальный |
|
Метод Read |
||
Назначение |
Чтение из потока |
|
Область видимости |
Public |
|
Заголовок |
void Read(ifstream &f) |
|
Параметры |
ifstream &f - поток |
|
Тип возвращаемого значения |
void |
|
Примечание |
Метод виртуальный |
Класс WeightGoods является наследником класса Goods.
Дополнительно класс имеет поле:
char Meagure[10]; //Единицы измерения (кг, тонны, граммы, караты)
В классе описано 2 конструктора:
- WeightGoods() - конструктор по умолчанию;
- WeightGoods(char * Title, double Cost, char * Meagure = "кг") - конструктор с параметрами.
Спецификация методов класса приведена в таблице 3.2.
Таблица 3.1 - Спецификация методов класса WeightGoods
Метод Type() |
||
Назначение |
Возвращает тип объета |
|
Область видимости |
public |
|
Заголовок |
virtual char Type() |
|
Параметры |
Нет |
|
Тип возвращаемого значения |
char |
|
Возвращаемое значение |
Тип объекта |
|
Метод getMeagure |
||
Назначение |
Вернуть единицы измерения |
|
Область видимости |
public |
|
Заголовок |
char * getMeagure() |
|
Параметры |
Нет |
|
Тип возвращаемого значения |
char * |
|
Возвращаемое значение |
Единицы измерения |
|
Метод setMeagure |
||
Назначение |
Установить единицы измерения |
|
Область видимости |
public |
|
Заголовок |
void setMeagure(char * value) |
|
Параметры |
int value - знаечение |
|
Тип возвращаемого значения |
void |
|
Метод getTitle |
||
Назначение |
Вернуть название |
|
Область видимости |
public |
|
Заголовок |
char * getTitle() |
|
Параметры |
нет |
|
Тип возвращаемого значения |
char * |
|
Возвращаемое значение |
Строка название |
|
Метод Write |
||
Назначение |
Печать в поток |
|
Область видимости |
public |
|
Заголовок |
void Write(ofstream &f) |
|
Параметры |
ofstream &f - поток |
|
Тип возвращаемого значения |
void |
|
Примечание |
Метод виртуальный |
|
Метод Read |
||
Назначение |
Чтение из потока |
|
Область видимости |
public |
|
Заголовок |
void Read(ifstream &f) |
|
Параметры |
ifstream &f - поток |
|
Тип возвращаемого значения |
void |
|
Примечание |
Метод виртуальный |
Класс PieceGoods является наследником класса Goods.
В классе описан конструктор:
- PieceGoods() - конструктор по умолчанию.
Спецификация методов класса приведена в таблице 3.3.
Таблица 3.3 - Спецификация методов класса PieceGoods
Метод Type() |
||
Назначение |
Возвращает тип объета |
|
Область видимости |
public |
|
Заголовок |
virtual char Type() |
|
Параметры |
Нет |
|
Тип возвращаемого значения |
char |
|
Возвращаемое значение |
Тип объекта |
|
Метод Write |
||
Назначение |
Печать в поток |
|
Область видимости |
public |
|
Заголовок |
void Write(ofstream &f) |
|
Параметры |
ofstream &f - поток |
|
Тип возвращаемого значения |
void |
|
Примечание |
Метод виртуальный |
|
Метод Read |
||
Назначение |
Чтение из потока |
|
Область видимости |
public |
|
Заголовок |
void Read(ifstream &f) |
|
Параметры |
ifstream &f - поток |
|
Тип возвращаемого значения |
void |
|
Примечание |
Метод виртуальный |
Класс GoodsPosition имеет следующие поля:
int id; //Товар (id)
double Quantity; //Количество
В классе описано 3 конструктора:
- GoodsPosition() - конструктор по умолчанию;
- GoodsPosition(int id, double Quantity = 1) - конструктор с параметрами;
- GoodsPosition(Goods * goods, double Quantity = 1): GoodsPosition(goods->getID(),Quantity) - конструктор копирования
Спецификация методов класса приведена в таблице 3.4.
Таблица 3.4 - Спецификация методов класса GoodsPosition
Метод getID |
||
Назначение |
Вернуть ID |
|
Область видимости |
public |
|
Заголовок |
int getID() |
|
Параметры |
Нет |
|
Тип возвращаемого значения |
int * |
|
Возвращаемое значение |
ID товара |
|
Метод setID |
||
Назначение |
Установить ID |
|
Область видимости |
public |
|
Заголовок |
void setID(int value) |
|
Параметры |
int value - знаечение |
|
Тип возвращаемого значения |
void |
|
Метод getQuantity |
||
Назначение |
Вернуть количество |
|
Область видимости |
public |
|
Заголовок |
double getQuantity() |
|
Параметры |
нет |
|
Тип возвращаемого значения |
double |
|
Возвращаемое значение |
Количество |
|
Метод setQuantity |
||
Назначение |
Присвоить название |
|
Область видимости |
public |
|
Заголовок |
void setQuantity(double value) |
|
Параметры |
double value - название |
|
Тип возвращаемого значения |
void |
|
Метод Write |
||
Назначение |
Печать в поток |
|
Область видимости |
public |
|
Заголовок |
void Write(ofstream &f) |
|
Параметры |
ofstream &f - поток |
|
Тип возвращаемого значения |
void |
|
Примечание |
Метод виртуальный |
|
Метод Read |
||
Назначение |
Чтение из потока |
|
Область видимости |
public |
|
Заголовок |
void Read(ifstream &f) |
|
Параметры |
ifstream &f - поток |
|
Тип возвращаемого значения |
void |
|
Примечание |
Метод виртуальный |
3.3 Проектирование управляющих классов
К управляющим в программе относится класс PositionList.
В классе описаны следующие поля:
bool foreingoods = false; //принадлежность списка
Goods * * goods = NULL; //Массив из товаров
int * goodscount = NULL; //Количество
GoodsPosition * * positions = NULL; //Массив из позиций
int positionscount = 0; //Количество
char Title[100]; //Название
char Comments[200]; //Дополнительные сведения (дата, контакты)
В классе описано 2 конструктора:
- PositionList() - конструктор по умолчанию;
- PositionList(Goods * * goods, int * goodscount) - конструктор с параметрами.
В классе описан деструктор:
~PositionList()
Спецификация методов класса приведена в таблице 3.5.
Таблица 3.5 - Спецификация методов класса PositionList
Метод goodsCount() |
||
Назначение |
Вернуть количество товаров |
|
Область видимости |
public |
|
Заголовок |
int goodsCount() |
|
Параметры |
Нет |
|
Тип возвращаемого значения |
int |
|
Возвращаемое значение |
Количество товаров |
|
Метод getgoodsCount() |
||
Назначение |
Вернуть ссылку на количество товаров |
|
Область видимости |
public |
|
Заголовок |
int * getgoodsCount() |
|
Параметры |
Нет |
|
Тип возвращаемого значения |
int * |
|
Возвращаемое значение |
Ссылка на количество товаров |
|
Метод getTitle |
||
Назначение |
Вернуть название |
|
Область видимости |
public |
|
Заголовок |
char * getTitle() |
|
Параметры |
нет |
|
Тип возвращаемого значения |
char * |
|
Возвращаемое значение |
Строка название |
|
Метод setTitle |
||
Назначение |
Присвоить название |
|
Область видимости |
public |
|
Заголовок |
void setTitle(char * value) |
|
Параметры |
char * value - название |
|
Тип возвращаемого значения |
void |
|
Метод getComments |
||
Назначение |
Вернуть комментарий |
|
Область видимости |
public |
|
Заголовок |
char * getComments() |
|
Параметры |
нет |
|
Тип возвращаемого значения |
char * |
|
Возвращаемое значение |
Строка комментарий |
|
Метод setComments |
||
Назначение |
Присвоить комментарий |
|
Область видимости |
public |
|
Заголовок |
void setComments(char * value) |
|
Параметры |
char * value - комментарий |
|
Тип возвращаемого значения |
void |
|
Метод Add |
||
Назначение |
Добавить товар |
|
Область видимости |
public |
|
Заголовок |
void Add(Goods * g) |
|
Параметры |
Goods * g - товар |
|
Тип возвращаемого значения |
void |
|
Метод Add |
||
Назначение |
Добавить позицию |
|
Область видимости |
public |
|
Заголовок |
bool Add(GoodsPosition * gp) |
|
Параметры |
GoodsPosition * gp - товарная позиция |
|
Тип возвращаемого значения |
bool |
|
Возвращаемое значение |
Признак успешного добавления |
|
Метод Add |
||
Назначение |
Изменить количество |
|
Область видимости |
public |
|
Заголовок |
bool Add(int id, double Quantity) |
|
Параметры |
int id - номер позиции double Quantity - количество |
|
Тип возвращаемого значения |
bool |
|
Возвращаемое значение |
Признак успешного добавления |
|
Метод IndexOf |
||
Назначение |
Поиск по индексу |
|
Область видимости |
public |
|
Заголовок |
int IndexOf(int id) |
|
Параметры |
int id - номер позиции |
|
Тип возвращаемого значения |
int |
|
Возвращаемое значение |
Индекс найденного элемента |
|
Метод getGoods |
||
Назначение |
Доступ к товарам по индексу |
|
Область видимости |
public |
|
Заголовок |
Goods * getGoods(int index) |
|
Параметры |
int index - номер позиции |
|
Тип возвращаемого значения |
Goods * |
|
Возвращаемое значение |
Ссылка на товар |
|
Метод getGoods |
||
Назначение |
Доступ к списку товаров |
|
Область видимости |
public |
|
Заголовок |
Goods ** getGoods() |
|
Параметры |
Нет |
|
Тип возвращаемого значения |
Goods ** |
|
Возвращаемое значение |
Ссылка на массив товаров |
|
Метод getPosition |
||
Назначение |
Доступ к позиции |
|
Область видимости |
public |
|
Заголовок |
GoodsPosition * getPosition(int index) |
|
Параметры |
int index - номер позиции |
|
Тип возвращаемого значения |
GoodsPosition * |
|
Возвращаемое значение |
Ссылка на позицию |
|
Метод IndexOf |
||
Назначение |
Поиск по названию |
|
Область видимости |
public |
|
Заголовок |
int IndexOf(char * Title) |
|
Параметры |
char * Title - название |
|
Тип возвращаемого значения |
int |
|
Возвращаемое значение |
Индекс найденного элемента |
|
Метод WriteGoods |
||
Назначение |
Печать в поток списка товаров |
|
Область видимости |
public |
|
Заголовок |
void WriteGoods(ofstream &f) |
|
Параметры |
ofstream &f - поток |
|
Тип возвращаемого значения |
void |
|
Метод WritePositions |
||
Назначение |
Печать в поток списка позиций |
|
Область видимости |
public |
|
Заголовок |
void WritePositions(ofstream &f) |
|
Параметры |
ofstream &f - поток |
|
Тип возвращаемого значения |
void |
|
Метод ReadGoods |
||
Назначение |
Чтение из потока списка товаров |
|
Область видимости |
public |
|
Заголовок |
void ReadGoods(ifstream &f) |
|
Параметры |
ifstream &f - поток |
|
Тип возвращаемого значения |
void |
|
Метод ReadPositions |
||
Назначение |
Чтение из потока списка позиций |
|
Область видимости |
public |
|
Заголовок |
void ReadPositions(ifstream &f) |
|
Параметры |
ifstream &f - поток |
|
Тип возвращаемого значения |
void |
3.4 Проектирование интерфейсных классов
В программе реализовано 3 интерфейсных класса:
- Menu - реализует текстовое меню для взаимодействия с пользователем;
- Print - реализует вывод на консоль информации о различных объектах системы;
- Input - реализует ввод с консоли информации о различных объектах системы.
Класс Menu имеет одно закрытое поле описанное как:
char valid[256]
содержащее в себе массив допустимых обозначений команд.
В классе описано 2 конструктора:
- Menu() - конструктор по умолчанию;
- Menu(char * symbols) - конструктор с параметрами.
Спецификация методов класса приведена в таблице 3.6.
Таблица 3.6 - Спецификация методов класса Menu
Метод IsValid |
||
Назначение |
Проверка, допустим ли введенный символ (является ли командой) |
|
Область видимости |
private |
|
Заголовок |
bool IsValid(char c) |
|
Параметры |
char c - введенный символ |
|
Тип возвращаемого значения |
bool |
|
Возвращаемое значение |
Истина, если символ допустим и ложь в ином случае |
|
Метод Helper |
||
Назначение |
Вывод меню на экран |
|
Область видимости |
public |
|
Заголовок |
void Helper() |
|
Параметры |
нет |
|
Тип возвращаемого значения |
void |
|
Метод setValid |
||
Назначение |
Установить разрешенные символы |
|
Область видимости |
public |
|
Заголовок |
void setValid(char * symbols) |
|
Параметры |
char * symbols - разрешенные символы |
|
Тип возвращаемого значения |
void |
|
Метод get |
||
Назначение |
Вернуть символ, введенный пользователем |
|
Область видимости |
public |
|
Заголовок |
char get() |
|
Параметры |
нет |
|
Тип возвращаемого значения |
void |
Класс Print не имеет полей.
Спецификация методов класса приведена в таблице 3.7.
Таблица 3.7 - Спецификация методов класса Print
Метод print |
||
Назначение |
Печать на экране информации об объекте |
|
Область видимости |
public |
|
Примечание |
Метод имеет 5 перегрузок |
|
Все перегрузки описаны как static |
||
Заголовок |
void print(GoodsPosition * g, PositionList * p) |
|
Параметры |
GoodsPosition * g - товарная позиция PositionList * p - список товаров |
|
Тип возвращаемого значения |
void |
|
Заголовок |
void print(PieceGoods * g) |
|
Параметры |
PieceGoods * g - штучный товар |
|
Тип возвращаемого значения |
void |
|
Заголовок |
void print(WeightGoods * g) |
|
Параметры |
WeightGoods * g - весовой товар |
|
Тип возвращаемого значения |
void |
|
Заголовок |
void print(Goods * g) |
|
Параметры |
Goods * g - товар |
|
Тип возвращаемого значения |
void |
|
Заголовок |
void print(PositionList * g, bool goods=true) |
|
Параметры |
PositionList * g, - список товаров bool goods=true - товар |
|
Тип возвращаемого значения |
void |
|
Метод printGoods |
||
Назначение |
Вывод списка товаров |
|
Область видимости |
private |
|
Примечание |
Метод объявлен как static |
|
Заголовок |
void printGoods(PositionList * g) |
|
Параметры |
PositionList * g - список товаров |
|
Тип возвращаемого значения |
void |
|
Метод printPositions |
||
Назначение |
Вывод списка позиций |
|
Область видимости |
private |
|
Примечание |
Метод объявлен как static |
|
Заголовок |
void printPositions(PositionList * g) |
|
Параметры |
PositionList * g - список товаров |
|
Тип возвращаемого значения |
void |
Класс Input не имеет полей.
Спецификация методов класса приведена в таблице 3.8.
Таблица 3.8 - Спецификация методов класса Input
Метод input |
||
Назначение |
Ввод информации об объекте с клавиатуры |
|
Область видимости |
public |
|
Примечание |
Метод имеет 4 перегрузки |
|
Все перегрузки описаны как static |
||
Заголовок |
static void input(Goods * g) |
|
Параметры |
Goods * g - товар |
|
Тип возвращаемого значения |
void |
|
Заголовок |
void input(PieceGoods * g) |
|
Параметры |
PieceGoods * g - штучный товар |
|
Тип возвращаемого значения |
void |
|
Заголовок |
void input(WeightGoods * g) |
|
Параметры |
WeightGoods * g - весовой товар |
|
Тип возвращаемого значения |
void |
|
Заголовок |
bool input(GoodsPosition * g, PositionList * p) |
|
Параметры |
Goods * g - товар |
|
Тип возвращаемого значения |
void |
4. Экспериментальная часть
4.1 Цели тестирования
Объект тестирования: программа «Orders».
Цель тестирования: убедится в корректной работе программы и выполнении ей всех заявленных функций.
Метод тестирования: функциональное тестирование.
4.2 Структура тестирующей программы
Для выбора функции в программе предусмотрено меню показанное на рисунке 4.1.
Рисунок 4.1 - Меню программы
Для добавления товара необходимо указать его вид, название и цену (рисунок 4.2).
Рисунок 4.2 - Добавление товара
На рисунке 4.3 показан вывод списка товаров на складе.
Рисунок 4.3 - Вывод списка товаров на складе
Для поиска необходимо ввести название товара (рисунок 4.4).
Рисунок 4.4 - Поиск товара на складе
Для создания заказа необходимо ввести его название и описание (рисунок 4.5.)
Рисунок 4.5 - Создание заказа
На рисунке 4.6 показаны примеры добавления товаров в заказ (рисунок 4.6).
Рисунок 4.6 - Добавления товаров в заказ
На рисунке 4.7 показан пример просмотра содержимого текущего заказа.
Рисунок 4.7 - Просмотр текущего заказа
Также можно просмотреть список заказов (рисунок 4.8).
Рисунок 4.8 - Просмотр списка заказов
4.3 Тесты
Результаты тестирования приведены в таблице 4.1.
Таблица 4.1 - Результаты тестирования
Тест |
Ожидаемый результат |
Результат теста |
|
Вывод списка товаров на складе |
Выводится список товаров на складе |
Успешно |
|
Добавление нового товара на склад |
Товар добавлен |
Успешно |
|
Изменение количества товара на складе |
Позиция отредактирована |
Успешно |
|
Вывод списка заказов |
Выводится список заказов |
Успешно |
|
Выбор текущего заказа |
Заказ выбран |
Успешно |
|
Вывод списка товаров в заказе |
Выводится список товаров в заказе |
Успешно |
|
Добавление нового товара в заказ |
Товар добавлен в заказ |
Успешно |
|
Изменение количества товара заказе |
Позиция отредактирована |
Успешно |
По результатам тестирования можно сделать вывод, что программа работает корректно и выполняет функции в полном объеме.
Список использованных источников
1. Грейди Буч. UML. Руководство пользователя / Буч Горейди, Джеймс Рамбо, Айвар Джекобсон. -- М. : ДМК, 2000. -- 432 с.
2. Жарков В. Visual C++ на практике / Валерий Жарков - Москва.: Лаборатория компьютерных знаний, 2002 - 424с.
3. Леоненков A. Самоучитель UML 2 / А. Леоненков. - Санкт-Петербург.: БХВ-Петербург, 2007 - 576с.
4. Липпман С. Язык программирования C++. Базовый курс / Стенли Б. Липпман, Жози Лажойе, Барбара Э. Му - М.:Вильямс, 2017 - 1120с.
5. Пахомов Б. C/C++ и MS Visual C++ 2012 для начинающих / Борис Пахомов -СПб.: БХВ-Петербург, 2015 - 518с.
6. Страуструп Б. Язык программирования С++ / Бьерн Страуструп - М.:Бином, 2015 - 1136с.
7. Хогенсон Г. C++/CLI. Язык Visual C++ для среды .NET/ Гордон Хогенсон - Москва.:Вильямс, 2007 - 464с.
8. Холзнер С. Visual C++ 6. Учебный курс / Стивен Холзнер -СПб.:Питер, 2007 - 570с.
9. Фаулер М. UML. Основы. Краткое руководство по стандартному языку объектного моделирования / М. Фаулер - Москва.: Символ-Плюс, 2011-162с.
Приложение
Исходный код программы
Модуль Goods.h
#pragma once
#include <string.h>
#include <fstream>
using namespace std;
//Базовый класс "товар"
class Goods
{
protected:
static int ID; //Генератор id
int id; //Уникальный номер
char Title[100]; //Название
double Cost; //Цена
public:
Goods()
{
id = ID++;
}
Goods(char * Title, double Cost):Goods()
{
setTitle(Title);
setCost(Cost);
}
virtual char Type() = 0; //Абстрактный
//Сообщить id
int getID() { return id; }
//Установить id
void setID(int value) { id = value; }
//Прочитать название
char * getTitle() { return Title; }
//Записать название
void setTitle(char * value) { strcpy(Title, value); }
//Прочитать цену
double getCost() { return Cost; }
//Записать цену
void setCost(double value) { if (value >= 0) Cost = value; }
//Записать в выходной поток
virtual void Write(ofstream &f)
{
f << id << endl;
f << Title << endl;
f << Cost << endl;
}
//Прочитать из входного потока
virtual void Read(ifstream &f)
{
char Buffer[100];
f.getline(Buffer,sizeof(Buffer));
id = atoi(Buffer);
if (id > ID) ID = id;
f.getline(Title, sizeof(Title));
f.getline(Buffer, sizeof(Buffer));
Cost = atof(Buffer);
}
};
Модуль GoodsPosition.h
#pragma once
#include "Goods.h"
#include "PieceGoods.h"
#include "WeightGoods.h"
#include <string.h>
#include <fstream>
using namespace std;
//Класс "позиция" товара (на складе или в заказе)
class GoodsPosition
{
int id; //Товар (id)
double Quantity; //Количество
public:
GoodsPosition()
{
}
GoodsPosition(int id, double Quantity = 1)
{
this->id = id;
setQuantity(Quantity);
}
GoodsPosition(Goods * goods, double Quantity = 1):GoodsPosition(goods->getID(),Quantity)
{
}
int getID() { return id; }
void setID(int value) { id = value; }
double getQuantity() { return Quantity; }
void setQuantity(double value) { Quantity = value; } //Может быть отрицательным, например, возврат
//Записать в выходной поток
virtual void Write(ofstream &f)
{
f << id << endl;
f << Quantity << endl;
}
//Прочитать из входного потока
virtual void Read(ifstream &f)
{
char Buffer[100];
f.getline(Buffer, sizeof(Buffer));
id = atoi(Buffer);
f.getline(Buffer, sizeof(Buffer));
Quantity = atof(Buffer);
}
};
Модуль PieceGoods.h
#pragma once
#include "Goods.h"
#include <string.h>
#include <fstream>
using namespace std;
//Штучный товар.
//Наследник от "товар вообще"
class PieceGoods:public Goods
{
protected:
public:
PieceGoods()
{
}
virtual char Type() override { return 'P'; }; //Перекрытый
//Записать в выходной поток
virtual void Write(ofstream &f)
{
Goods::Write(f);
}
//Прочитать из входного потока
virtual void Read(ifstream &f)
{
Goods::Read(f);
}
};
Модуль WeightGoods.h
#pragma once
#include "Goods.h"
#include <string.h>
#include <fstream>
using namespace std;
//Весовой товар
//Наследник товара "вообще"
class WeightGoods:public Goods
{
char Meagure[10]; //Единицы измерения (кг, тонны, граммы, караты)
public:
WeightGoods()
{
}
WeightGoods(char * Title, double Cost, char * Meagure = "кг") :Goods(Title, Cost)
{
setMeagure(Meagure);
}
char * getMeagure() { return Meagure; }
void setMeagure(char * value) { strcpy(Meagure, value); }
virtual char Type() override { return 'W'; }; //Перекрытый
//Записать в выходной поток
virtual void Write(ofstream &f)
{
Goods::Write(f);
f << Meagure << endl;
}
//Прочитать из входного потока
virtual void Read(ifstream &f)
{
Goods::Read(f);
f.getline(Meagure, sizeof(Meagure));
}
};
Модуль PositionList.h
#pragma once
#include "Goods.h"
#include "GoodsPosition.h"
#include "PieceGoods.h"
#include "WeightGoods.h"
#include <string.h>
#include <fstream>
using namespace std;
//Список позиций.
//Состоит из списка товаров
//и списка позиций товаров
class PositionList
{
bool foreingoods = false;
Goods * * goods = NULL; //Массив из товаров
int * goodscount = NULL; //Количество
GoodsPosition * * positions = NULL; //Массив из позиций
int positionscount = 0; //Количество
char Title[100]; //Название
char Comments[200]; //Дополнительные сведения (дата, контакты)
public:
PositionList()
{
this->goodscount = new int;
*goodscount = 0;
setComments("");
setTitle("");
}
//Конструктор с указанием списка товаров (например, склад уже есть, оформление заказа)
PositionList(Goods * * goods, int * goodscount)
{
foreingoods = true; //Запомнить, что список товаров - чужой
this->goods = goods;
this->goodscount = goodscount;
}
//Освободить память
~PositionList()
{
if (!foreingoods)
for (int i = 0; i < *goodscount; i++) //Позиции в памяти не остаются
delete goods[i];
if (goods) delete[] goods; //Сами товары остаются в памяти, если они "чужие"
for (int i = 0; i < positionscount; i++) //Позиции в памяти не остаются
delete positions[i];
if (positions) delete[] positions;
}
int goodsCount() { return *goodscount; } //Вернуть ЗНАЧЕНИЕ
int * getgoodsCount() { return goodscount; } //Вернуть ССЫЛКУ
int positionsCount() { return positionscount; }
char * getTitle() { return Title; }
void setTitle(char * value) { strcpy(Title, value); }
char * getComments() { return Comments;}
void setComments(char * value) { strcpy(Comments, value); }
//Добавить товар к списку
void Add(Goods * g)
{
goods = (Goods**)realloc(goods, sizeof(Goods*)*(*goodscount + 1));
goods[*goodscount] = g;
(*goodscount)++;
}
//Добавить позицию
bool Add(GoodsPosition * gp)
{
positions = (GoodsPosition**)realloc(positions, sizeof(GoodsPosition*)*(positionscount + 1));
positions[positionscount++] = gp;
return true;
}
bool Add(int id, double Quantity)
{
if (IndexOf(id) < 0) return false; //Нет такого товара
GoodsPosition * gp = new GoodsPosition(id, Quantity);
return Add(gp);
}
//Найти по ID
int IndexOf(int id)
{
for (int i = 0; i < *goodscount; i++)
if (goods[i]->getID() == id) return i;
return -1;
}
//Доступ к данным
Goods * getGoods(int index)
{
return goods[index];
}
Goods ** getGoods()
{
return goods;
}
GoodsPosition * getPosition(int index)
{
return positions[index];
}
//Найти по имени
int IndexOf(char * Title)
{
for (int i = 0; i < *goodscount; i++)
if (strcmp(goods[i]->getTitle(), Title)== 0) return i;
return -1;
}
//Вывести в файл
void WriteGoods(ofstream &f)
{
for (int i = 0; i < *goodscount; i++)
{
f << goods[i]->Type() << endl;
goods[i]->Write(f);
}
}
void WritePositions(ofstream &f)
{
f << Title << endl;
f << Comments << endl;
for (int i = 0; i < positionscount; i++)
positions[i]->Write(f);
}
void ReadGoods(ifstream &f)
{
char c;
Goods * g;
while (!f.eof())
{
char temp[10];
f.getline(temp, 10); //ENTER
c = temp[0];
if (f.eof()) break; //Данных больше нет
if (c == 'P') g = new PieceGoods(); else
if (c == 'W') g = new WeightGoods(); else
break; //Поврежден файл
g->Read(f);
Add(g);
}
}
void ReadPositions(ifstream &f)
{
f.getline(Title, sizeof(Title));
f.getline(Comments, sizeof(Comments));
GoodsPosition * gp;
while (!f.eof())
{
gp = new GoodsPosition();
gp->Read(f);
if (f.eof())
{
delete gp;
break; //Данных больше нет
}
Add(gp);
}
}
};
Модуль Input.h
#pragma once
#include "Goods.h"
#include "GoodsPosition.h"
#include "PieceGoods.h"
#include "WeightGoods.h"
#include "PositionList.h"
#include <string.h>
#include <iostream>
using namespace std;
//Класс для ввода (с консоли) различных объектов
class Input
{
public:
static void input(Goods * g)
{
char Buffer[100];
cout << "Название = ";
cin.getline(Buffer, sizeof(Buffer));
g->setTitle(Buffer);
cout << "Цена = ";
cin.getline(Buffer, sizeof(Buffer));
g->setCost(atof(Buffer));
}
static void input(PieceGoods * g)
{
input((Goods*)g);
}
static void input(WeightGoods * g)
{
input((Goods*)g);
char Buffer[100];
cout << "Ед.изм. = ";
cin.getline(Buffer, sizeof(Buffer));
g->setMeagure(Buffer);
}
static bool input(GoodsPosition * g, PositionList * p)
{
char Buffer[100];
cout << "Название = ";
cin.getline(Buffer, sizeof(Buffer));
int k = p->IndexOf(Buffer);
if (k < 0) return false;
g->setID(k);
cout << "Количество = ";
cin.getline(Buffer, sizeof(Buffer));
g->setQuantity(atof(Buffer));
return true;
}
};
Модуль Menu.h
#pragma once
//Класс "меню" (выбор действия)
#include "Menu.h"
#include <string.h>
#include <iostream>
using namespace std;
//Класс "меню"
//Должен вернуть символ - команду пользователя
class Menu
{
//Список разрешенных к вводу символов - команд.
char valid[256] = "01234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
//Проверка, допустим ли символ
bool IsValid(char c)
{
for (unsigned int k = 0; k < strlen(valid); k++)
if (c == valid[k]) return true;
return false;
}
public:
Menu()
{
}
//Конструктор со списком команд
Menu(char * symbols)
{
setValid(symbols);
}
//Вывести подсказку
void Helper()
{
cout << "a - Добавить товар на склад" << endl;
cout << "p - Просмотреть товары на складе" << endl;
cout << "f - Найти товар на складе по имени" << endl;
cout << "" << endl;
cout << "A - Создать заказ" << endl;
cout << "G - Добавить товар в текущий заказ" << endl;
cout << "V - Промотреть текущий заказ" << endl;
cout << "P - Просмотреть список заказов" << endl;
cout << "F - Найти заказ по заголовку (и сделать текущим)" << endl;
cout << "" << endl;
cout << "q,Q - закончить работу" << endl;
}
//Установить разрешенные символы
void setValid(char * symbols)
{
strcpy(valid, symbols);
}
//Вернуть символ, введенный пользователем
char get()
{
while (true)
{
cout << ">";
char Buffer[100];
cin.getline(Buffer, sizeof(Buffer));
if (Buffer[0] == '\0') continue; //ENTER
if (IsValid(Buffer[0])) return Buffer[0];
Helper();
}
}
};
Модуль Print.h
#pragma once
#include "Goods.h"
#include "GoodsPosition.h"
#include "PieceGoods.h"
#include "WeightGoods.h"
#include "PositionList.h"
#include <iostream>
using namespace std;
//Класс для вывода (на консоль)
//различных объектов
class Print
{
public:
static void print(GoodsPosition * g, PositionList * p)
{
int k = p->IndexOf(g->getID());
if (k < 0) return;
print(p->getGoods(k));
cout.width(5);
cout << g->getQuantity();
}
static void print(PieceGoods * g)
{
print((Goods*)g);
}
static void print(WeightGoods * g)
{
print((Goods*)g);
cout.width(5);
cout << g->getMeagure();
}
static void print(Goods * g)
{
cout.width(20);
cout << g->getTitle();
cout.width(10);
cout.precision(2);
cout << std::fixed << g->getCost();
}
static void print(PositionList * g, bool goods=true)
{
if (goods)
printGoods(g);
else
printPositions(g);
}
private:
static void printGoods(PositionList * g)
{
for (int i = 0; i < g->goodsCount(); i++)
{
print(g->getGoods(i));
cout << endl;
}
}
static void printPositions(PositionList * g)
{
cout << g->getTitle() << endl;
cout << g->getComments() << endl;
for (int i = 0; i < g->positionsCount(); i++)
{
print(g->getPosition(i), g);
cout << endl;
}
}
};
Модуль Source.cpp
#define _CRT_SECURE_NO_WARNINGS
#include "Menu.h"
#include "Goods.h"
#include "GoodsPosition.h"
#include "Input.h"
#include "Print.h"
#include "PieceGoods.h"
#include "WeightGoods.h"
#include "PositionList.h"
//Получить имя файла по номеру
void setFileName(int number, char * FileName)
{
sprintf(FileName, ".\\Orders\\%5d.txt", number);
for (unsigned k = 0; k < strlen(FileName); k++)
if (FileName[k] == ' ') FileName[k] = '0';
}
bool FileExist(char * FileName)
{
ifstream test = ifstream(FileName);
if (!test.is_open()) return false;
test.close();
return true;
}
//Узнать номер заказа, которого еще нет
int LastOrder(bool Print=false, char * Title="")
{
int result = 0;
char FileName[100];
while (true)
{
setFileName(result, FileName);
if (!FileExist(FileName)) return result;
if (Print || Title[0]!=0)
{
if (Print)
{
cout.width(5);
cout << result << " : ";
}
PositionList * p = new PositionList();
ifstream fin = ifstream(FileName);
p->ReadPositions(fin);
if (Print)
cout << p->getTitle() << endl;
if (Title[0] != 0 && strcmp(Title, p->getTitle())==0)
{
delete p;
return result;
}
delete p;
}
result++;
}
}
int main()
{
Menu * menu = new Menu("apfAGVPFqQ");
//Склад
PositionList * WareHouse = new PositionList();
ifstream in = ifstream("Warehouse.txt");
if (in.is_open())
{
WareHouse->ReadGoods(in);
in.close();
}
//Текущий заказ
PositionList * Current = NULL;
int lastOrder = LastOrder(); //Узнать последний заказ
int currentorder = -1; //Текущий заказ
char FileName[255]; //Имя файла
ofstream fout; //Поток для вывода
WeightGoods * wg;
PieceGoods * pg;
char Buffer[200];
system("chcp 1251>nul");
menu->Helper();
while (true)
switch (menu->get())
{
case 'a':
cout << "a - Добавить товар на склад" << endl;
cout << "w - весовой" << endl;
cout << "p - штучный" << endl;
cin.getline(Buffer,sizeof(Buffer));
if (Buffer[0] == 'w')
{
wg = new WeightGoods();
Input::input(wg);
WareHouse->Add(wg);
fout = ofstream("Warehouse.txt");
WareHouse->WriteGoods(fout);
fout.close();
break;
}
if (Buffer[0] == 'p')
{
pg = new PieceGoods();
Input::input(pg);
WareHouse->Add(pg);
fout = ofstream("Warehouse.txt");
WareHouse->WriteGoods(fout);
fout.close();
break;
}
cout << "Не опознан тип товара" << endl;
break;
case 'p':
cout << "p - Просмотреть товары на складе" << endl;
Print::print(WareHouse);
break;
case 'f':
{
cout << "f - Найти товар на складе по имени" << endl;
cout << "Название товара : ";
cin.getline(Buffer, sizeof(Buffer));
int index = WareHouse->IndexOf(Buffer);
if (index < 0) cout << "Нет такого";
else
{
Goods * g = WareHouse->getGoods(index);
if (g->Type() == 'W')
Print::print((WeightGoods*)g);
else
Print::print((PieceGoods*)g);
cout << endl;
}
}
break;
case 'A':
cout << "A - Создать заказ" << endl;
Current = new PositionList(WareHouse->getGoods(), WareHouse->getgoodsCount());
cout << "Название заказа : "; cin.getline(Buffer, sizeof(Buffer)); Current->setTitle(Buffer);
cout << "Описание заказа : "; cin.getline(Buffer, sizeof(Buffer)); Current->setComments(Buffer);
currentorder = lastOrder++;
setFileName(currentorder, FileName);
fout = ofstream(FileName);
Current->WritePositions(fout);
fout.close();
break;
case 'G':
{
cout << "G - Добавить товар в текущий заказ" << endl;
if (currentorder < 0)
{
cout << "Заказ не выбран" << endl;
break;
}
GoodsPosition * temp = new GoodsPosition();
if (Input::input(temp, WareHouse))
{
setFileName(currentorder,FileName);
fout = ofstream(FileName);
Current->Add(temp->getID(), temp->getQuantity());
Current->WritePositions(fout);
fout.close();
}
else
cout << "Такого нет на складе" << endl;
delete temp;
}
break;
case 'V':
cout << "V - Промотреть текущий заказ" << endl;
if (currentorder < 0)
{
cout << "Заказ не выбран" << endl;
break;
}
Print::print(Current,false);
break;
case 'P':
cout << "P - Просмотреть список заказов" << endl;
LastOrder(true);
break;
case 'F':
cout << "F - Найти заказ по заголовку (и сделать текущим)" << endl;
{
cin.getline(Buffer, sizeof(Buffer));
currentorder = LastOrder(false, Buffer);
if (currentorder < 0)
{
cout << "Нет такого" << endl;
break;
}
//прочитать из файла текущий заказ
setFileName(currentorder, FileName);
in = ifstream(FileName);
if (Current) delete Current;
Current = new PositionList(WareHouse->getGoods(), WareHouse->getgoodsCount());
Current->ReadPositions(in);
in.close();
}
break;
case 'q':
case 'Q':
cout << "q,Q - закончить работу" << endl;
return 0;
}
}
Размещено на Allbest.ru
Подобные документы
Определение программного модуля. Принципы использования dll-библиотеки. Преимущества и недостатки использования dll-библиотек. Описание коэффициентов моделей. Разработка структуры классов. Реализация библиотеки классов в среде разработки MS Visual Studio.
дипломная работа [676,6 K], добавлен 16.06.2015Разработка иерархии классов, содержащей не менее трех уровней. Определение базовых и производных классов. Анализ технического задания. Проектирование структуры программы и базовых алгоритмов. Программная реализация разработанной структуры и алгоритмов.
курсовая работа [34,9 K], добавлен 11.01.2011Разработка структуры класса "Экран курсового проектирования", которая будет основой для хранения информации о студентах, выполняющих курсовые работы. Реализация визуального приложения для тестирования иерархии классов на языке программирования С++.
курсовая работа [3,3 M], добавлен 18.03.2011Ознакомление с программой проведения сборки компьютера из деталей, имеющихся в базе данных. Рассмотрение правил создания иерархии классов. Описание основных методов и пользовательского интерфейса. Изучение системных требований и текстов основных классов.
курсовая работа [710,2 K], добавлен 26.07.2014Подбор игрового движка и описание его основных характеристик. Разработка структуры, алгоритма и интерфейса программы. Проектирование иерархии классов. Выделение типового приема визуализации. Тестирование правильности работы программного обеспечения.
курсовая работа [3,1 M], добавлен 19.01.2017Проектирование программного продукта для использования в организации учета медикаментов в аптеке. Построение функциональной модели автоматизированной системы; разработка и тестирование иерархии классов в соответствии с объектно-ориентированным подходом.
курсовая работа [1,5 M], добавлен 21.02.2013Обзор технологии OpenStack, область ее применения. Реализация библиотеки классов. Реализация базовых классов и интерфейсов архитектуры. Создание виртуального сервера. Интеграция разработанной библиотеки классов и архитектура проектного решения.
дипломная работа [1,0 M], добавлен 09.08.2016Иерархия основных классов MFC (базовой библиотеки классов). Структура простой MFC программы. Работа с текстом в MFC. Функции вывода текста, установки цветов, режимов отображения, получение метрик. Применение контекста устройства, обработка сообщений.
контрольная работа [27,8 K], добавлен 11.08.2010Анализ нейронных сетей и выбор их разновидностей. Модель многослойного персептрона с обучением по методу обратного распространения ошибки. Проектирование библиотеки классов для реализации нейросети и тестовой программы, описание тестирующей программы.
курсовая работа [515,4 K], добавлен 19.06.2010Разработка набора взаимосвязанных классов для реализации Hash-поиска как специализированного контейнера. Поиск с использованием Хэш-функций. Объектная технология. Описание пользовательского интерфейса. Листинг и описание всех классов библиотеки на DP.
курсовая работа [231,2 K], добавлен 15.10.2008