Создание библиотеки классов и управляемую пользователем программу с псевдографическим интерфейсом
Введение
Данный программный продукт состоит из двух
самостоятельных библиотек: строковых типов и консольно-графических компонентов,
которые могут быть использованы в других целях, и использующей
(демонстрирующей) их программы.
Содержание библиотек:
Строковые типы: базовая строка,
строка-идентификатор, комплексное число.
Консольно-графические компоненты: меню, рамка,
список, консоль, ввод-диалог.
Программа позволяет создать до девяти строковых
объектов и манипулировать ими, отображая их текущее состояние в списке,
результаты процедур на консоли и используя меню для ввода команд и диалоги для
ввода параметров.
Ниже отображены структура и взаимодействие
классов и объектов, основные алгоритмы.
1. Упрощённая структура библиотек, иерархия
классов
.1 Строковые типы
Имеются следующие типы (рисунок 1):
· BaseString - базовая строка - содержит С-строку
глобально заданной (или меньшей) длины, контролирует доступ, обеспечивает
ввод-вывод.
· Identifier
- строка-идентификатор - следит, чтобы хранимая строка отвечала правилам
составления идентификаторов языка С.
· Complex
- комплексное число - содержит символьное представление комплексного числа в
формате «1234i567» со знаками или
без. Обеспечивает алгебраическое сложение и вывод в формате «(1234,
i 567)».
Рисунок 1 - библиотека строковых типов.
.2 Графические компоненты
Имеются следующие компоненты и системы (рисунок
2):
· Item
- пункт меню - содержит координаты, надпись, вызываемую функцию и массив
подменю. Имеет функции рисования и стирания, при стирании экран закрашивается
чёрным (если что-то было затёрто, старое содержимое не восстанавливается).
· Menu
- меню - содержит массив корневых пунктов меню, контролирует общий процесс
исполнения программы: следит за нажатиями на навигационные клавиши, сворачивает
и разворачивает пункты и их подменю, вызывает обработчики нажатий. Алгоритм
изображён ниже (рисунок 3).
· Frame
- рамка - в конструкторе выводит псевдографическую рамку, в деструкторе стирает
её. Есть функция перерисовки.
· List
-
список - рамка, выводящая нужную надпись на любой строчке с номером.
· Console
- консоль - потоковый вывод текста в рамке.
· DialogInput
- диалог ввода строки - только рисование диалогового окна с некоторой надписью
и полем под ввод в конструкторе и стирание в деструкторе.
Рисунок 2 - библиотека графических компонентов
1.3 Форма - оболочка данного приложения
Форма - потомок меню (рисунок 4).
Рисунок 4 - форма
Использованное в ней дерево меню изображено на
рисунке 5.
Так же она содержит массив указателей на строки
для эксперимента, список строк и консоль для вывода результатов действий.
В одном модуле с формой описаны самостоятельные
функции, которые будут присвоены обработчикам нажатий пунктов меню.
2. Подробное описание всех классов, их полей и
методов
.1 Строковые типы
.1.1 BaseString - базовая строка
Вспомогательные объявления:
enum ourStrings {base, identifier,
decimal, complex, binary} - типы
строковых
объектов
int refoolLenght
= 16 - максимальная длина строки
Защищённые поля:
char* strPointer
- указатель на строку
int
lenght - длина строки
ourStrings
objType - тип объекта
int
refool - переполнение
Защищённые методы:copy (char* str) - копирование
массива символов в строку с учётом переполнения
Открытые методы:
BaseString()
- конструктор по-умолчанию
BaseString(char*
str) - конструктор из
С-строки
BaseString(char
ch) - конструктор из
символа
BaseString(BaseString&
orig) - конструктор
копирования
virtual
~BaseString() - виртуальный
деструктор
char
OftenChar() - самый часто
встречающийся символ
int getLenght() - возврат
длиныObjectType()
- возврат
типа
isRefooled() - возврат
переполненностиcontain (char ch) - содержит ли строка данный символ
virtual ostream& outer (ostream&
s) - метод
потокового
выводаistream&
iner (istream& s) - метод потокового
ввода
Дополнительные функции:&
operator <<(ostream& s, const BaseString& str) - оператор
потокового
вывода&
operator >>(istream& s, BaseString& str) - оператор
потокового
ввода
2.1.2 Identifier
- строка-идентификатор - потомок базовой строки
Открытые методы:
static
bool isCorrect
(char* str)
- является ли некоторая С-строка идентификатором
static
bool isCorrect
(BaseString
str) - является ли
некоторая базовая строка идентификатором
Identifier()
- конструктор по-умолчанию
Identifier(char*
str)
- конструктор из С-строки
Identifier(char
ch)
- конструктор из символа
Identifier(Identifier& orig) - конструктор
копированияIdentifier&
operator= (const Identifier& orig) - оператор
присваивания&
operator[] (int
ind) - оператор
индекса, возвращает ссылку на ind-й
символ
Identifier
operator- (const
Identifier& subtrahend)
- удаление символов вычитаемого из символов уменьшаемого
void
regDown() - перевод букв в
нижний регистр
istream& iner (istream& s) -
метод
потокового
ввода
Дополнительные функции:&
operator <<(ostream& s, const Identifier& str) - оператор
потокового
вывода&
operator >>(istream& s, Identifier& str) - оператор
потокового
ввода
2.1.3 Complex
- комплексное число - потомок базовой строки
Скрытые методы:toFixedLenght (char* strnum) -
перевод строки-числа из "(-)123456\0 " в
"±0000000000000123456\0" [refoolLenght+1] (предполагается, что память
выделена заранее)toFloatLenght (char* strnum) - обратный перевод (память не освобождается)
void
add (char*
adden1, char*
adden2, char*
sum) - алгебраическое
сложение чисел-строк, представленных в
формате"±0000000000000123456\0" [refoolLenght+1]
Complex()
- конструктор по-умолчанию
Complex
(char* str)
- конструктор из С-строки
Complex
(int re,
int
im)
- конструктор из значений действительной и мнимой частей
Complex
(Complex& orig)
- конструктор копирования
bool
isCorrect (char*
str) - является ли
некоторая С-строка комплексным числом
bool
isCorrect (BaseString
str) - является ли
некоторая базовая строка комплексным числом
void
getReal(char*
) -копирование действительного поля в массив символов
void
getImage(char*
) - копирование мнимого поля в массив символов
const Complex& operator= (const
Complex& orig) - оператор
присваиванияoperator+
(const Complex& adden) - оператор
сложенияoperator-
(const Complex& orig) - оператор
вычитанияostream&
outer (ostream& s) - метод потокового
выводаistream&
iner (istream& s) - метод потокового
ввода
Дополнительные функции:
ostream&
operator <<(ostream&
s, const
Complex& str)
- оператор потокового вывода
istream& operator
>>(istream& s, Complex& str) - оператор
потокового
ввода
2.2 Графические компоненты - меню
.2.1 Глобальные константы
const
int menuWidth
= 16 - какой ширины будет рисоваться каждый пункт
const
int lineColor
= 1 - цвет линий, обрамляющих пункты
const
int activeColor
= 10 - цвет активного в данный момент пункта
const int enabledColor = 3 - цвет
включённого
пунктаint
passiveColor = 4 - цвет отключённого
пункта
библиотека алгоритм строка
2.2.2 Item
- пункт меню
Защищённые поля:* caption - надписьleft, top -
координаты группы пунктовindex - номер данного пунктаunderMenuLen - число
пунктов подменю в группе** underMenu - массив указателей для пунктов подменю*
upperItem - указатель на старший пункт
Открытые поля:
bool
enabled, activied
- включён и активен ли пункт
Открытые методы:
Item(Item*
upperItem, char*
caption, int
left, int
top, int
index) - конструктор -
инициализирует всё, кроме подменю
~Item()
- виртуальный деструктор
void (*onEnter)
(Item* sender,
Menu* place)
- указатель на обработчик события входа в меню - получает аргументами указатель
на текущие меню и пункт
void
createUndermenu (int
left, int
top, int
itemsN ...) - создание
подменю, выводящегося в конкретной точке, из серии заголовков. На место точек
при вызове ставится itemsN
C-строк.
int
getIndex() - возврат номера
пункта
Item* getUpperItem()
- возврат указателя на старший пункт* moveUp() - перемещение вверх по подменю,
возвращает указатель на предыдущий включённый пункт* moveDown() - перемещение
вниз по подменю, возвращает указатель на следующий включённый пункт* goToRoot()
- закрытие всех подменю и возврат указателя на корневой пунктopen() - вывод
пункта на экранclose() - скрытие пункта (очистка экрана)* openUnderMenu() -
открытие (вывод) подменю и передача ему активности (переприсваивание поля activied),
возврат указателя на пункт, ставший активнымcloseUnderMenu() - скрытие подменю
и возврат активности данному пункту* operator[] (int i) - возврат указателя на
i-й элемент подменю или 0, если подменю нет
.2.3 Menu - меню
Защищённые поля:** roots - массив указателей для
корневых элементовrootsN - число корневых элементов
Защищённые методы:open() - первая прорисовка
корневых элементов* moveRight(Item* current) - перемещение вправо по корневым
пунктам, возврат указателя на следующий от аргумента включённый пункт*
moveLeft(Item* current) - перемещение влево по корневым пунктам, возврат
указателя на предыдущий от аргумента включённый пункт
Открытые методы:~Menu() - виртуальный
деструктор* operator[] (int i) - возврат указателя на i-й корневой
элементperform() - управление процессом через меню (алгоритм на рисунке 4).
.3 Графические компоненты - панели
.3.1 Глобальные константы= 2+7*16 - цвет
рамокint dialogColors = 12+2*16 - цвет диалогового окна
.3.2 Frame
- рамка
Защищённые поля:
char* caption
- надпись
int left, top, width, height - координаты
и
размеры
Открытые методы:(int
left, int top, int width, int height, char* caption) - конструктор
- сохранение
аргументов
и
прорисовкаvoid
redraw() - перерисовка рамки
пустой
~Frame()
- деструктор - стирание
.3.3 List
- список - потомок рамки
Открытые методы:(int
left, int top, int width, int N, char* caption) - конструктор
drawLine (int
i, char*
caption) - вывод данной
строки на данной строчке.
void
redraw() - перерисовка
списка пустым с номерами строк
.3.3 Console
- консоль - потомок рамки
Открытые методы:
Console (int left, int top, int
width, int height, char* caption) - конструктор output(char*
c) - добавление в
поток строки
.3.4 DialogInput
- диалоговое окно ввода
Скрытые поля:
int
left, top,
width - координаты и
ширина (высота всегда под 1 строку заголовка и 1 строку для ввода)
Открытые методы:(int
left, int top, int width, char* caption) - конструктор
- рисование
~DialogInput() - деструктор - стирание
.4 Модуль данного приложения
.4.1 Глобальные константы
const
int window1left
= 3, window1top
= 14, window1width
= 16 - координаты и приращение ширины (к длине базовой строки) 1-го окна -
списка (высота - по числу элементов
const
int window2left
= 55, window2top
= 4 - координаты второго угла - консоли (размеры - до краёв экрана)
const
int window3left
= 36, window3top
= 21 - координаты третьего окна номеров параметров
.4.2 Form
- форма - потомок меню
Поля:
int
objectsN - число объектов
для экспериментов
int
arg1, arg2,
val - номера операндов
List* window1
- указатель на первое окно (список)
Console*
window2 - указатель на
второе окно (консоль)
BaseString**
array - массив
указателей под объекты для манипуляций
Методы:
Form() - конструктор
- создание пунктов меню для данной задачи
~Form()
- деструктор - удаление строковых объектов и окон
void
drawOperandsWindow() -
рисование окна под номера операндов
void
drawOperands() - вывод номеров
операндов в их окне
.4.3 Обработчики нажатий меню
void <name>(Item*
sender, Menu*
place) - формат всех
обработчиков, далее перечислены только имена и соответствующие пункты меню
initializeObject
- Инициализация -> Количество элементов
inputOperands
- Инициализация -> Начальное значение
createObject
- вызовы всех конструкторов с параметрами, кроме копирующих:
Тестирование -> Базовая строка -> Создать
из строки,
Тестирование -> Базовая строка -> Создать
из символа,
Тестирование -> Идентификатор -> Создать
из строки,
Тестирование -> Идентификатор -> Создать
из символа,
Тестирование -> Комплексное число ->
Создать из строки,
Тестирование -> Комплексное число ->
Создать из чисел
copyObject
- вызовы всех конструкторов копирования:
Тестирование -> Базовая строка ->
Скопировать,
Тестирование -> Идентификатор ->
Скопировать,
Тестирование -> Комплексное число ->
Скопировать
stringOftenChar
- Тестирование -> Базовая строка -> Частый символ
identifierSubstract
- Тестирование -> Идентификатор -> Вычитание
identifierIndexOperator
- Тестирование -> Идентификатор -> Индекс…
complexArytmetic
- арифметика комплексных чисел:
Тестирование -> Комплексное число ->
сложение
Тестирование -> Комплексное число ->
вычитание
toExit - Выход
2.4.4 Функция
mainmain() {* form = new Form;->perform();
delete
form;
}
Вывод
В ходе КР была разработана на языке
программирования C++
библиотека классов на основе C-строк
и управляемую пользователем программу с псевдографическим интерфейсом,
тестирующую её работу и отображающую результат.