Создание базового класса "Строка", строки идентификатора и десятичной строки. Создание графического интерфейса

 

Федеральное государственное бюджетное образовательное учреждение высшего профессионального образования

Балтийский государственный технический университет "Военмех" им. Д.Ф. Устинова











КУРСОВАЯ РАБОТА

Создание базового класса строка, строки идентификатора и десятичной строки. Создание графического интерфейса




Руководитель темы Безруков В.А.

Исполнитель темы Бочкарев А.С.







Санкт-Петербург 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. Изображения







Федеральное государственное бюджетное образовательное учреждение высшего профессионального образования Балтийский государственный технический университет &qu;

Больше работ по теме:

КОНТАКТНЫЙ EMAIL: [email protected]

Скачать реферат © 2017 | Пользовательское соглашение

Скачать      Реферат

ПРОФЕССИОНАЛЬНАЯ ПОМОЩЬ СТУДЕНТАМ