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

  • Вид работы:
    Курсовая работа (т)
  • Предмет:
    Информационное обеспечение, программирование
  • Язык:
    Русский
    ,
    Формат файла:
    MS Word
    76,55 Кб
  • Опубликовано:
    2014-11-11
Вы можете узнать стоимость помощи в написании студенческой работы.
Помощь в написании работы, которую точно примут!

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

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

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

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

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


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

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





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





Похожие работы на - Создание базового класса 'Строка', строки идентификатора и десятичной строки. Создание графического интерфейса

 

Не нашли материал для своей работы?
Поможем написать уникальную работу
Без плагиата!