Создание базового класса 'Строка', строки идентификатора и десятичной строки. Создание графического интерфейса
Федеральное государственное бюджетное
образовательное учреждение высшего профессионального образования
Балтийский государственный
технический университет "Военмех" им. Д.Ф. Устинова
КУРСОВАЯ РАБОТА
Создание базового класса строка,
строки идентификатора и десятичной строки. Создание графического интерфейса
Руководитель темы Безруков В.А.
Исполнитель темы Бочкарев А.С.
Санкт-Петербург 2014
Содержание
Введение
Техническое задание
. Класс строка
.1 Базовый класс строка
.2 Строка идентификатор
.3 Десятичная строка
. Интерфейс
.1 Класс Desk
(рабочий стол)
2.2 Класс Menu
(меню/подменю)
2.3 Класс MenuItem (пункт меню)
2.4 Класс Listbox
(текстовый бокс/список)
2.5 Класс ListItem (элемент списка)
.6 Описание
Заключение
Список литературы
Приложения
Введение
Целью данной работы является создание класса "строка" и
производных классов от него, а также разработка интерфейса для ввода начальных
значений, отображения результатов и тестирования методов собственного класса.
Для достижения поставленной цели были осуществлены следующие задачи:
. Разработка класса рабочего стола. В него будут входить такие методы
как: отрисовка рабочего стола, ввод числовых и строковых данных, вывод
результатов и сообщений об ошибках, реализация команд меню и т.д. Задачей класса
будет являться выполнение функций, которые к нему привязаны.
2. Разработка класса графического меню. В данный класс будут входить
такие методы как: отрисовка элементов меню и подменю, реализация механизма
развёртывания и свёртывания подменю, перемещения между пунктами меню и подменю,
механизма выбора пункта меню и т.д.
. Разработка классов: базовая строка, строка идентификатор,
десятичная строка согласно техническому заданию.
Техническое
задание
Описать базовый класс строка
Обязательные члены класса:
1) указатель
на char - хранит адрес динамически выделенной памяти для размещения символов
строки;
2) значение типа int - хранит длину строки в байтах.
Обязательные методы должны выполнять следующие действия:
1) конструктор
без параметров;
2) конструктор, принимающий в качестве параметра Си-строку (заканчивается
нулевым байтом);
3) конструктор, принимающий в качестве параметра символ (char);
4) конструктор копирования;
5) деструктор.
) очистка строки (сделать строку пустой);
Производный от Строка класс Строка-идентификатор.
Строки данного класса строятся по правилам записи идентификаторов в СИ, и
могут включать в себя только те символы, которые могут входить в состав
Си-идентификаторов. Если исходные данные противоречат правилам записи
идентификатора, то создается пустая СТРОКА_ИДЕНТИФИКАТОР.
Обязательные методы:
) Конструктор без параметров;
2) Конструктор, принимающий в качестве параметра Си-строку
(заканчивается нулевым байтом);
) Конструктор копирования;
) Деструктор.
) Перевод всех символов строки(кроме цифр) в верхний регистр.
Переопределить следующие операции:
) присваивание (=);
2) оператор == -проверка на равенство;
) индексное выражение [];
Производный от Строка класс Десятичная строка.
Строки данного класса могут содержать только символы десятичных цифр и
символы - и +, задающие знак числа. Символы - или + могут находиться только в
первой позиции числа, причем символ + может отсутствовать, в этом случае число
считается положительным. Если в составе инициализирующей строки будут встречены
любые символы, отличные от допустимых, Десятичная строка принимает нулевое
значение. Содержимое данных строк рассматривается как десятичное число.
Обязательные методы:
1) конструктор
без параметров;
2) конструктор, принимающий в качестве параметра Си-строку (заканчивается
нулевым байтом);
3) конструктор копирования;
4) деструктор;
определяющий, можно ли представить данное число в формате char;
Переопределить следующие операции:
1) присваивание
(=);
2) сложение - - арифметическая разность строк;
3) операция == - проверка на равенство;
Разработчик вправе вводить любое (с обоснованием необходимости) число
дополнительных членов и методов.
Задание:
Разработать иерархию классов по следующей схеме:
с обязательной поддержкой заданных членов и методов.
Написать тестовую программу, которая:
1) динамически
выделяет массив указателей на базовый класс (4-6 шт.);
2) в режиме диалога заполняет этот массив указателями на производные классы,
при этом экземпляры производных классов создаются динамически с заданием
начальных значений;
3) для созданных экземпляров производных классов выполняется проверка всех
разработанных методов (в соответствии с вариантом задания), с выводом исходных
данных и результатов на дисплей.
Режим диалога обеспечивается с помощью иерархического меню.
Основные пункты:
1. "Инициализация".
Подпункты:
1.1. "Число
элементов" - задает число элементов в массиве указателей на базовый класс.
Запрещается после задания числа элементов пользоваться этим пунктом меню.
1.2. "Начальное
значение" - с помощью этого пункта меню можно задать номер элемента, его
тип и начальное значение.
Задавать начальные значения и работать с другими пунктами меню
запрещается до тех пор, пока не будет задано число элементов. Допускается
задать новое начальное значение несколько раз.
2. "Тестирование"
В качестве подпунктов указываются типы строк из варианта задания и
обязательные для всех подпункты "строка" и "задание
операнда", например:
.1. "Строка";
2.2. "Строка-идентификатор";
2.3. "Десятичная
строка";
После выбора одного из пунктов меню предлагается выбрать один из методов
списка всех обязательных методов (кроме конструкторов и деструкторов),
связанных с выбранным подпунктом. Результат выводится на экран.
3. "Выход"
Значения экземпляров классов по мере их инициализации выводятся на
дисплей и остаются на все время выполнения программы. После выбора операндов
они подсвечиваются цветом, отличным от остальных экземпляров.
1. Класс
Строка
.1 Базовый
класс Строка
Название класса: String.
Является базовым классов для классов десятичная строка и строка идентификатор.
Данные-члены класса, объявленные как protected:
) char *str - указатель на массив символов;
2) int len - переменная,
хранящая длину строки.
Метода классы строка:
1) string() - конструктор без параметров, создает строку нулевой длины;
2) String(const char *) - конструктор, в качестве параметра
принимающий Си-строку.;
) String(const char) - конструктор, принимающий в качестве
параметра один символ.;
) String(const String &) - конструктор копирования;
) ~String() - деструктор;
) void clear(); - функция, очищающая строку;
) char *text() - функция, возвращающая Си-строку
) void friend report(char *) - дружественная функция выводит
сообщения о работе конструкторов/деструкторов на консоль, а так же сообщения о
работе конструкторов в правое диалоговое окно.
.2 Строка
идентификатор
интерфейс программирование графический операнд
Название класса: Identifier. Данный класс является производным классом
класса String.
Методы класса Identifier:
) Identifier() - конструктор;
2) Identifier(const char *) - конструктор, принимающий в качестве
параметра си-строку.
3) Identifier(const Identifier &) - конструктор копирования;
) ~Identifier() - деструктор;
) Identifier operator =(const Identifier &) - переопределенная операция
присваивания типа "объект"= "объект";
6) Identifier operator =(const char *) - переопределенная операция
присваивания типа "объект" = "си-строка";
7) Identifier operator ==(const Identifier &) - переопределенная операция
проверки на равенство;
) сhar operator [](int) - переопределенная операция индекса.
.3
Десятичная строка
Наименование
класса: Tenstring. Данный класс является производным классом класса String. Метода данного класса:
1) Tenstring () - конструктор;
2) Tenstring (const char *) - конструктор, принимающий в качестве
параметра Си-строку;
3) Tenstring (const Tenstring &) - конструктор копирования;
4) ~ Tenstring () - деструктор;
5) Tenstring operator =(const Tenstring &) - переопределенная операция
присваивания типа "объект" = "объект";
) Tenstring operator =(const char *) - переопределенная операция
присваивания типа "объект" = "си-строка";
) Tenstring operator −(Tenstring &) - переопределенная
операция разности (арифметическая разность строк);
) int operator ==(Tenstring &) - проверка равенства строк;
) void ChangeChar() - проверка на представлении данного числа в char
2. Интерфейс
.1 Класс Desk (рабочий стол)
Данные-члены класса desk
объявленные как private:
) char ClassName[3][12] - массив строк - имён тестируемых классов.
2) Menu mn, mn1, mn2, mn3, mn4, mn5 - меню и подменю - объекты класса Menu.
3) ListBox *lbx1, *lbx2 - указатели на объекты класса ListBox - правый и левый текстовые боксы.
4) INSTANCE inst[LIMIT] - массив структур INSTANCE - содержит имена и идентификаторы
экземпляров тестируемых классов строк.
5) int count - количество
созданных экземпляров тестируемых классов.
Методы класса desk объявленные
как public:
1) Desk() - конструктор по умолчанию.
2) ~Desk() - деструктор
) void PaintBg(void) - рисует фон рабочего стола.
4) void Go(void) - начать выполнение.
5) void Command(void) - выполнить команду меню
6) void setCount(void) - количество экземпляров
тестируемых классов.
7) void Init(void) - инициализация экземпляров
тестируемых классов.
8) int numInput(int,int,int,int,char *) - ввод целочисленного значения.
) void strInput(int,int,int,int,char *,char *,int) -
ввод строкового значения.
) int str2int(char *,int
&) - перевод из строки в число.
11) int dataError(int,int,int,int) - вывод сообщения об ошибке данных.
12) String *CreateInstance(int,char
*) - создание экземпляра тестируемого класса
13) void numResult(int,int,int,int,char *,int) - вывод числовых данных.
) void Msg(int,int,int,int,char *) - вывод сообщения.
) void strclear(void) - реализация команды меню
"очистка строки"
16) void sidToUpper(void) - реализация команды меню
"перевод в верхний регистр"
17) void sidAssign(void) - реализация команды меню
"присваивание идентификаторов"
18) void sidSub(void) - реализация команды меню
"проверка на равенство идентификаторов".
19) void Ind(void) - реализация команды меню -
"индексное выражение"
20) void sbtInd(void)- реализация команды меню
"разность десятичных строк".
) void sbtChangeChar(void) - реализация команды меню
"представление числа в char".
) void sbtAssign(void) - реализация команды меню
"присваивание десятичных строк".
) void sbtSub(void) - реализация команды меню
"проверка на равенство десятичных строк"
.2 Класс Menu (меню/подменю)
Данные-члены класса объявленные как private
1) Menu *supmenu - указатель на главное меню.
2) MItem mItem[10] - массив
элементов (пунктов) меню.
3) int n - количество
элементов меню.
4) int selected - номер
выбранного элемента (пункта) меню.
5) bool visible -
видимость/невидимость меню.
Методы класса:
) Menu() - конструктор по умолчанию.
2) Menu(Menu *, int) - конструктор с параметрами.
) ~Menu() - деструктор.
4) void Add(int,int,int,int,char *) - добавление элемента меню.
) void setSubmenu(Menu *,int) - добавление подменю
к пункту
меню.
6) void Show(void) - показать меню.
) void Hide(void) - скрыть меню.
8) void setSelect(int) - выбрать пункт меню.
9) int getSelected(void) - вернуть номер выбранного пункта меню.
) void setEnable(int) - сделать доступным пункт меню.
) int isEnable(int) - проверить доступность пункта меню.
) void setDisable(int) - сделать недоступным пункт меню.
) void Forward(void) - перейти к следующему пункту меню.
) void Backward(void) - вернуться к предыдущему пункту меню.
) void Upward(void) - перейти к предыдущему пункту подменю.
) void Downward(void) - перейти к следующему пункту подменю.
) Menu *getSubMenu(int) - получить указатель на подменю по номеру
пункта меню.
.3 Класс MenuItem (пункт меню)
Данные-члены класса объявленные как private
1) int status - статус
пункта меню.
2) int x, y, w, h - положение и
размеры пункта меню.
3) char text[16] - текст
пункта меню.
Методы класса:
) MenuItem() конструктор по умолчанию.
2) MenuItem(int,int,int,int, char *) - конструктор с параметрами.
3) void Show(void) - показать пункт меню.
) void Hide(void) - скрыть пункт меню.
) void setStatus(int) - задать статус пункта меню.
) int getStatus(void) - получить статус пункта меню.
) ~MenuItem() - деструктор.
2.4 Класс Listbox (текстовый бокс/список)
Данные-члены класса объявленные как private
) int x, y, w, h - положение и размеры бокса.
2) int n - количество строк текста.
) ListItem *lItem[STR_MAX] - массив указателей на элементы списка
(строки текста).
Методы класса:
) ListBox(void) - конструктор по умолчанию.
2) ListBox(int,int,int,int) -
конструктор с параметрами.
) ~ListBox(void) - деструктор.
) void Add(char *) - добавить строку текста.
) void AddSeveral(int) - добавить несколько строк текста.
6) void UpdateRow(int,char *) - обновить строку.
7) void Clear(void) - удалить строки.
) void Show(void) - показать бокс.
) void Erase(void) - очистить строки.
.5 Класс ListItem (элемент списка)
Данные-члены класса объявленные как private
) int x, y, w, h - положение и размер элемента списка (строки текста)
2) ListBox *lbx - указатель на контейнер.
Данные-члены класса объявленные как public:
1) char text[STR_LEN+1] - строка текста.
Методы класса:
) ListItem(void) - конструктор по умолчанию.
2) ListItem(int,int,int,int,char *) - конструктор с параметрами.
3) ~ListItem(void) - деструктор.
) void setText(char *) - задать текст стороки.
) void Show(void) - показать строку.
void Erase(void) - очистить строку.
.6 Описание
Так называемый "класс окна" является структорой menu и содержит информацию об окне.
Данная структура содержит большое количество компонентов, инициализирует
которые - конструктор. Меню окна создается при помощи класса desk. Класс desk содержит следующие пункты:
1. Инициализация
o Число
элементов
o Начальные
значения
2. Тестирование
o Строка
§ Очистить
o Строка-идентификатор
§ Перевод в
верхний регистр
§ Присваивание
=
§ Проверка
на равенство ==
§ Индекс
o Десятичная
строка
§ Можно ли
представить как char
§ Присваивание
=
§ Вычитание
−
§ Проверка
на равенство ==
3. Выход.
Все диалоги
созданы при помощи класса listbox.
Заключение
Цель курсовой
работы достигнута. Были созданы тестируемые классы: базовый класс Строка,
Строка-идентификатор, Десятичная строка. Так же были реализованы классы
интерфейса: класс Рабочего стола и класс Меню. Методы тестируемых классов были
подключены к кнопкам меню и всплывающим окнам. Тестируемые классы и интерфейс
работают корректно.
Из интерфейса был исключен пункт меню "Тестирование - Задать
операнд", так как операнды вводились непосредственно при вызове
конкретного метода тестируемого класса
Список
литературы
1. Б.И. Березин. Начальный курс С и С++. - М.:Издательство
Диалог-МИФИ,
г. - 248 с.
2. Р. Лафоре. Объектно-ориентированное программирование в С++.
4-е издание. - Спб.: Издательство ПИТЕР, 2004 г. - 902 с.
3. Б. Страуструп. Язык программирования С++. Специальное
издание. Пер. с англ. - М.: Издательство Бином, 2011 г. - 1136 с.
Приложение 1. Файл mystring.h
#ifndef MYSTRING_H
#define MYSTRING_H
#ifndef STR_MAX
#define STR_MAX 255
#endif
#include "friends.h"String {:*str;len;:();(const
char *);(const char);(const String &);
~String();clear();*text();friend report(char *);
};Identifier: public String {:();(const char *);(const
Identifier &);operator ==(const Identifier &);operator =(const char
*);operator =(const Identifier &);operator [](int);
~Identifier();toUpper();
};Tenstring: public String {:();(const char *);(const
Tenstring &);operator =(const Tenstring &);operator =(const char
*);operator ==(Tenstring&);operator -(Tenstring &);
~Tenstring();ChangeChar();
};
#endif /* MYSTRING_H */
Приложение 2. Файл mystring.cpp
#include<iostream>
#include<cstring>
#include<cstdlib>
#include "mystring.h"namespace
std;::String(){("Default String class constructor");= new
char[STR_MAX+1];[0] = '\0';= 0;
}::String(const char *s){("String class constructor
(const char *)");= new char[STR_MAX+1];i;(i=0;i<STR_MAX&&s[i]!='\0';i++)
str[i] = s[i];[i] = '\0';= i-1;
}::String(const char ch){("String class constructor
(const char)");= new char[STR_MAX+1];[0] = ch;[1] = '\0';= 1;
}::String(const String& ss){("Copy String class
constructor");= new char[STR_MAX+1];i;(i=0;i<=ss.len;i++) str[i] =
ss.str[i];[i] = '\0';= ss.len;
}::~String(){("String class destructor");[] str;
}*String::text(){str;
}String::clear()
{str;= 0;= new char[1];[0] = 0;("String::clear()");
}::Identifier(){("Default Identifier class
constructor");
}::Identifier(const char *s){("Identifier class
constructor (const char *)");(!isalpha(s[0])&&s[0]!='_')
return;i;(i=1;i<STR_MAX&&s[i]!='\0';i++){(!isalnum(s[i])&&s[i]!='_')
return;
}(str,s);= i;
}::Identifier(const Identifier& ss):String(ss){("Copy
Identifier class constructor");
}::~Identifier(){("Identifier class destructor");
}Identifier::operator ==(const Identifier&
ss){("Identifier operator ==(const Identifier &)");
// int i;(strcmp(str,ss.str))("Identifier operator !=
executed");("Identifier operator ==
executed");*this;}Identifier::operator =(const Identifier&
ss){("Identifier operator =(const Identifier &)");(&ss ==
this)*this;(str,ss.str);= ss.len;*this;
}Identifier::operator =(const char *s){("Identifier
operator =(const char *)");(!isalpha(s[0])&&s[0]!='_'){
str[0]='\0'; len=0; return *this;
}i;(i=0;i<STR_MAX&&s[i]!='\0';i++){(!isalnum(s[i])&&s[i]!='_'){
str[0]='\0'; len=0; return *this; }
}(str,s,i);[i] = '\0';= i;*this;
}Identifier::operator [](int i)
{("stroka_id::operator[](int
i)");((i<0)||(i>=strlen(str))) {("index is too
big(small?)");0;
} str[i];
}Identifier::toUpper(){("Identifier member function
toUpper()");(int i=0;str[i]!='\0';i++) if(islower(str[i]))
str[i]=toupper(str[i]);
}::Tenstring(){("Default Tenstring class
constructor");
}::Tenstring(const char *s){("Tenstring class
constructor (const char *)");i;(s[0] != '-' && s[0] != '+'
&& (s[0] < '0' || s[0] > '9')) return;(i=1; i<STR_MAX
&& s[i] != '\0'; i++) if (s[i] < '0' || s[i] > '9') return;(str,s);=
i;
}::Tenstring(const Tenstring& ss):String(ss){("Copy
Tenstring class constructor");
}::~Tenstring(){("Tenstring class destructor");
}Tenstring::ChangeChar(){("Tenstring member function
ChangeChar()");(len>4)
{report("False");;
}long int number;= atoll(str);(number > 128 || number <
-127)
{("True");;
}
{ ("False");;
}
}Tenstring::operator =(const Tenstring&
ss){("Tenstring operator =(const Tenstring &)");(&ss == this)
return *this;(str,ss.str);= ss.len;*this;
}Tenstring::operator =(const char *s){("Tenstring
operator =(const char
*)");i;(i=0;i<STR_MAX&&s[i]!='\0';i++){(s[i]!='0'&&s[i]!='1'){
str[0]='\0'; len=0; return *this; }
}(str,s,i);= i;[i] = '\0';*this;
}Tenstring::operator ==(Tenstring&
ss){(atol(this->str)==atol(ss.str))("Tenstring operator == (Tenstring
&)");("Tenstring operator != (Tenstring &)");
}Tenstring::operator -(Tenstring& ss){("Tenstring
operator - (Tenstring &)");len = this->len>ss.len ? len :
ss.len, res;res1[len];=
atol(this->str)-atol(ss.str);(res,res1,10);Tenstring(res1);
}
Приложение 3. Файл Friends.h
#ifndef FRIENDS_H
#define FRIENDS_H
#include "listbox.h"report(char *);
#endif /* FRIENDS_H */
Приложение 4. Файл Friends.cpp
#include "friends.h"
#include<iostream>report(char *s){::cout " s
" std::endl;ListBox *ptr;>Add(s);
}
Приложение 5. Файл Desk.h
#ifndef DESK_H
#define DESK_H
#include "menu.h"
#include "listbox.h"
#include "mystring.h"
#define LIMIT 8INSTANCE{*item;classId;
};Desk {:ClassName[3][12];mn, mn1, mn2, mn3, mn4, mn5;*lbx1,
*lbx2;inst[LIMIT];count;
:();
~Desk();PaintBg(void);Go(void);Command(void);setCount(void);Init(void);numInput(int,int,int,int,char
*);strInput(int,int,int,int,char *,char *,int);str2int(char *,int
&);dataError(int,int,int,int);*CreateInstance(int,char
*);numResult(int,int,int,int,char *,int);Msg(int,int,int,int,char
*);strclear(void);sidToUpper(void);sidAssign(void);sidSub(void);Ind(void);sbtInd(void);sbtChangeChar(void);sbtAssign(void);sbtSub(void);
};
#endif /* DESK_H */
Приложение 6. Файл Desk.cpp
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<conio.h>
#include<windows.h>
#include<graphics.h>
#include<iostream>
#include <string>
#include "desk.h"namespace std;::Desk(){
//конструктор();
mn.Add(80,30,120,30,"Инициализация");
mn.Add(260,30,120,30,"Тестирование");
mn.Add(440,30,120,30,"Выход");.setDisable(1);.setSelect(0);
//mn.setDisable(1);.Add(80,80,120,30,"Число
элементов");1.Add(80,120,120,30,"Нач-е
значение");
mn1.setDisable(1);.Hide();
//Menu mn22.Add(260,80,120,30,"Строка");
mn2.Add(260,120,120,30,"Идентификатор");
mn2.Add(260,160,120,30,"Десят.
строка");
mn2.Hide();
//Menu mn3.Add(390,80,120,25,"clear()");.Hide();
//Menu mn4.Add(390,120,120,25,"Toupp");4.Add(390,145,120,25,"оператор =");
mn4.Add(390,170,120,25,"оператор
==");
mn4.Add(390,195,120,25,"оператор
[]");
// mn4.Add(390,220,120,25," vxod");
mn4.Hide();
//Menu mn5.Add(390,160,120,25,"ChangeChar()");5.Add(390,185,120,25,"оператор =");
mn5.Add(390,210,120,25,"оператор
==");
mn5.Add(390,235,120,25,"оператор
-");
mn5.Hide();
mn.setSubmenu(&mn1,0);
mn.setSubmenu(&mn2,1);.setSubmenu(&mn3,0);.setSubmenu(&mn4,1);.setSubmenu(&mn5,2);=
new ListBox(20,300,292,162);= new ListBox(330,300,292,162);void *ptr;=
lbx2;(ClassName[0],"String");(ClassName[1],"Identifier");(ClassName[2],"Tenstring");(int
i=0;i<LIMIT;i++){[i].item = NULL;[i].classId = 0;
}= 0;
}::~Desk(){ //деструктор(lbx1) delete lbx1;(lbx2) delete
lbx2;
}Desk::setCount(){ //ввод числаk =
numInput(205,80,30,30,"count ?");(k>0&&k<=LIMIT){=
k;->AddSeveral(k);.setEnable(1);.setSelect(1);.setDisable(0);
} else dataError(205,80,5,30);
}*Desk::CreateInstance(int classId, char *val){ //выбор
класса(classId){0: return new String(val);1: return new Identifier(val);2:
return new Tenstring(val);
}NULL;
}Desk::Init(){ //записьk=0, classId=0, limit=39;val[limit+1];text[limit+1];
text[0]='\0';= numInput(205,120,30,30,"num ?");(k<=0||k>count)
if(dataError(205,120,30,30)) return; = numInput(205,120,30,30,"classId
?1)идентификатор 2)десятичная строка");
if(classId!=0&&classId!=1&&classId!=2)
if(dataError(205,120,30,30)) return;(205,120,30,30,"value
?",val,23);-;->Clear();(inst[k].item){ delete inst[k].item;[k].item =
NULL;[k].classId = 0;
} [k].item = CreateInstance(classId,val);[k].classId =
classId;(val,inst[k].item->text());(text,"%d %s
%s",k+1,ClassName[classId],val);(inst[k].item)
lbx1->UpdateRow(++k,text);=0;(inst[k++].item);(k>count &&
!mn.isEnable(1)) mn.setEnable(1);
}Desk::strclear (){ //очистка строкиlen, k =
numInput(520,80,25,25,"num ?");text[40];
text[0]='\0';(k<=0||k>count){ if(dataError(520,80,25,25)) return;
}{[k-1].item->clear();(text,"%d %s
%s",k,ClassName[0],inst[k-1].item->text());->UpdateRow(k,text);
}
}Desk::sidToUpper(){ // ыерхний регистрk =
numInput(520,120,25,25,"num ?");(k<=0||k>count){
if(dataError(520,120,25,25)) return; }(inst[k-1].classId!=1) {
Msg(520,120,25,25,"Wrong data"); return; }*pId =
(Identifier*)inst[k-1].item;>toUpper();text[40]; text[0]='\0';(text,"%d
%s %s",k,ClassName[1],pId->text());->UpdateRow(k,text);
}Desk::sidAssign(){//присваиваниеk,k1=0;*pOp[2];op[2][6] =
{"op1 ?","op2 ?"};(int i=0;i<2;i++){=
numInput(520,145,25,25,op[i]); if(!k1) k1=k;(k<=0||k>count){
if(dataError(520,145,25,25)) return; }(inst[k-1].classId!=1) {
Msg(520,145,25,25,"Wrong data"); return; }[i] =
(Identifier*)inst[k-1].item;
*pOp[0] = *pOp[1];text[40]; text[0]='\0';(text,"%d %s
%s",k1,ClassName[1],pOp[0]->text());->UpdateRow(k1,text);
} Desk::sidSub(){//сравнениеk,k1=0;*pOp[2];op[2][6] =
{"op1 ?","op2 ?"};(int i=0;i<2;i++){=
numInput(520,170,25,25,op[i]); if(!k1) k1=k;(k<=0||k>count){
if(dataError(520,170,25,25)) return; }(inst[k-1].classId!=1) {
Msg(520,170,25,25,"Wrong data"); return; }[i] =
(Identifier*)inst[k-1].item;
}
*pOp[0] == *pOp[1];
{text[40]; text[0]='\0';(text,"%d %s
%s",k1,ClassName[1],pOp[0]->text());->UpdateRow(k1,text);
}}Desk::Ind() //индексное выражение
{ k,k1=0;*pOp[0];op[1][6] = {"op1 ?"};(int
i=0;i<1;i++){= numInput(520,170,25,25,op[i]); if(!k1)
k1=k;(k<=0||k>count){ if(dataError(520,170,25,25)) return;
}(inst[k-1].classId!=1) { Msg(520,170,25,25,"Wrong data"); return; }[0]
= (Identifier*)inst[k-1].item;*id=new
char[5];(520,170,25,25,"Index",id,2);idx;(!str2int(id,idx))
{(520,170,25,25,"Wrong data");id;;
}id;text[40],out[20]; text[0]='\0';-;(out,"Return value
is %c",(*(Identifier*)pOp[0])[idx]);(text,"%d %s
%s",k,ClassName[2],pOp[0]->text());->UpdateRow(k1,out);();->UpdateRow(k1,text);
}
}Desk::sbtInd(){//удалениеk,k1=0;*pOp[3];op[3][6] =
{"op1 ?","op2 ?","op3 ?"};(int i=0;i<3;i++){=
numInput(520,210,25,25,op[i]); if(!k1) k1=k;(k<=0||k>count){
if(dataError(520,210,25,25)) return; }(inst[k-1].classId!=2) {
Msg(520,210,25,25,"Wrong data"); return; }[i] =
(Tenstring*)inst[k-1].item;
}
*pOp[0] = *pOp[1] - *pOp[2];text[40];
text[0]='\0';(text,"%d %s
%s",k1,ClassName[2],pOp[0]->text());->UpdateRow(k1,text);
}Desk::sbtChangeChar(){//представить как чарk = numInput(520,160,25,25,"num
?");(k<=0||k>count){ if(dataError(520,160,25,25)) return;
}(inst[k-1].classId!=2) { Msg(520,160,25,25,"Wrong data"); return;
}*pId = (Tenstring*)inst[k-1].item;>ChangeChar();text[40]; text[0]='\0';(text,"%d
%s %s",k,ClassName[2],pId->text());->UpdateRow(k,text);
}Desk::sbtAssign(){//присваиваниеk,k1=0;*pOp[2];op[2][6] =
{"op1 ?","op2 ?"};(int i=0;i<2;i++){=
numInput(520,185,25,25,op[i]); if(!k1) k1=k;(k<=0||k>count){
if(dataError(520,185,25,25)) return; }(inst[k-1].classId!=2) {
Msg(520,185,25,25,"Wrong data"); return; }[i] =
(Tenstring*)inst[k-1].item;
}
*pOp[0] = *pOp[1];text[40]; text[0]='\0';(text,"%d %s
%s",k1,ClassName[2],pOp[0]->text());->UpdateRow(k1,text);
}Desk::sbtSub(){//сравнениеk,k1=0;*pOp[2];op[2][6] =
{"op1 ?","op2 ?"};(int i=0;i<2;i++){=
numInput(520,210,25,25,op[i]); if(!k1) k1=k;(k<=0||k>count){
if(dataError(520,210,25,25)) return; }(inst[k-1].classId!=2) {
Msg(520,210,25,25,"Wrong data"); return; }[i] =
(Tenstring*)inst[k-1].item;
}
*pOp[0] == *pOp[1];text[40]; text[0]='\0';(text,"%d %s
%s",k1,ClassName[2],pOp[0]->text());->UpdateRow(k1,text);
}Desk::numResult(int x,int y,int w,int h,char *s,int k){ //
результатlen = strlen(s)+5;*text = new char[len];(k<=99)
sprintf(text,"%s= %d",s,k);sprintf(text,"%s= xxx",s);wt =
textwidth(text);ht =
textheight(text);+=wt;(x+(w-wt)/2,y+(h-ht)/2,text);();(x,y,x+w+1,y+h+1);
}Desk::dataError(int x,int y,int w,int h){
//ошибкаtext[]="Data Error";wt = textwidth(text);ht =
textheight(text);+=wt;color = getcolor();(RED);(x,y,x+w,y+h);(x+(w-wt)/2,y+(h-ht)/2,text);(color);ch;ch=getch();(ch!=13&&ch!=27);(x,y,x+w+1,y+h+1);(ch=27)?1:0;
}Desk::Msg(int x,int y,int w,int h,char *s){//собщениеwt =
textwidth(s);ht = textheight(s);+=wt;(x+(w-wt)/2,y+(h-ht)/2,s);();(x,y,x+w+1,y+h+1);
}//Desk::str2int(char *str,int &result)//перевод в число
{correct=1,minus=0;res=0,i=0;(str[0] == '-') {= 1;= 1;
}(str[i] == 0) {0;
}(correct&&(str[i]!=0)) {((str[i] >=
0x30)&&(str[i] <= 0x39)) {= res*10 + (str[i] - 0x30);
} else {= 0;
}++;
}(correct) {= (minus)?(-res):(res);1;
} else {0;
}
}Desk::numInput(int x, int y, int w, int h, char
*prompt){//числоht, wt;text[2];(BLUE);= textwidth(prompt);=
textheight(prompt);+=wt;(x+(w-wt)/2,y+(h-ht)/2,prompt);[0] = getch();
text[1]='\0';(x,y,x+w+1,y+h+1);= textwidth(text);=
textheight(text);(x+(w-wt)/2,y+(h-ht)/2,text);(getch()!=13);(x,y,x+w+1,y+h+1);(text[0]>=48&&text[0]<=57)
return text[0]-48;0;
}Desk::strInput(int x, int y, int w, int h, char *prompt,
char *text, int limit){//строкаht, wt;(BLUE);= textwidth(prompt);=
textheight(prompt);+=wt;(x+(w-wt)/2,y+(h-ht)/2,prompt);i=0;[0]='\0';(((text[i++]=getch())!=13)&&(i<=limit)){[i]='\0';(x,y,x+w+1,y+h+1);=wt;=
textwidth(text);= textheight(text);+=wt;(x+(w-wt)/2,y+(h-ht)/2,text);
}[i-1]='\0';(x,y,x+w+1,y+h+1);
}Desk::PaintBg(){
//окно(1,1);(0,0,640,480);(11);(5,5,635,475);
}Desk::Go(){//командыchar ch;(;;){= getch();(ch){13:
Command(); break;72: mn.Upward(); break;75: mn.Backward(); break;77:
mn.Forward(); break;80: mn.Downward(); break;27: exit(0);
}
}
}Desk::Command(void){ ///команды ->Clear();*smn =
mn.getSubMenu(mn.getSelected());*smn1 = NULL;(smn) smn1 =
smn->getSubMenu(smn->getSelected());(mn.getSelected()){0:
if(smn){(smn->getSelected()){-1: smn->Show(); break;0: setCount();
break;1: Init(); break;
}
};1: if(smn){(smn->getSelected()){-1: smn->Show();
break;0: if(smn1){(smn1->getSelected()){-1: smn1->Show(); break;0:
strclear(); break;
}
};1: if(smn1){(smn1->getSelected()){-1: smn1->Show();
break;0: sidToUpper(); break;1: sidAssign(); break;2: sidSub(); break;3:
Ind();break;
}
};2: if(smn1){(smn1->getSelected()){-1: smn1->Show();
break;0: sbtChangeChar(); break;1: sbtAssign(); break;2: sbtSub(); break;3:
sbtInd();break;
}
};3: break;
}
};2: exit(0);
}
}
Приложение 7. Файл menu.h
#ifndef MENU_H
#define MENU_HMenuItem{:status;x, y, w, h;text[16];
:();(int,int,int,int, char
*);Show(void);Hide(void);setStatus(int);getStatus(void);
~MenuItem(){}
};Menu;MItem{*item;enabled;*submenu;
};Menu{:*supmenu;mItem[10];n;selected;visible;:();(Menu *,
int);
~Menu();Add(int,int,int,int,char *);setSubmenu(Menu
*,int);Show(void);Hide(void);setSelect(int);getSelected(void);setEnable(int);isEnable(int);setDisable(int);Forward(void);Backward(void);Upward(void);Downward(void);setSubMenu(int,
Menu *);*getSubMenu(int);
};
#endif /* MENU_H */
Приложение 8. Файл Menu.cpp
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<conio.h>
#include<graphics.h>
#include "menu.h"::MenuItem(){= 0;= 0; y = 0; w =
120; h = 30;(text,"Item");();
}::MenuItem(int xx,int yy,int ww,int hh, char *s){ = 0;= xx;
y = yy; w = ww; h = hh;(text,s,16);();
}MenuItem::setStatus(int k){= k;();
}MenuItem::getStatus(){status;
}MenuItem::Show(void){ (x,y,x+w,y+h);clr = getcolor();(status
> 0) setcolor(RED);if(status==0)
setcolor(LIGHTGREEN);setcolor(LIGHTGRAY);(BLUE);wt = textwidth(text);ht =
textheight(text);(x+(w-wt)/2,y+(h-ht)/2,text);(clr);
}MenuItem::Hide(void){ (status==1) status = 0;clr =
getcolor();(BLUE);(x,y,x+w+1,y+h+1);(clr);
} ::Menu(){=0;=-1;= 1;= NULL;(int i=0;i<10;i++){ [i].item
= NULL;[i].submenu = NULL;[i].enabled = 1;
}
}::Menu(Menu *mn, int k){=0;=-1;= 1;= mn;(int
i=0;i<10;i++){ [i].item = NULL;[i].submenu = NULL;[i].enabled = 1;
}>setSubMenu(k,this);
}::~Menu(){(n>=0) delete mItem[--n].item;
}Menu::isEnable(int k){mItem[k].item->getStatus() >= 0;
}Menu::Add(int x,int y,int w,int h,char *s){[n++].item = new
MenuItem(x,y,w,h,s);;
}Menu::setSubmenu(Menu *mn,int k){(k>=0&&k<n)
mItem[k].submenu = mn;>supmenu = this;
}Menu::Show(void){ (int i=0;i<n;i++) mItem[i].item->Show();=
1;
}Menu::Hide(void){ *smn = NULL;(selected >=0) smn =
mItem[selected].submenu;(smn) smn->Hide();(int i=0;i<n;i++)
mItem[i].item->Hide();= -1;= 0;
}Menu::setSelect(int
k){(mItem[k].enabled){[k].item->setStatus(1);(selected >=0) mItem[selected].item->setStatus(0);=
k;
}
}Menu::setEnable(int k){(k!=selected)
mItem[k].item->setStatus(0);[k].enabled = 1;();
}Menu::setDisable(int k){(k!=selected)
mItem[k].item->setStatus(-1);[k].enabled = 0;();
}Menu::Forward(void){ *smn = NULL;i;(i=selected+1;i<n;i++)
if(mItem[i].enabled)
break;(i<=n-1){[i].item->setStatus(1);(selected>=0){[selected].item->setStatus(0);=
mItem[selected].submenu;
}(smn) { /*smn->selected = -1*/; smn->Hide(); }= i;
}
}Menu::Backward(void){ i;(i=selected-1;i>=0;i--)
if(mItem[i].enabled)
break;(i>=0){[i].item->setStatus(1);[selected].item->setStatus(0);*smn
= mItem[selected].submenu;(smn) { /*smn->selected = -1*/; smn->Hide(); }=
i;
} else if(supmenu) {= -1;();
}
}Menu::Upward(void){ *mn = this, *mn1 = NULL;(mn->selected
>=0 && (mn1=mn->mItem[mn->selected].submenu) &&
mn1->visible) mn = mn1;>Backward();
}Menu::Downward(void){ *mn = this, *mn1 =
NULL;(mn->selected >=0 &&
(mn1=mn->mItem[mn->selected].submenu) && mn1->visible) mn =
mn1;>Forward();
}Menu::setSubMenu(int i, Menu *mn){(i>=0&&i<n)
mItem[i].submenu = mn;
}*Menu::getSubMenu(int i){(i>=0&&i<n) return
mItem[i].submenu;NULL;
}Menu::getSelected(void){selected;
}
Приложение 9. Файл Listbox.h
#ifndef LISTBOX_H
#define LISTBOX_H
#ifndef STR_MAX
#define STR_MAX 255
#endif
#define STR_LEN 79
#define LINE_HEIGHT 20ListBox;ListItem {:x, y, w,
h;*lbx;:text[STR_LEN+1];(void);(int,int,int,int,char *);
~ListItem(void);setText(char *);Show(void);Erase(void);
};ListBox {:x, y, w,
h;n;*lItem[STR_MAX];:(void);(int,int,int,int);
~ListBox(void);Add(char *);AddSeveral(int);UpdateRow(int,char
*);Clear(void);Show(void);Erase(void);Count(void);
};
#endif /* LISTBOX_H */
Приложение 10. Файл Listbox.cpp
#include<cstdlib>
#include<cstdio>
#include<graphics.h>
#include "listbox.h"::ListItem(){= 0; y = 0; w =
100; h = LINE_HEIGHT;(text,"");= NULL;
}::ListItem(int xx,int yy,int ww,int hh,char *s){ = xx; y =
yy; w = ww; h = hh;(text,s,STR_LEN-1);[STR_LEN] = '\0';= NULL;();
}::~ListItem(){();
}ListItem::setText(char *s){(text,s,STR_LEN+1);(strlen(s)>STR_LEN)
text[STR_LEN+1] = '\0';
}ListItem::Show(){();clr =
getcolor();(BLUE);(x,y,x+w,y+h);(clr);(BLUE);ht =
textheight(text);(x+5,y+(h-ht)/2,text);
}ListItem::Erase(){
//int clr = getcolor();
//setcolor(BLUE);(x,y,x+w-1,y+h);
//setcolor(clr);
} ::ListBox(){ //puts("ListBox()");= 0; y = 0; w =
200; h = 100;= 0;(int i=0;i<STR_MAX;i++) lItem[i] = NULL;();
}::ListBox(int xx,int yy,int ww,int hh){s[STR_LEN];= xx; y =
yy; w = ww; h = hh;= 0;();
}::~ListBox(){ //puts("~ListBox()");(int
i=0;i<n;i++) if(lItem[i]) delete lItem[i];
}ListBox::Add(char *s){(n<8){[n] = new ListItem(x+1,
y+n*LINE_HEIGHT+1, w, LINE_HEIGHT,s);++;
}
}ListBox::AddSeveral(int
k){s[1];(k>=0&&k<=STR_MAX){(int i=0;i<k;i++)
{(s,"%d",i+1);[i] = new ListItem(x+1, y+i*LINE_HEIGHT+1, w,
LINE_HEIGHT,s);++;
}
}
}ListBox::UpdateRow(int k, char *text){
//printf("%d\t%s\n",k,text);[--k]->setText(text);[k]->Show();
}ListBox::Clear(){(int i=0;i<n;i++) delete lItem[i];=0;
}ListBox::Erase(){(int i=0;i<n;i++) lItem[i]->Erase();
}ListBox::Show(){(x,y,x+w,y+h);
}ListBox::Count(){("n=%d\n",n);
}
Приложение 11. Файл main.cpp
#include<cstdlib>
#include<graphics.h>
#include "desk.h"*ptr = NULL;
main(void){gd = DETECT, gm;(&gd, &gm,
"");dsk;.Go();("pause");();0;
}
Приложение 12. Изображения