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