Создание базового класса "Строка", строки идентификатора и десятичной строки. Создание графического интерфейса
Федеральное государственное бюджетное образовательное учреждение высшего профессионального образования
Балтийский государственный технический университет "Военмех" им. Д.Ф. Устинова
КУРСОВАЯ РАБОТА
Создание базового класса строка, строки идентификатора и десятичной строки. Создание графического интерфейса
Руководитель темы Безруков В.А.
Исполнитель темы Бочкарев А.С.
Санкт-Петербург 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. Изображения
Больше работ по теме:
Предмет: Информационное обеспечение, программирование
Тип работы: Курсовая работа (т)
Новости образования
КОНТАКТНЫЙ EMAIL: [email protected]
Скачать реферат © 2017 | Пользовательское соглашение
ПРОФЕССИОНАЛЬНАЯ ПОМОЩЬ СТУДЕНТАМ