Наследование

Исследование иерархии классов и механизмов работы с наследованием. Анализ методов и полей классов для обработки данных при множественном наследовании. Создание тестируемых классов и реализация графического интерфейса на основе Simple DirectMedia Layer.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 20.05.2017
Размер файла 869,1 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru

МИНОБРНАУКИ РОССИИ

ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ

ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ

«Балтийский государственный технический университет «ВОЕНМЕХ» им. Д.Ф. Устинова» (БГТУ «ВОЕНМЕХ» им. Д.Ф. Устинова»)

Дисциплина Программирование на языке высокого уровня

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

на тему

Наследование

СОДЕРЖАНИЕ

Введение

1. ПОСТАНОВКА И АНАЛИЗ ЗАДАЧИ

1.1 Постановка задачи

1.2 Пользовательский интерфейс

2. ОПИСАНИЕ СТРУКТУРЫ ПРОГРАММЫ И АЛГОРИТМОВ РАБОТЫ

2.1 Описание классов

2.2 Алгоритм работы программы

ЗАКЛЮЧЕНИЕ

СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ

ПРИЛОЖЕНИЕ А

ВВЕДЕНИЕ

Цель работы - изучить иерархии классов, механизмы работы с наследованием, научиться обеспечивать вызов методов и полей классов для обработки данных при множественном наследовании, изменять видимости компонент в определении класса с использованием спецификаторов доступа, научиться создавать программы с полноценным графическим интерфейсом.

Программа должна быть реализована на языке программирования C++, с использованием свободной кроссплатформенной библиотеки Simple DirectMedia Layer (сокращенно SDL). В качестве среды разработки была выбрана Microsoft Visual Studio 2013.

1. ПОСТАНОВКА И АНАЛИЗ ЗАДАЧИ

1.1 Постановка задачи

1. Описать три класса: базовый класс «Строка» и производные от него класс «Строка-идентификатор» и класс, заданный индивидуальным вариантом. Обязательные для всех классов методы: конструктор без параметров, конструктор, принимающий в качестве параметра Си-строку, конструктор копирования, деструктор, перегрузка операции присваивания «=». Во всех методах всех классов предусмотреть печать сообщения, содержащего имя метода. Для конструкторов копирования каждого класса дополнительно предусмотреть диагностическую печать количества его вызовов, рекомендуется использовать статические члены класса.

Поля класса «Строка»: указатель на блок динамически выделенной памяти для размещения символов строки, длина строки в байтах. Обязательные методы, помимо вышеуказанных: конструктор, принимающий в качестве параметра символ (char), функция получения длины строки.

Строки класса «Строка-идентификатор» строятся по правилам записи идентификаторов в Си, и могут включать в себя только те символы, которые могут входить в состав Си-идентификаторов. Если исходные данные противоречат правилам записи идентификатора, то создается пустая «Строка-идентификатор».

Помимо обязательных компонентов классов, указанных в общей постановке задачи и в вариативной его части, при необходимости можно добавить дополнительные поля и методы.

2. Написать тестовую программу, которая должна:

· динамически выделить память под массив указателей на базовый класс (4-6 шт.);

· в режиме диалога заполнить этот массив указателями на производные классы, при этом экземпляры производных классов должны создаваться динамически с заданием начальных значений;

· для созданных экземпляров производных классов выполнить проверку всех разработанных методов с выводом исходных данных и результатов на дисплей.

Режим диалога должен обеспечиваться с помощью иерархического меню. Основные пункты:

1. «Инициализация». Подпункты:

1.1 «Число элементов». Задает число элементов в массиве указателей на базовый класс. После ввода числа элементов пользоваться этим пунктом меню запрещается.

1.2 «Начальное значение». С помощью этого пункта меню можно задать номер элемента, его тип и начальное значение. Задавать начальные значения и работать с другими пунктами меню запрещается до тех пор, пока не будет задано число элементов. Допускается задать новое начальное значение несколько раз.

2. «Тестирование». Подпункты:

2.1 «Строка»

2.2 «Строка-идентификатор»

2.3 Класс, соответствующий варианту задания

2.4 «Задать операнды»

После выбора одного из этих пунктов меню предлагается выбрать один из методов из списка всех обязательных методов (кроме конструкторов и деструкторов), связанных с выбранным подпунктом.

3. Выход

Дополнительные методы для класса «Строка-идентификатор»: поиск первого вхождения символа в строку, переопределение операции проверки на равенство «==».

Производный от «Строка» класс «Восьмеричная строка».

Строки данного класса могут содержать только символы восьмеричных цифр и символы «-» и «+», задающие знак числа, которые могут находиться только в первой позиции числа, причем символ «+» может отсутствовать, в этом случае число считается положительным. Если в составе инициализирующей строки будут встречены любые символы, отличные от допустимых, «Восьмеричная строка» принимает нулевое значение. Содержимое данных строк рассматривается как восьмеричное число.

Обязательные методы: определение, можно ли представить данное число в формате int, переопределение операций сложения «+» и сравнения на равенство «==» двух восьмеричных чисел.

наследование множественный графический интерфейс

1.2 Пользовательский интерфейс

Установим фиксированный размер окна равный 800х600 пикселей. При запуске программы окно принимает следующий вид (Рисунок 1).

Рисунок 1.

Выбранный пункт меню выделяется белым цветом. При выборе пункта «Инициализация» окно принимает следующий вид (Рисунок 2).

Рисунок 2.

При выборе пункта «Число элементов» окно принимает следующий вид (Рисунок 3), после чего вводится число элементов с клавиатуры, и передается в программу нажатием клавиши Enter, после чего программа возвращается в исходное состояние (Рисунок 2.). Если число элементов уже задано, то на экран выводится сообщение об этом (Рисунок 4)

Рисунок 3.

Рисунок 4.

При выборе пункта «Начальное значение» окно принимает следующий вид (Рисунок 5.) После чего задается тип создаваемого элемента и задается его значение (Рисунок 6.) Если начальное значение не удовлетворяет условию задачи, то в зависимости от выбранного типа строка становится равно нулю, или создается пустая строка. Если число элементов не задано, то об этом выводится сообщение (рисунок 7.)

Рисунок 5.

Рисунок 6

Рисунок 7

При выборе пункта назад программа возвращается в главное меню (Рисунок 1).

Если в главном меню выбрать пункт тестирование, то окно примет следующий вид (Рисунок 8). Если число элементов не задано, то примет об этом выведется сообщение (Рисунок 7).

Рисунок 8.

При выборе пункта «Строка» окно примет следующий вид (рисунок 9)

Рисунок 9

При выборе пункта «Количество вызывов коструктора копир.» на экран будет выведено количиство вызывов коструктора копирования класса stroka (рисунок 10)

Рисунок 10

При выборе пункта «Строка идентификатор» окно принимает следующий вид (рисунок 11)

Рисунок 11.

При выборе пункта «Количество вызывов коструктора копир.» на экран будет выведено количиство вызывов коструктора копирования класса stroka_indef. Вывод аналогичен рисунку 10.

При выборе пункта «A=B» будет выполнена операция == для двух объектов класса stroka_indef с заданами операндами А и В. (рисунок 12)

При выборе пункта «Первое вхождение» будет выполненн поиск последнего вхождения символа заданого оперндом С в строку заданую операндом А (Рисунок 13)

Внизу окна пишется имя выполняемого метода.

Если при выполнении окажется что один из операндов не задан, то будет выведено сообщение (Рисунок 14)

Рисунок 12

Рисунок 13

Рисунок 14

При выборе пункта «Восьмиричная строка» окно принимает следующий вид (Рисунок 15)

Рисунок 15.

При выборе пунктов «Количество вызывов котруктора копир.», «A=B?» или «A+B» вывод анологичен пункту «строка идентификатор», за исключением того что выполняются методы класса stroka_vos.

При выборе пункта «Можно ли пр. в int» выполняется проверка числа, которое хранится в строке, на приведение типа в int без потери данных (Рисунок 16)

Рисунок 16.

При выборе пункта «Задать операнды» пользователю нужно выбрать, для тестирования какого класса нужно задать операнды (Рисунок 17), а после задать сами операнды (Рисунки 18 и 19). Если операнды для тестирования одного класса окажутся разных типов, или номер элемента будет больше чем общее количество элементов, то выведется сообщение об ошибке.

Рисунок 17

Рисунок 18

Рисунок 19

Пользователь взаимодействует с программой при помощи клавиатуры, используя следующие клавиши:

1. «Стрелка вверх/вниз» - перемещение по пунктам меню.

2. «Ввод» («Enter») - подтверждение выбор пункта меню, подтверждение ввода.

3. «Esc» - закрытие окна программы.

2. ОПИСАНИЕ СТРУКТУРЫ ПРОГРАММЫ И АЛГОРИТМОВ РАБОТЫ

Поскольку применяется язык программирования C++, поддерживающий парадигму объектно-ориентированного программирования (ООП), которая существенно облегчает создание программ большого объёма, то при разработке программы будет актуально применять принципы ООП, такие как инкапсуляция и наследование.

2.1 Описание классов

В программе реализованы 4 класса: stroka, stroke_indef, stroke_vos и screen.

stroka

Является базовым для stroka_indef и stroka_vos.

Содержит следующие члены:

protected:

int len; - представляет длину строки

char* str; - указатель на строку

public:

stroka(); -конструктор по умолчанию

stroka(const char*); - конструктор, принимающий char*

stroka(const Uint16*); - конструктор, принимающий Uint16*

stroka(const char); - конструктор, принимающий char

stroka(const stroka&); -конструктор копирования

virtual ~stroka(); -деструктор

stroka& operator=(const stroka&); -перегруженная операция =

int GetLen() const; -функция, возвращающая длину строки

char* GetStr(); -функция, возвращающая строку

static int CopStr; -счетчик вызовов конструктора копирования

virtual int GetCop() const; -функция получения количество вызовов конструктора копирования

stroka_vos:public stroka

private:

bool verf() const;-функция, проверяющая восьмеричную строку на правильность построения

int vtod() const; - функция, осуществляющая перевод строки из восьмеричной системы счисления в десятеричную.

public:

static int CopDec; -счетчик вызовов конструктора копирования

virtual int GetCop() const; -функция получения количество вызовов конструктора копирования

stroka_vos();-конструктор по умолчанию

stroka_vos(const char*);- конструктор, принимающий char*

stroka_vos(const char); - конструктор, принимающий char

stroka_vos(const stroka_vos&); -конструктор копирования

stroka_vos(const Uint16*); - конструктор, принимающий Uint16*

bool PredInt() const; -функция, проверяющая можно ли представить число в формате int

bool operator==(const stroka_vos&) const; -перегруженная операция==

int operator+(const stroka_vos&) const; -перегруженная операция+

stroka_vos& operator=(const stroka_vos&); -перегруженная операция =

operator int() const; -перегруженная операция приведения типа к int

stroka_indef:public stroka

private:

bool verf() const;-функция, проверяющая строку-идентификатор на правильность построения

public:

static int CopIndef; -счетчик вызовов конструктора копирования

virtual int GetIndef() const; -функция получения количество вызовов конструктора копирования

stroka_indef();-конструктор по умолчанию

stroka_ indef (const char*);- конструктор, принимающий char*

stroka_ indef (const char); - конструктор, принимающий char

stroka_ indef (const stroka_ indef &); -конструктор копирования

stroka_ indef (const Uint16*); - конструктор, принимающий Uint16*

int pos(char) const; -функция, ищущая последнее вхождение символа в строку

bool operator==(const stroka_ indef &) const; -перегруженная операция==

stroka_ indef & operator=(const stroka_ indef &); -перегруженная операция =

screen

public:

bool valid,NacZn; -переменные, указывающие на выход из программы и на то, установленно ли начальное значение

SDL_Surface* surface,*text_surface; -поверхности для вывода меню и текста

TTF_Font* font; -шрифт

Uint8 *keystate; -массив для обработки нажатий клавиш

SDL_Event event; -переменная для обработки событий

int ColStr,type[10]; -переменная хранящая количество строк и массив хранящий тип каждой строки

stroka** mas; -массив указателей на производные классы

stroka_indef* op_i_A, *op_i_B; -указатели на операнды

stroka_dec* op_d_A, *op_d_B; -указатели на операнды

char operand_C[2]; - СИ -строка с операндом С

screen(); - конструктор

~screen(); -деструктор

void writeText(const Uint16* text, int x, int y); -функция для вывода текста

Функции для вывода меню:

void Menu();

void M_1();

void M_1_1();

void M_1_2();

void M_2();

void M_2_1();

void M_2_2();

void M_2_3();

void M_2_4();

void M_2_4_1();

void M_2_4_2();

screen.cpp

Uint16* itoa(int chis,Uint16* str);- преобразует число в строку

Uint16* ctou16(const char* s1,Uint16* s2);-приводит char* к Uint16*

2.1 Алгоритм работы программы

Поскольку разрабатываемая игра достаточно проста, алгоритмы работы многих методов тривиальны и не требуют рассмотрения. Интерес представляют алгоритм создания объекта класса screen, и работа его методa M_1:

Конструктор класса screen инициализирует все переменные, связанные с работой библиотек семейства SDL, а деструктор освобождает всю память, выделенную под указатели на объекты классов stroka, stroka_vos и stroka_indef, а так же автоматически вызывает функции TTF_CloseFont(), TTF_Quit() и SDL_Quit().

screen::screen()

{

NacZn=false;

valid=true;

ColStr=0;

mas=NULL;

if (SDL_Init(SDL_INIT_VIDEO) != 0) valid = false;

else if (TTF_Init() == -1) valid = false;

if (valid)

{

SDL_WM_SetCaption("Snetkov", NULL);

surface = SDL_SetVideoMode(800,600,32,SDL_ANYFORMAT);

font = TTF_OpenFont("CharisSILR.ttf", 40);

if (!surface || !font) valid = false;

}

keystate = SDL_GetKeyState(NULL);

op_i_A=op_i_B=NULL;

op_d_A=op_d_B=NULL;

operand_C[1]='\0';

}

screen::~screen()

{

if(font)

TTF_CloseFont(font);

TTF_Quit();

SDL_Quit();

int i;

for(i=0;i<ColStr;i++)

if(mas[i]!=NULL)

delete mas[i];

if(mas!=NULL)

delete [] mas;

}

После вызова функции M_1 программа, реагируя на действия пользователя вызывает функции других окон меню, такие как :

void M_1();

void M_1_1();

void M_1_2();

void M_2();

void M_2_1();

void M_2_2();

void M_2_3();

void M_2_4();

void M_2_4_1();

void M_2_4_2();

Во время задания начального значения функция M_1_2() выделяет память под строки определенного типа

if(v==1)

if(mas[i]==NULL)

mas[i]= new stroka_indef(str);

else

{

delete mas[i];

mas[i]=new stroka_indef(str);

}

else

if(v==2)

if(mas[i]==NULL)

mas[i]= new stroka_vos(str);

else

{

delete mas[i];

mas[i]= new stroka_vos(str);

}

ЗАКЛЮЧЕНИЕ

Цель курсовой работы достигнута. Были созданы тестируемые классы: базовый класс Строка, Строка-идентификатор, Восьмеричная строка. Также был реализован графический интерфейс на основе Simple DirectMedia Layer (сокращенно SDL). Тестируемые классы и интерфейс работают корректно.

СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ

1. Гущин, А.Н. Применение библиотеки SDL для разработки программ на языке С: учебное пособие. / А. Н. Гущин // Балтийский государственный технический университет «Военмех» имени Д.Ф. Устинова, каф. информ. систем и компьютер. технологий. - СПб. - БГТУ, 2014. - 118 с.

2. Лафоре, Р. Объектно-ориентированное программирование в С++: пер. с англ. / Р. Лафоре. - СПб., Питер, 2015. - 928 с.

3. Паркин, С. Самые знаменитые компьютерные игры: пер. с англ. / С. Паркин. - М., Эксмо, 2015. - 256 с.

4. Прата, С. Язык программирования C++. Лекции и упражнения: пер. с англ. / С. Прата. - М., Вильямс, 2012. - 1248 с.

5. Шилдт, Г. C++: базовый курс, 3-е издание: пер. с англ. / Г. Шилдт. - М., Вильямс, 2014. - 624 с.

ПРИЛОЖЕНИЕ А

Исходные тексты

main.cpp

#include "stroka.h"

#include "stroka_indef.h"

#include "stroka_vos.h"

#include <iostream>

#include "screen.h"

#include <SDL.h>

int main(int argc, char* argv[])

{

using namespace std;

screen scr;

scr.Menu();

return 0;

}

screen.cpp

#include "screen.h"

#include <SDL.h>

#include <SDL_draw.h>

#include <SDL_ttf.h>

#include "stroka_vos.h"

#include "stroka_indef.h"

#include <iostream>

Uint16* itoa(int chis,Uint16* str);

Uint16* ctou16(const char* s1,Uint16* s2);

screen::screen()

{

NacZn=false;

valid=true;

ColStr=0;

mas=NULL;

if (SDL_Init(SDL_INIT_VIDEO) != 0) valid = false;

else if (TTF_Init() == -1) valid = false;

if (valid)

{

SDL_WM_SetCaption("Mikushev", NULL);

surface = SDL_SetVideoMode(800,600,32,SDL_ANYFORMAT);

font = TTF_OpenFont("CharisSILR.ttf", 40);

if (!surface || !font) valid = false;

}

keystate = SDL_GetKeyState(NULL);

op_i_A=op_i_B=NULL;

op_d_A=op_d_B=NULL;

operand_C[1]=operand_C[0]='\0';

}

screen::~screen()

{

if(font)

TTF_CloseFont(font);

TTF_Quit();

SDL_Quit();

int i;

for(i=0;i<ColStr;i++)

if(mas[i]!=NULL)

delete mas[i];

if(mas!=NULL)

delete [] mas;

}

void screen::Menu()

{

int v=1;

do

{

Draw_FillRect(surface,0,0,800,600,0x30363f);

if(v==1)

{

Draw_FillRect(surface,179,89,440,80,0xdbdde0);

Draw_FillRect(surface,179,259,440,80,0x9299a3);

Draw_FillRect(surface,179,430,440,80,0x9299a3);

}

if(v==2)

{

Draw_FillRect(surface,179,89,440,80,0x9299a3);

Draw_FillRect(surface,179,259,440,80,0xdbdde0);

Draw_FillRect(surface,179,430,440,80,0x9299a3);

}

if(v==3)

{

Draw_FillRect(surface,179,89,440,80,0x9299a3);

Draw_FillRect(surface,179,259,440,80,0x9299a3);

Draw_FillRect(surface,179,430,440,80,0xdbdde0);

}

writeText((Uint16*)L"Инициализация", 245, 95);

writeText((Uint16*)L"Тестирование", 260, 265);

writeText((Uint16*)L"Выход", 333, 435);

SDL_Flip(surface);

while (SDL_WaitEvent(&event) && valid)

{

if (event.type == SDL_QUIT || keystate[SDLK_ESCAPE]) valid = false;

if( keystate[ SDLK_DOWN ] )

{

if(v==3)

v=1;

else

v++;

break;

}

if( keystate[ SDLK_UP ] )

{

if(v==1)

v=3;

else

v--;

break;

}

if (keystate[SDLK_RETURN])

{

if(v==1)

M_1();

if(v==2)

M_2();

if(v==3)

valid=false;

break;

}

}

}

while(valid);

}

void screen::M_1()

{

int v=1;

do

{

Draw_FillRect(surface,0,0,800,600,0x30363f);

if(v==1)

{

Draw_FillRect(surface,179,89,440,80,0xdbdde0);

Draw_FillRect(surface,179,259,440,80,0x9299a3);

Draw_FillRect(surface,179,430,440,80,0x9299a3);

}

if(v==2)

{

Draw_FillRect(surface,179,89,440,80,0x9299a3);

Draw_FillRect(surface,179,259,440,80,0xdbdde0);

Draw_FillRect(surface,179,430,440,80,0x9299a3);

}

if(v==3)

{

Draw_FillRect(surface,179,89,440,80,0x9299a3);

Draw_FillRect(surface,179,259,440,80,0x9299a3);

Draw_FillRect(surface,179,430,440,80,0xdbdde0);

}

writeText((Uint16*)L"Число элементов", 240, 95);

writeText((Uint16*)L"Начальное значение", 210, 265);

writeText((Uint16*)L"Назад", 333, 435);

SDL_Flip(surface);

while (SDL_WaitEvent(&event) && valid)

{

if (event.type == SDL_QUIT || keystate[SDLK_ESCAPE]) valid = false;

if( keystate[ SDLK_DOWN ] )

{

if(v==3)

v=1;

else

v++;

break;

}

if( keystate[ SDLK_UP ] )

{

if(v==1)

v=3;

else

v--;

break;

}

if (keystate[SDLK_RETURN])

{

if(v==1)

M_1_1();

if(v==2)

M_1_2();

if(v==3)

return;

break;

}

}

}

while(valid);

}

void screen::M_2()

{

if(!NacZn)

{

Draw_FillRect(surface,0,0,800,600,0x30363f);

writeText((Uint16*)L"Задайте число элементов.",0,0);

SDL_Flip(surface);

while(valid)

{

if (SDL_PollEvent(&event))

{

if (event.type == SDL_QUIT || keystate[SDLK_ESCAPE])

valid = false;

if (keystate[SDLK_RETURN] )

return;

}

}

}

int v=1;

do

{

Draw_FillRect(surface,0,0,800,600,0x30363f);

if(v==1)

{

Draw_FillRect(surface,179,33,440,80,0xdbdde0);

Draw_FillRect(surface,179,146,440,80,0x9299a3);

Draw_FillRect(surface,179,259,440,80,0x9299a3);

Draw_FillRect(surface,179,372,440,80,0x9299a3);

Draw_FillRect(surface,179,485,440,80,0x9299a3);

}

if(v==2)

{

Draw_FillRect(surface,179,33,440,80,0x9299a3);

Draw_FillRect(surface,179,146,440,80,0xdbdde0);

Draw_FillRect(surface,179,259,440,80,0x9299a3);

Draw_FillRect(surface,179,372,440,80,0x9299a3);

Draw_FillRect(surface,179,485,440,80,0x9299a3);

}

if(v==3)

{

Draw_FillRect(surface,179,33,440,80,0x9299a3);

Draw_FillRect(surface,179,146,440,80,0x9299a3);

Draw_FillRect(surface,179,259,440,80,0xdbdde0);

Draw_FillRect(surface,179,372,440,80,0x9299a3);

Draw_FillRect(surface,179,485,440,80,0x9299a3);

}if(v==4)

{

Draw_FillRect(surface,179,33,440,80,0x9299a3);

Draw_FillRect(surface,179,146,440,80,0x9299a3);

Draw_FillRect(surface,179,259,440,80,0x9299a3);

Draw_FillRect(surface,179,372,440,80,0xdbdde0);

Draw_FillRect(surface,179,485,440,80,0x9299a3);

}if(v==5)

{

Draw_FillRect(surface,179,33,440,80,0x9299a3);

Draw_FillRect(surface,179,146,440,80,0x9299a3);

Draw_FillRect(surface,179,259,440,80,0x9299a3);

Draw_FillRect(surface,179,372,440,80,0x9299a3);

Draw_FillRect(surface,179,485,440,80,0xdbdde0);

}

writeText((Uint16*)L"Строка", 320, 38);

writeText((Uint16*)L"Строка-идентификатор", 180, 151);

writeText((Uint16*)L"Восьмеричная строка", 200, 264);

writeText((Uint16*)L"Задать операнды", 240, 377);

writeText((Uint16*)L"Назад", 333, 490);

SDL_Flip(surface);

while (SDL_WaitEvent(&event) && valid)

{

if (event.type == SDL_QUIT || keystate[SDLK_ESCAPE]) valid = false;

if( keystate[ SDLK_DOWN ] )

{

if(v==5)

v=1;

else

v++;

break;

}

if( keystate[ SDLK_UP ] )

{

if(v==1)

v=5;

else

v--;

break;

}

if (keystate[SDLK_RETURN])

{

if(v==1)

M_2_1();

if(v==2)

M_2_2();

if(v==3)

M_2_3();

if(v==4)

M_2_4();

if(v==5)

return;

break;

}

}

}

while(valid);

}

void screen::writeText(const Uint16* text, int x, int y) //вывод сообщения на экран

{

SDL_Color color = {0, 0, 255};

SDL_Rect dest = { x, y, 0, 0 };

SDL_Surface * textSurface = NULL;

if (textSurface = TTF_RenderUNICODE_Blended(font, text, color))

{

SDL_BlitSurface(textSurface, NULL, surface, &dest);

SDL_FreeSurface(textSurface);

}

}

void screen::M_1_1()

{

int count = 0;

if(!NacZn)

{

SDL_Flip(surface);

Uint16 str[2] = {'\0' };

SDL_EnableUNICODE(1);

while (valid)

{

if (SDL_PollEvent(&event))

{

if (event.type == SDL_QUIT || keystate[SDLK_ESCAPE])

{

valid = false;

return;

}

if (keystate[SDLK_RETURN] && count != 0)

{

ColStr=str[0]-48;

break;

}

if (keystate[SDLK_BACKSPACE] && count > 0)

str[--count] = '\0';

Uint16 ukey = event.key.keysym.unicode;

if (count < 1 && ukey >= 49 && ukey <= 57)

{

str[count] = ukey;

str[++count] = '\0';

}

}

Draw_FillRect(surface,0,0,800,600,0x30363f);

writeText((Uint16*)L"Введите число элементов :",0,0);

writeText(str,520, 0);

SDL_Flip(surface);

}

mas=new stroka*[ColStr];

for(count=0;count<ColStr;count++)

mas[count]=NULL;

NacZn=true;

}

else

{

Draw_FillRect(surface,0,0,800,600,0x30363f);

writeText((Uint16*)L"Количество элементов уже известно",0,0);

SDL_Flip(surface);

while(valid)

{

if (SDL_PollEvent(&event))

{

if (event.type == SDL_QUIT || keystate[SDLK_ESCAPE])

valid = false;

if (keystate[SDLK_RETURN] )

break;

}

}

}

}

void screen::M_1_2()

{

if(!NacZn)

{

Draw_FillRect(surface,0,0,800,600,0x30363f);

writeText((Uint16*)L"Задайте число элементов.",0,0);

SDL_Flip(surface);

while(valid)

{

if (SDL_PollEvent(&event))

{

if (event.type == SDL_QUIT || keystate[SDLK_ESCAPE])

valid = false;

if (keystate[SDLK_RETURN] )

return;

}

}

}

SDL_EnableUNICODE(1);

int count,i;

Uint16 n[2]={'0','\0'};

Uint16 str[13]={'\0'};

count=0;

bool vib=true;

for(i=0;i<ColStr;i++)

{

int v=1;

do

{

Draw_FillRect(surface,0,0,800,600,0x30363f);

if(v==1)

{

Draw_FillRect(surface,179,199,440,80,0xdbdde0);

Draw_FillRect(surface,179,369,440,80,0x9299a3);

}

if(v==2)

{

Draw_FillRect(surface,179,199,440,80,0x9299a3);

Draw_FillRect(surface,179,369,440,80,0xdbdde0);

}

writeText((Uint16*)L"Строк-идентификатор", 180, 205);

writeText((Uint16*)L"Восьмеричная строка", 200, 375);

writeText((Uint16*)L"Номер элемента:",0,0);

n[0]=49+i;

writeText(n,320,0);

writeText((Uint16*)L"Выберите тип:",0,35);

SDL_Flip(surface);

while (SDL_WaitEvent(&event) && valid)

{

if (event.type == SDL_QUIT || keystate[SDLK_ESCAPE]) valid = false;

if( keystate[ SDLK_DOWN ] )

{

if(v==2)

v=1;

else

v=2;

break;

}

if( keystate[ SDLK_UP ] )

{

if(v==1)

v=2;

else

v=1;

break;

}

if (keystate[SDLK_RETURN])

{

vib=false;

break;

}

}

}

while(valid&&vib);

type[i]=v;

while (valid)

{

if (SDL_PollEvent(&event))

{

if (event.type == SDL_QUIT || keystate[SDLK_ESCAPE])

valid = false;

if (keystate[SDLK_RETURN] && count != 0)

{

if(v==1)

if(mas[i]==NULL)

mas[i]= new stroka_indef(str);

else

{

delete mas[i];

mas[i]=new stroka_indef(str);

}

else

if(v==2)

if(mas[i]==NULL)

mas[i]= new stroka_vos(str);

else

{

delete mas[i];

mas[i]= new stroka_vos(str);

}

count=0;

str[0]='\0';

vib=true;

break;

}

if (keystate[SDLK_BACKSPACE] && count > 0)

str[--count] = '\0';

Uint16 ukey = event.key.keysym.unicode;

if (count < 13 && ((ukey >= 65 && ukey <= 90)

|| (ukey >= 97 && ukey <= 122)

|| (ukey >= 48 && ukey <= 57)||ukey=='-'||ukey=='+'||ukey=='_'||ukey==' '))

{

str[count] = ukey;

str[++count] = '\0';

}

}

Draw_FillRect(surface,0,0,800,600,0x30363f);

writeText((Uint16*)L"Номер элемента:",0,0);

n[0]=49+i;

writeText(n,320,0);

writeText((Uint16*)L"Выберите тип:",0,35);

if(v==1)

writeText((Uint16*)L"Строка-идентификатор",300,35);

else

if(v==2)

writeText((Uint16*)L"Восьмиричная строка",300,35);

writeText((Uint16*)L"Значение:",0,70);

writeText(str,200,70);

SDL_Flip(surface);

}

}

}

void screen::M_2_1()

{

int v=1;

do

{

Draw_FillRect(surface,0,0,800,600,0x30363f);

if(v==1)

{

Draw_FillRect(surface,179,124,440,100,0xdbdde0);

Draw_FillRect(surface,179,284,440,80,0x9299a3);

}

if(v==2)

{

Draw_FillRect(surface,179,124,440,100,0x9299a3);

Draw_FillRect(surface,179,284,440,80,0xdbdde0);

}

writeText((Uint16*)L"Количесто вызывов ", 180, 130);

writeText((Uint16*)L"конструктора копир.", 180, 165);

writeText((Uint16*)L"Назад", 333, 290);

SDL_Flip(surface);

while (SDL_WaitEvent(&event) && valid)

{

if (event.type == SDL_QUIT || keystate[SDLK_ESCAPE]) valid = false;

if( keystate[ SDLK_DOWN ] )

{

if(v==2)

v=1;

else

v=2;

break;

}

if( keystate[ SDLK_UP ] )

{

if(v==1)

v=2;

else

v=1;

break;

}

if (keystate[SDLK_RETURN])

{

if(v==1)

{

Uint16 str[17];

itoa(stroka::CopStr,str);

Draw_FillRect(surface,0,0,800,600,0x30363f);

writeText((Uint16*)L"Количество вызывов конструктора", 0, 0);

writeText((Uint16*)L"копирования:",0,35);

writeText(str,260,35);

SDL_Flip(surface);

while(valid)

{

if (SDL_PollEvent(&event))

{

if (event.type == SDL_QUIT || keystate[SDLK_ESCAPE])

valid = false;

if (keystate[SDLK_RETURN] )

break;

}

}

}

if(v==2)

return;

break;

}

}

}

while(valid);

}

void screen::M_2_2()

{

int v = 1;

do

{

Draw_FillRect(surface, 0, 0, 800, 600, 0x30363f);

if (v == 1)

{

Draw_FillRect(surface, 179, 51, 440, 100, 0xdbdde0);

Draw_FillRect(surface, 179, 203, 440, 80, 0x9299a3);

Draw_FillRect(surface, 179, 335, 440, 80, 0x9299a3);

Draw_FillRect(surface, 179, 467, 440, 80, 0x9299a3);

}

if (v == 2)

{

Draw_FillRect(surface, 179, 51, 440, 100, 0x9299a3);

Draw_FillRect(surface, 179, 203, 440, 80, 0xdbdde0);

Draw_FillRect(surface, 179, 335, 440, 80, 0x9299a3);

Draw_FillRect(surface, 179, 467, 440, 80, 0x9299a3);

}

if (v == 3)

{

Draw_FillRect(surface, 179, 51, 440, 100, 0x9299a3);

Draw_FillRect(surface, 179, 203, 440, 80, 0x9299a3);

Draw_FillRect(surface, 179, 335, 440, 80, 0xdbdde0);

Draw_FillRect(surface, 179, 467, 440, 80, 0x9299a3);

}if (v == 4)

{

Draw_FillRect(surface, 179, 51, 440, 100, 0x9299a3);

Draw_FillRect(surface, 179, 203, 440, 80, 0x9299a3);

Draw_FillRect(surface, 179, 335, 440, 80, 0x9299a3);

Draw_FillRect(surface, 179, 467, 440, 80, 0xdbdde0);

}

writeText((Uint16*)L"Количесто вызывов ", 180, 46);

writeText((Uint16*)L"конструктора копир.", 180, 81);

writeText((Uint16*)L"A=B", 333, 208);

writeText((Uint16*)L"Первое вхождение", 200, 340);

writeText((Uint16*)L"Назад", 333, 473);

SDL_Flip(surface);

while (SDL_WaitEvent(&event) && valid)

{

if (event.type == SDL_QUIT || keystate[SDLK_ESCAPE]) valid = false;

if (keystate[SDLK_DOWN])

{

if (v == 4)

v = 1;

else

v++;

break;

}

if (keystate[SDLK_UP])

{

if (v == 1)

v = 4;

else

v--;

break;

}

if (keystate[SDLK_RETURN])

{

Uint16 str[17];

if (v == 1)

{

itoa(stroka_indef::CopIndef, str);

Draw_FillRect(surface, 0, 0, 800, 600, 0x30363f);

writeText((Uint16*)L"Количество вызывов конструктора", 0, 0);

writeText((Uint16*)L"копирования:", 0, 35);

writeText(str, 260, 35);

SDL_Flip(surface);

while (valid)

{

if (SDL_PollEvent(&event))

{

if (event.type == SDL_QUIT || keystate[SDLK_ESCAPE])

valid = false;

if (keystate[SDLK_RETURN])

break;

}

}

}

if (v == 2)

if (op_i_A == NULL || op_i_B == NULL)

{

Draw_FillRect(surface, 0, 0, 800, 600, 0x30363f);

writeText((Uint16*)L"Задайте операнды.", 0, 0);

SDL_Flip(surface);

while (valid)

{

if (SDL_PollEvent(&event))

{

if (event.type == SDL_QUIT || keystate[SDLK_ESCAPE])

valid = false;

if (keystate[SDLK_RETURN])

break;

}

}

}

else

{

Draw_FillRect(surface, 0, 0, 800, 600, 0x30363f);

writeText((Uint16*)L"Операнд A=", 0, 0);

writeText(ctou16(op_i_A->GetStr(), str), 240, 0);

writeText((Uint16*)L"Операнд B=", 0, 35);

writeText(ctou16(op_i_B->GetStr(), str), 240, 35);

writeText((Uint16*)L"A=B ?", 0, 70);

writeText((Uint16*)L"bool operator==(const stroka_indef&) const;", 0, 520);

if (*(op_i_A) == *(op_i_B))

writeText((Uint16*)L"Правда.", 0, 105);

else

writeText((Uint16*)L"Ложь.", 0, 105);

SDL_Flip(surface);

while (valid)

{

if (SDL_PollEvent(&event))

{

if (event.type == SDL_QUIT || keystate[SDLK_ESCAPE])

valid = false;

if (keystate[SDLK_RETURN])

break;

}

}

}

if (v == 3)

{

if (op_i_A == NULL || operand_C[0] == '\0')

{

Draw_FillRect(surface, 0, 0, 800, 600, 0x30363f);

writeText((Uint16*)L"Задайте операнды.", 0, 0);

SDL_Flip(surface);

while (valid)

{

if (SDL_PollEvent(&event))

{

if (event.type == SDL_QUIT || keystate[SDLK_ESCAPE])

valid = false;

if (keystate[SDLK_RETURN])

break;

}

}

}

else

{

Draw_FillRect(surface, 0, 0, 800, 600, 0x30363f);

writeText((Uint16*)L"Операнд A=", 0, 0);

writeText(ctou16(op_i_A->GetStr(), str), 240, 0);

writeText((Uint16*)L"Операнд C=", 0, 35);

writeText(ctou16(operand_C, str), 240, 35);

writeText((Uint16*)L"int pos(char) const;", 0, 520);

int pos = op_i_A->pos(operand_C[0]);

if (pos == 0)

writeText((Uint16*)L"Символ не входит в строку", 0, 105);

else

{

writeText((Uint16*)L"Позиция первого символа:", 0, 105);

writeText(itoa(pos, str), 570, 105);

}

SDL_Flip(surface);

while (valid)

{

if (SDL_PollEvent(&event))

{

if (event.type == SDL_QUIT || keystate[SDLK_ESCAPE])

valid = false;

if (keystate[SDLK_RETURN])

break;

}

}

}

}

if (v == 4)

return;

break;

}

}

} while (valid);

}

void screen::M_2_3()

{

int v=1;

do

{

Draw_FillRect(surface,0,0,800,600,0x30363f);

if(v==1)

{

Draw_FillRect(surface,179,33,440,100,0xdbdde0);

Draw_FillRect(surface,179,146,440,80,0x9299a3);

Draw_FillRect(surface,179,259,440,80,0x9299a3);

Draw_FillRect(surface,179,372,440,80,0x9299a3);

Draw_FillRect(surface,179,485,440,80,0x9299a3);

}

if(v==2)

{

Draw_FillRect(surface,179,33,440,100,0x9299a3);

Draw_FillRect(surface,179,146,440,80,0xdbdde0);

Draw_FillRect(surface,179,259,440,80,0x9299a3);

Draw_FillRect(surface,179,372,440,80,0x9299a3);

Draw_FillRect(surface,179,485,440,80,0x9299a3);

}

if(v==3)

{

Draw_FillRect(surface,179,33,440,100,0x9299a3);

Draw_FillRect(surface,179,146,440,80,0x9299a3);

Draw_FillRect(surface,179,259,440,80,0xdbdde0);

Draw_FillRect(surface,179,372,440,80,0x9299a3);

Draw_FillRect(surface,179,485,440,80,0x9299a3);

}if(v==4)

{

Draw_FillRect(surface,179,33,440,100,0x9299a3);

Draw_FillRect(surface,179,146,440,80,0x9299a3);

Draw_FillRect(surface,179,259,440,80,0x9299a3);

Draw_FillRect(surface,179,372,440,80,0xdbdde0);

Draw_FillRect(surface,179,485,440,80,0x9299a3);

}if(v==5)

{

Draw_FillRect(surface,179,33,440,100,0x9299a3);

Draw_FillRect(surface,179,146,440,80,0x9299a3);

Draw_FillRect(surface,179,259,440,80,0x9299a3);

Draw_FillRect(surface,179,372,440,80,0x9299a3);

Draw_FillRect(surface,179,485,440,80,0xdbdde0);

}if(v==1)

{

Draw_FillRect(surface,179,33,440,100,0xdbdde0);

Draw_FillRect(surface,179,146,440,80,0x9299a3);

Draw_FillRect(surface,179,259,440,80,0x9299a3);

Draw_FillRect(surface,179,372,440,80,0x9299a3);

Draw_FillRect(surface,179,485,440,80,0x9299a3);

}

if(v==2)

{

Draw_FillRect(surface,179,33,440,100,0x9299a3);

Draw_FillRect(surface,179,146,440,80,0xdbdde0);

Draw_FillRect(surface,179,259,440,80,0x9299a3);

Draw_FillRect(surface,179,372,440,80,0x9299a3);

Draw_FillRect(surface,179,485,440,80,0x9299a3);

}

if(v==3)

{

Draw_FillRect(surface,179,33,440,100,0x9299a3);

Draw_FillRect(surface,179,146,440,80,0x9299a3);

Draw_FillRect(surface,179,259,440,80,0xdbdde0);

Draw_FillRect(surface,179,372,440,80,0x9299a3);

Draw_FillRect(surface,179,485,440,80,0x9299a3);

}if(v==4)

{

Draw_FillRect(surface,179,33,440,100,0x9299a3);

Draw_FillRect(surface,179,146,440,80,0x9299a3);

Draw_FillRect(surface,179,259,440,80,0x9299a3);

Draw_FillRect(surface,179,372,440,80,0xdbdde0);

Draw_FillRect(surface,179,485,440,80,0x9299a3);

}if(v==5)

{

Draw_FillRect(surface,179,33,440,100,0x9299a3);

Draw_FillRect(surface,179,146,440,80,0x9299a3);

Draw_FillRect(surface,179,259,440,80,0x9299a3);

Draw_FillRect(surface,179,372,440,80,0x9299a3);

Draw_FillRect(surface,179,485,440,80,0xdbdde0);

}

writeText((Uint16*)L"Количесто вызывов ", 180, 28);

writeText((Uint16*)L"конструктора копир.", 180, 63);

writeText((Uint16*)L"A=B?", 333, 151);

writeText((Uint16*)L"A+B", 333, 264);

writeText((Uint16*)L"Можно ли пр. в int", 190, 377);

writeText((Uint16*)L"Назад", 333, 490);

SDL_Flip(surface);

while (SDL_WaitEvent(&event) && valid)

{

if (event.type == SDL_QUIT || keystate[SDLK_ESCAPE]) valid = false;

if( keystate[ SDLK_DOWN ] )

{

if(v==5)

v=1;

else

v++;

break;

}

if( keystate[ SDLK_UP ] )

{

if(v==1)

v=5;

else

v--;

break;

}

if (keystate[SDLK_RETURN])

{

Uint16 str[17];

if(v==1)

{

itoa(stroka_vos::CopDec,str);

Draw_FillRect(surface,0,0,800,600,0x30363f);

writeText((Uint16*)L"Количество вызывов конструктора", 0, 0);

writeText((Uint16*)L"копирования:",0,35);

writeText(str,260,35);

SDL_Flip(surface);

while(valid)

{

if (SDL_PollEvent(&event))

{

if (event.type == SDL_QUIT || keystate[SDLK_ESCAPE])

valid = false;

if (keystate[SDLK_RETURN] )

break;

}

}

}

if(v==2)

if(op_d_A==NULL||op_d_B==NULL)

{

Draw_FillRect(surface,0,0,800,600,0x30363f);

writeText((Uint16*)L"Задайте операнды.", 0, 0);

SDL_Flip(surface);

while(valid)

{

if (SDL_PollEvent(&event))

{

if (event.type == SDL_QUIT || keystate[SDLK_ESCAPE])

valid = false;

if (keystate[SDLK_RETURN] )

break;

}

}

}

else

{

Draw_FillRect(surface,0,0,800,600,0x30363f);

writeText((Uint16*)L"Операнд A=", 0, 0);

writeText(ctou16(op_d_A->GetStr(),str),240,0);

writeText((Uint16*)L"Операнд B=", 0, 35);

writeText(ctou16(op_d_B->GetStr(),str),240,35);

writeText((Uint16*)L"A==B ?", 0, 70);

writeText((Uint16*)L"bool operator==(const stroka_dec&) const;", 0, 520);

if(*(op_d_A)==*(op_d_B))

writeText((Uint16*)L"Правда.", 0, 105);

else

writeText((Uint16*)L"Ложь.", 0, 105);

SDL_Flip(surface);

while(valid)

{

if (SDL_PollEvent(&event))

{

if (event.type == SDL_QUIT || keystate[SDLK_ESCAPE])

valid = false;

if (keystate[SDLK_RETURN] )

break;

}

}

}

if(v==3)

{

if(op_d_A==NULL||op_d_B==NULL)

{

Draw_FillRect(surface,0,0,800,600,0x30363f);

writeText((Uint16*)L"Задайте операнды.", 0, 0);

SDL_Flip(surface);

while(valid)

{

if (SDL_PollEvent(&event))

{

if (event.type == SDL_QUIT || keystate[SDLK_ESCAPE])

valid = false;

if (keystate[SDLK_RETURN] )

break;

}

}

}

else

{

Draw_FillRect(surface,0,0,800,600,0x30363f);

writeText((Uint16*)L"Операнд A=", 0, 0);

writeText(ctou16(op_d_A->GetStr(),str),240,0);

writeText((Uint16*)L"Операнд B=", 0, 35);

writeText(ctou16(op_d_B->GetStr(),str),240,35);

writeText((Uint16*)L"A+B =", 0, 70);

writeText((Uint16*)L"int operator+(const stroka_dec&) const;", 0, 520);

writeText(itoa((*(op_d_A)+*(op_d_B)), str), 240, 70);

SDL_Flip(surface);

while(valid)

{

if (SDL_PollEvent(&event))

{

if (event.type == SDL_QUIT || keystate[SDLK_ESCAPE])

valid = false;

if (keystate[SDLK_RETURN] )

break;

}

}

}

}

if(v==4)

{

if(op_d_A==NULL)

{

Draw_FillRect(surface,0,0,800,600,0x30363f);

writeText((Uint16*)L"Задайте операнды.", 0, 0);

SDL_Flip(surface);

while(valid)

{

if (SDL_PollEvent(&event))

{

if (event.type == SDL_QUIT || keystate[SDLK_ESCAPE])

valid = false;

if (keystate[SDLK_RETURN] )

break;

}

}

}

else

{

Draw_FillRect(surface,0,0,800,600,0x30363f);

writeText((Uint16*)L"Операнд A=", 0, 0);

writeText(ctou16(op_d_A->GetStr(),str),240,0);

writeText((Uint16*)L"Можно ли представить в формате", 0, 35);

writeText((Uint16*)L"int ?", 0, 70);

writeText((Uint16*)L"bool PredInt() const;", 0, 520);

if(op_d_A->PredInt())

writeText((Uint16*)L"Можно.", 0, 105);

else

writeText((Uint16*)L"Нельзя.", 0, 105);

SDL_Flip(surface);

while(valid)

{

if (SDL_PollEvent(&event))

{

if (event.type == SDL_QUIT || keystate[SDLK_ESCAPE])

valid = false;

if (keystate[SDLK_RETURN] )

break;

}

}

}

}

if(v==5)

return;

break;

}

}

}

while(valid);

}

void screen::M_2_4()

{

int v=1;

do

{

Draw_FillRect(surface,0,0,800,600,0x30363f);

if(v==1)

{

Draw_FillRect(surface,179,89,440,90,0xdbdde0);

Draw_FillRect(surface,179,259,440,90,0x9299a3);

Draw_FillRect(surface,179,430,440,80,0x9299a3);

}

if(v==2)

{

Draw_FillRect(surface,179,89,440,90,0x9299a3);

Draw_FillRect(surface,179,259,440,90,0xdbdde0);

Draw_FillRect(surface,179,430,440,80,0x9299a3);

}

if(v==3)

{

Draw_FillRect(surface,179,89,440,90,0x9299a3);

Draw_FillRect(surface,179,259,440,90,0x9299a3);

Draw_FillRect(surface,179,430,440,80,0xdbdde0);

}

writeText((Uint16*)L"Операнды для тести-", 190, 85);

writeText((Uint16*)L"рования строки инд.", 190, 120);

writeText((Uint16*)L"Операнды для тести-", 190, 255);

writeText((Uint16*)L"рования восм. строки", 190, 290);

writeText((Uint16*)L"Назад", 333, 435);

SDL_Flip(surface);

while (SDL_WaitEvent(&event) && valid)

{

if (event.type == SDL_QUIT || keystate[SDLK_ESCAPE]) valid = false;

if( keystate[ SDLK_DOWN ] )

{

if(v==3)

v=1;

else

v++;

break;

}

if( keystate[ SDLK_UP ] )

{

if(v==1)

v=3;

else

v--;

break;

}

if (keystate[SDLK_RETURN])

{

if(v==1)

M_2_4_1();

if(v==2)

M_2_4_2();

if(v==3)

return;

break;

}

}

}

while(valid);

}

Uint16* itoa(int chislo, Uint16* str)

{

int col, chis;

chis = chislo;

col = (chis == 0) ? 1 : 0;

while (chis != 0)

{

col++;

chis /= 10;

}

col += 1;

if (chislo<0)

{

str[0] = '-';

col++;

chis = -chislo;

}

else

chis = chislo;

str += col;

*--str = '\0';

do

{

*--str = chis % 10 + '0';

chis /= 10;

} while (chis != 0);

if (chislo<0)

str--;

return str;

}

Uint16* ctou16(const char* s1,Uint16* s2)

{

int i;

for(i=0;s1[i]!='\0';i++)

s2[i]=s1[i];

s2[i]='\0';

return s2;

}

void screen::M_2_4_1()

{

int v=1;

do

{

Draw_FillRect(surface,0,0,800,600,0x30363f);

if(v==1)

{

Draw_FillRect(surface,179,89,440,80,0xdbdde0);

Draw_FillRect(surface,179,259,440,80,0x9299a3);

Draw_FillRect(surface,179,429,440,80,0x9299a3);

}

if(v==2)

{

Draw_FillRect(surface,179,89,440,80,0x9299a3);

Draw_FillRect(surface,179,259,440,80,0xdbdde0);

Draw_FillRect(surface,179,429,440,80,0x9299a3);

}

if(v==3)

{

Draw_FillRect(surface,179,89,440,80,0x9299a3);

Draw_FillRect(surface,179,259,440,80,0x9299a3);

Draw_FillRect(surface,179,429,440,80,0xdbdde0);

}

writeText((Uint16*)L"Операнды А и B", 260, 94);

writeText((Uint16*)L"Операнд С", 280, 264);

writeText((Uint16*)L"Назад", 333, 434);

SDL_Flip(surface);

int temp_i, type_A, type_B;

while (SDL_WaitEvent(&event) && valid)

{

if (event.type == SDL_QUIT || keystate[SDLK_ESCAPE]) valid = false;

if( keystate[ SDLK_DOWN ] )

{

if(v==3)

v=1;

else

v++;

break;

}

if( keystate[ SDLK_UP ] )

{

if(v==1)

v=3;

else

v--;

break;

}

if (keystate[SDLK_RETURN])

{

if(v==1)

{

SDL_Flip(surface);

Uint16 str[2] = {'\0' };

int count=0;

SDL_EnableUNICODE(1);

while(valid)

{

while (valid)

{

if (SDL_PollEvent(&event))

{

if (event.type == SDL_QUIT || keystate[SDLK_ESCAPE])

{

valid = false;

return;

}

if (keystate[SDLK_RETURN] && count != 0)

{

temp_i=str[0]-48;

count=0;

str[0]='\0';

if(temp_i>ColStr)

{

Draw_FillRect(surface,0,0,800,600,0x30363f);

writeText((Uint16*)L"Элемента под таким номером не существует.",0,0);

SDL_Flip(surface);

while(valid)

{

if (SDL_PollEvent(&event))

{

if (event.type == SDL_QUIT || keystate[SDLK_ESCAPE])

valid = false;

if (keystate[SDLK_RETURN] )

break;

}

}

continue;

}

else

break;

}

if (keystate[SDLK_BACKSPACE] && count > 0)

str[--count] = '\0';

Uint16 ukey = event.key.keysym.unicode;

if (count < 1 && ukey >= 49 && ukey <= 57)

{

str[count] = ukey;

str[++count] = '\0';

}

}

Draw_FillRect(surface,0,0,800,600,0x30363f);

writeText((Uint16*)L"Введите номер элемента A:",0,0);

writeText(str,520, 0);

SDL_Flip(surface);

}

screen::op_i_A=(stroka_indef*)mas[temp_i-1];

type_A=type[temp_i-1];

while (valid)

{

if (SDL_PollEvent(&event))

{

if (event.type == SDL_QUIT || keystate[SDLK_ESCAPE])

{

valid = false;

return;

}

if (keystate[SDLK_RETURN] && count != 0)

{

temp_i=str[0]-48;

count=0;

str[0]='\0';

if(temp_i>ColStr)

{

Draw_FillRect(surface,0,0,800,600,0x30363f);

writeText((Uint16*)L"Элемента под таким номером не существует.",0,0);

SDL_Flip(surface);

while(valid)

{

if (SDL_PollEvent(&event))

{

if (event.type == SDL_QUIT || keystate[SDLK_ESCAPE])

valid = false;

if (keystate[SDLK_RETURN] )

break;

}

}

continue;

}

else

break;

}

if (keystate[SDLK_BACKSPACE] && count > 0)

str[--count] = '\0';

Uint16 ukey = event.key.keysym.unicode;

if (count < 1 && ukey >= 49 && ukey <= 57)

{

str[count] = ukey;

str[++count] = '\0';

}

}

Draw_FillRect(surface,0,0,800,600,0x30363f);

writeText((Uint16*)L"Введите номер элемента B:",0,0);

writeText(str,520, 0);

SDL_Flip(surface);

}

screen::op_i_B=(stroka_indef*)mas[temp_i-1];

type_B=type[temp_i-1];

if(type_A==1&&type_B==1)

break;

else

{

Draw_FillRect(surface,0,0,800,600,0x30363f);

writeText((Uint16*)L"Операнды должны быть одного",0,0);

writeText((Uint16*)L"типа stroka_indef !",0,35);

SDL_Flip(surface);

while(valid)

{

if (SDL_PollEvent(&event))

{

if (event.type == SDL_QUIT || keystate[SDLK_ESCAPE])

valid = false;

if (keystate[SDLK_RETURN] )

break;

}

}

break;

}

}

}

if(v==2)

{

SDL_Flip(surface);

Uint16 str[2] = {'\0' };

int count=0;

SDL_EnableUNICODE(1);

while (valid)

{

if (SDL_PollEvent(&event))

{

if (event.type == SDL_QUIT || keystate[SDLK_ESCAPE])

{

valid = false;

return;

}

if (keystate[SDLK_RETURN] && count != 0)

{

operand_C[0]=str[0];

break;

}

if (keystate[SDLK_BACKSPACE] && count > 0)

str[--count] = '\0';

Uint16 ukey = event.key.keysym.unicode;

if (count < 1 && ((ukey >= 65 && ukey <= 90)

|| (ukey >= 97 && ukey <= 122)

|| (ukey >= 48 && ukey <= 57)||ukey=='-'||ukey=='+'||ukey=='_'||ukey==' '))

{

str[count] = ukey;

str[++count] = '\0';

}

}

Draw_FillRect(surface,0,0,800,600,0x30363f);

writeText((Uint16*)L"Введите символ:",0,0);

writeText(str,320, 0);

SDL_Flip(surface);

}

}

if(v==3)

return;

break;

}

}

}

while(valid);

}

void screen::M_2_4_2()

{

int v=1;

do

{

Draw_FillRect(surface,0,0,800,600,0x30363f);

if(v==1)

{

Draw_FillRect(surface,179,199,440,80,0xdbdde0);

Draw_FillRect(surface,179,369,440,80,0x9299a3);

}

if(v==2)

{

Draw_FillRect(surface,179,199,440,80,0x9299a3);

Draw_FillRect(surface,179,369,440,80,0xdbdde0);

}

writeText((Uint16*)L"Операнды А и B", 260, 205);

writeText((Uint16*)L"Назад", 333, 375);

SDL_Flip(surface);

while (SDL_WaitEvent(&event) && valid)

{

if (event.type == SDL_QUIT || keystate[SDLK_ESCAPE]) valid = false;

if( keystate[ SDLK_DOWN ] )

{

if(v==2)

v=1;

else

v=2;

break;

}

if( keystate[ SDLK_UP ] )

{

if(v==1)

v=2;

else

v=1;

break;

}

if (keystate[SDLK_RETURN])

{

if(v==1)

{

SDL_Flip(surface);

Uint16 str[2] = {'\0' };

int count=0;

int temp_i, type_A, type_B;

SDL_EnableUNICODE(1);

while(valid)

{

while (valid)

{

if (SDL_PollEvent(&event))

{

if (event.type == SDL_QUIT || keystate[SDLK_ESCAPE])

{

valid = false;

return;

}

if (keystate[SDLK_RETURN] && count != 0)

{

temp_i=str[0]-48;

count=0;

str[0]='\0';

if(temp_i>ColStr)

{

Draw_FillRect(surface,0,0,800,600,0x30363f);

writeText((Uint16*)L"Элемента под таким номером не существует.",0,0);

SDL_Flip(surface);

while(valid)

{

if (SDL_PollEvent(&event))

{

if (event.type == SDL_QUIT || keystate[SDLK_ESCAPE])

valid = false;

if (keystate[SDLK_RETURN] )

break;

}

}

continue;

}

else

break;

}

if (keystate[SDLK_BACKSPACE] && count > 0)

str[--count] = '\0';

Uint16 ukey = event.key.keysym.unicode;

if (count < 1 && ukey >= 49 && ukey <= 57)

{

str[count] = ukey;

str[++count] = '\0';

}

}

Draw_FillRect(surface,0,0,800,600,0x30363f);

writeText((Uint16*)L"Введите номер элемента A:",0,0);

writeText(str,520, 0);

SDL_Flip(surface);

}

screen::op_d_A=(stroka_vos*)mas[temp_i-1];

type_A=type[temp_i-1];

while (valid)

{

if (SDL_PollEvent(&event))

{

if (event.type == SDL_QUIT || keystate[SDLK_ESCAPE])

{

valid = false;

return;

}

if (keystate[SDLK_RETURN] && count != 0)

{

temp_i=str[0]-48;

count=0;

str[0]='\0';

if(temp_i>ColStr)

{

Draw_FillRect(surface,0,0,800,600,0x30363f);

writeText((Uint16*)L"Элемента под таким номером не существует.",0,0);

SDL_Flip(surface);

while(valid)

{

if (SDL_PollEvent(&event))

{

if (event.type == SDL_QUIT || keystate[SDLK_ESCAPE])

valid = false;

if (keystate[SDLK_RETURN] )

break;

}

}

continue;

}

else

break;

}

if (keystate[SDLK_BACKSPACE] && count > 0)

str[--count] = '\0';

Uint16 ukey = event.key.keysym.unicode;

if (count < 1 && ukey >= 49 && ukey <= 57)

{

str[count] = ukey;

str[++count] = '\0';

}

}

Draw_FillRect(surface,0,0,800,600,0x30363f);

writeText((Uint16*)L"Введите номер элемента B:",0,0);

writeText(str,520, 0);

SDL_Flip(surface);

}

screen::op_d_B=(stroka_vos*)mas[temp_i-1];

type_B=type[temp_i-1];

if(type_A==2&&type_B==2)

break;

else

{

Draw_FillRect(surface,0,0,800,600,0x30363f);

writeText((Uint16*)L"Операнды должны быть одного",0,0);

writeText((Uint16*)L"типа stroka_dec !",0,35);

SDL_Flip(surface);

while(valid)

{

if (SDL_PollEvent(&event))

{

if (event.type == SDL_QUIT || keystate[SDLK_ESCAPE])

valid = false;

if (keystate[SDLK_RETURN] )

break;

}

}

break;

}

}

}

if(v==2)

return;

break;

}

}

}

while(valid);

}

screen.h

#ifndef SCREEN_H_

#define SCREEN_H_

#include <SDL.h>

#include <SDL_draw.h>

#include <SDL_ttf.h>

#include "stroka.h"

#include "stroka_vos.h"

#include "stroka_indef.h"

class screen

{

public:

bool valid,NacZn;

SDL_Surface* surface,*text_surface;

TTF_Font* font;

Uint8 *keystate;

SDL_Event event;

int ColStr,type[10];

stroka** mas;

stroka_indef* op_i_A, *op_i_B;

stroka_vos* op_d_A, *op_d_B;

char operand_C[2];

screen();

~screen();

void writeText(const Uint16* text, int x, int y);

void Menu();

void M_1();

void M_1_1();

void M_1_2();

void M_2();

void M_2_1();

void M_2_2();

void M_2_3();

void M_2_4();

void M_2_4_1();

void M_2_4_2();

};

#endif

stroka.cpp

#define _CRT_SECURE_NO_WARNINGS

#include <cstring>

#include "stroka.h"

using namespace std;

int stroka::CopStr=0;

stroka::stroka()

{

len=1;

str=new char [1];

str[0]='\0';

}

stroka::stroka(const char* st)

{

len=strlen(st);

str=new char [len+1];

strcpy(str,st);

}

stroka::stroka(const Uint16* st)

{

int i;

for(i=0;st[i]!='\0';i++);

len=i;

str=new char [len+1];

for(i=0;i<=len;i++)

str[i]=st[i];

}

stroka::stroka(const char st)

{

len=1;

str=new char[2];

str[0]=st;

str[1]='\0';

}

stroka::stroka(const stroka& st)

{

CopStr++;

len=st.len;

str=new char(len+1);

strcpy(str,st.str);

}

stroka::~stroka()

{

delete [] str;

}

stroka& stroka::operator=(const stroka& st)

{

if(this==&st)

return *this;

delete [] str;

len=st.len;

str=new char[len+1];

strcpy(str,st.str);

return *this;

}

int stroka::GetLen() const //получение длины строки

{

return len;

}

char* stroka::GetStr() //получить строку

{

return str;

}

int stroka::GetCop() const //количество вызовов конструктора копирования

{

return CopStr;

}

stroka.h

#ifndef STROKA_H_

#define STROKA_H_

#include <SDL.h>

class stroka

{

protected:

int len;

char* str;

public:

stroka();

stroka(const char*);

stroka(const Uint16*);

stroka(const char);

stroka(const stroka&);

virtual ~stroka();

stroka& operator=(const stroka&);

int GetLen() const;

char* GetStr();

static int CopStr;

virtual int GetCop() const;

};

#endif

stroka_indef.cpp

#include "stroka_indef.h"

#include <cstring>

using namespace std;

int stroka_indef::CopIndef=0;

bool stroka_indef::verf() const //индентификация допустимых символов

{

int i=0;

if(!(str[i]>='A'&&str[i]<='Z'||str[i]>='a'&&str[i]<='z'||str[i]=='_'))

return false;

for(i=1;str[i]!='\0';i++)

if(!(str[i]>='0'&&str[i]<='9'||str[i]>='A'&&str[i]<='Z'||str[i]>='a'&&str[i]<='z'||str[i]=='_'))

return false;

return true;

}

int stroka_indef::pos(char c) const // поиск первого вхождения

{

if(strchr(str,c)==NULL)

return 0;

else

return strchr(str,c)-str+1;

}

bool stroka_indef::operator==(const stroka_indef& st) const //переопределение оператора ==

{

if(strcmp(str,st.str)==0)

return true;

else

return false;

}

stroka_indef::stroka_indef(const stroka_indef& st): stroka(st) //конструктор копирования

{

CopIndef++;

}

stroka_indef::stroka_indef() // если в строке есть символы противоречащие правилам, то создается пустая

//строка индентификатор

{

if(!stroka_indef::verf())

{

delete [] str;

str=new char[1];

str[0]='\0';

len=0;

}

}

stroka_indef::stroka_indef(const char* st): stroka(st)

{

if(!stroka_indef::verf())

{

delete [] str;

str=new char[1];

str[0]='\0';

len=0;

}

}

stroka_indef::stroka_indef(const char st): stroka(st)

{

if(!stroka_indef::verf())

{

delete [] str;

str=new char[1];

str[0]='\0';

len=0;

}

}

stroka_indef::stroka_indef(const Uint16* st): stroka(st)

{

if(!stroka_indef::verf())

{

delete [] str;

str=new char[1];

str[0]='\0';

len=0;

}

}

int stroka_indef::GetCop() const //количество вызовов конструктор копирования

{

return CopIndef;

}

stroka_indef& stroka_indef::operator=(const stroka_indef& st) //переопределение операции присваивания

{

if(this==&st)

return *this;

if(!st.verf())

{

delete [] str;

str=new char[1];

str[0]='\0';

len=0;

}

else

stroka::operator=(st);

return *this;

}

stroka_indef.h

#ifndef STROKA_INDEF_

#define STROKA_INDEF_

#include "stroka.h"

class stroka_indef :public stroka

{

private:

bool verf() const;

public:

static int CopIndef;

int pos(char) const;

bool operator==(const stroka_indef&) const;

stroka_indef(const stroka_indef&);

stroka_indef();

stroka_indef(const char*);

stroka_indef(const char);

stroka_indef(const Uint16*);

virtual int GetCop() const;

stroka_indef& operator=(const stroka_indef&);

};

#endif

stroka_vos.cpp

#include "stroka_vos.h"

#include <cmath>

#include <climits>

int stroka_vos::CopDec=0;

bool stroka_vos::verf() const //индентификация допустимых символов

{

if(str[0]=='\0')

return false;

else

if(str[0]!='-'&&str[0]!='+'&&!(str[0]>='0'&&str[0]<='7'))

return false;

else

if((str[0]=='-'||str[0]=='+')&&str[1]=='\0')

return false;

int i;

for(i=1;str[i]!='\0';i++)

if(str[i]<'0'||str[i]>'7')

return false;

return true;

}

int stroka_vos::GetCop() const //получить кол-во вызовов конструктора копирования

{

return CopDec;

}

stroka_vos::stroka_vos() //если не удовлетворяет индентификации то строка =0

{

if(!verf())

{

delete [] str;

str= new char[2];

str[0]='0';

str[1]='\0';

len=1;

}

}

stroka_vos::stroka_vos(const char* st):stroka(st)

{

if(!verf())

{

delete [] str;

str= new char[2];

str[0]='0';

str[1]='\0';

len=1;

}

}

stroka_vos::stroka_vos(const char st):stroka(st)

{

if(!verf())

{

delete [] str;

str= new char[2];

str[0]='0';

str[1]='\0';

len=1;

}

}

stroka_vos::stroka_vos(const stroka_vos& st):stroka(st) //конструктор копирования

{

CopDec++;

}

stroka_vos::stroka_vos(const Uint16* st):stroka(st)

{

if(!verf())

{

delete [] str;

str= new char[2];

str[0]='0';

str[1]='\0';

len=1;

}

}

bool stroka_vos::PredInt() const //можно ли представить строку в формате

{

if (int(*this) <= INT_MAX && int(*this) >= INT_MIN)

return true;

else

return false;


Подобные документы

  • Ознакомление с программой проведения сборки компьютера из деталей, имеющихся в базе данных. Рассмотрение правил создания иерархии классов. Описание основных методов и пользовательского интерфейса. Изучение системных требований и текстов основных классов.

    курсовая работа [710,2 K], добавлен 26.07.2014

  • Иерархия и типы классов в программе, особенности обеспечения наследования. Наследование по принципу подчиненности. Включение в другие классы или делегирование. Понятие изолированных классов. Конструкторы и деструкторы. Иерархия классов NET Framework.

    презентация [91,8 K], добавлен 09.12.2013

  • Реализация абстрактных методов демонстрации иерархии классов: постановка задачи, имитирующей жизнь двух племен муравьев, создание класса-родителя "муравей", определяющего методы и свойства, которые унаследуют потомки. Программное и аппаратное обеспечение.

    курсовая работа [630,0 K], добавлен 19.03.2012

  • Обзор технологии OpenStack, область ее применения. Реализация библиотеки классов. Реализация базовых классов и интерфейсов архитектуры. Создание виртуального сервера. Интеграция разработанной библиотеки классов и архитектура проектного решения.

    дипломная работа [1,0 M], добавлен 09.08.2016

  • Классы и свойства объектно-ориентированного пространства. Методика создания новых классов в delphi: выбор родительского класса, изменение существующих компонентов, создание подклассов для элементов управления windows. Создание новой ветви классов.

    контрольная работа [13,0 K], добавлен 07.07.2012

  • Разработка структуры класса "Экран курсового проектирования", которая будет основой для хранения информации о студентах, выполняющих курсовые работы. Реализация визуального приложения для тестирования иерархии классов на языке программирования С++.

    курсовая работа [3,3 M], добавлен 18.03.2011

  • Цели объектно-ориентированного программирования, абстрактные классы и адреса базовых классов, множественное и виртуальное наследование. Инициализация элементов производного класса, программный вызов конструкторов базового и производного классов.

    реферат [21,8 K], добавлен 31.10.2011

  • Структура организации графического интерфейса, объявление и создание слушателей событий с помощью анонимных классов. Представление данных для таблицы – класс AbstractTableModel. Визуализация ячеек таблицы. Два основных типа потоков ввода-вывода в Java.

    лекция [685,3 K], добавлен 01.05.2014

  • Изучение принципов объектно-ориентированного программирования. Понятие класса в Delphi, в основе которых лежат три фундаментальные принципы - инкапсуляция, наследование и полиморфизм. Разработка классов транспортных средств и структур классов (кошки).

    курсовая работа [29,7 K], добавлен 29.10.2011

  • Создание набора классов, реализующих функции генерации метаданых для заданного файла данных спутника MTSAT-1R. Существующие методы решения. Реализация алгоритма получения необходимых полей с нужными данными. Разработка структуры базы данных инвентаря.

    курсовая работа [38,6 K], добавлен 17.07.2009

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.