Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Контрольнаая ООП.doc
Скачиваний:
20
Добавлен:
01.04.2014
Размер:
424.96 Кб
Скачать

Листинг класса пользовательских ошибок

#include <iostream.h>

//Класс пользовательских ошибок

class myExceptions

{

public:

//Класс ошибки распределения памяти

class xMemoryAllocationError

{

public:

void Print()

{

cout <<"!!!--->Error: Memory Allocation!<---!!!\n";

}

};

//Класс ошибки открытия файла для чтения

class xNotOpenedForReading

{

public:

void Print()

{

cout <<"!!!--->Cannot open a file for reading!<---!!!\n";

}

};

//Класс ошибки открытия файла для записи

class xNotOpenedForWriting

{

public:

void Print()

{

cout <<"!!!--->Cannot open a file for writing!<---!!!\n";

}

};

//Класс ошибки ввода числа

class xNotANumber

{

public:

void Print()

{

cout <<"!!!--->Is not a number!<---!!!\n";

}

};

//Класс ошибки чтения данных из файла (прочтенное имеет не подходящий формат)

class xNotAnAnimal

{

public:

void Print()

{

cout <<"!!!--->Is not an animal! ERROR of reading file!<---!!!\n";

}

};

//Класс ошибки выхода за границы массива

class xOutOfRange

{

public:

void Print()

{

cout <<"!!!--->Index of Array is Out Of Range!<---!!!\n";

}

};

};

//Класс проверочный - содержит методы для проверки условия

class cheker

{

public:

//Вспомогательная функция, осуществляет проверку правильности ввода пользователем целого числа

static void isIntegerNumber(char* _Buf)

{

char* Buf = _Buf;

while(*Buf)

{

if(!(((*Buf) >= '0' && (*Buf) <= '9') || (*Buf) == '-'))

throw myExceptions::xNotANumber();

Buf++;

}

}

//Вспомогательная функция, осуществляет проверку правильности ввода пользователем вещественного числа

static void isDoubleNumber(char* _Buf)

{

char* Buf = _Buf;

while(*Buf)

{

if(!(((*Buf) >= '0' && (*Buf) <= '9') || (*Buf) == '-'||(*Buf) == '.'))

throw myExceptions::xNotANumber();

Buf++;

}

}

};

  1. Задачу реализовать как класс контейнера и итератора

Пример выполнения программы:

Листинг программы:

#include <iostream.h>

#include <stdlib.h>

#include "myExceptions.cpp"

template<typename TYPE>

//Шаблон класса Vector

class Vector

{

public:

//шаблон класса итератор

template<typename TYPE> class Iterator

{

public:

TYPE* nodePtr;

public:

//Конструктор шаблона класса итератор

Iterator<TYPE>::Iterator(TYPE* node = NULL)

{

nodePtr = node;

}

//Перегрузка оператора инкремента в постфиксной форме

Iterator<TYPE>& operator ++()

{

if(nodePtr)

nodePtr = nodePtr++;

return *this;

}

//Перегрузка оператора инкремента в префиксной форме

Iterator<TYPE>& operator ++(int t )

{

if(nodePtr)

nodePtr = nodePtr++;

return *this;

}

//Перегрузка оператора декремента в постфиксной форме

Iterator<TYPE>& operator --()

{

if(nodePtr)

nodePtr = nodePtr--;

return *this;

}

//Перегрузка оператора декремента в префиксной форме

Iterator<TYPE>& operator --(int t )

{

if(nodePtr)

nodePtr = nodePtr--;

return *this;

}

//Перегрузка оператора разыменования

TYPE operator *()

{

if(nodePtr)

return *nodePtr;

return TYPE();

}

};

private:

//Данные - поля

TYPE * arrayNode;//Хранит массив элементов

int lenght;//Хранит длину массива

public:

//Конструкторы

Vector()

{

arrayNode = new TYPE [1] ;

lenght = 0;

}

Vector(int l)

{

arrayNode = new TYPE [len];

lenght = len;

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

arrayNode[i] = 0;

}

//Деструктор

~Vector()

{

if(arrayNode)

delete arrayNode;

}

//Метод доступа к длине массива

int GetLenght()

{

return lenght;

}

//Метод добавления элемента в массив

Vector * Add(TYPE Data)

{

try

{

int len = this->lenght +1;

TYPE * arrayNodeNew = new TYPE[len] ;

for (int i=0; i<this->lenght; i++)

arrayNodeNew[i]=this->arrayNode[i];

arrayNodeNew[this->lenght]=Data;

if(!arrayNodeNew) throw myExceptions::xMemoryAllocationError();

delete arrayNode;

arrayNode = new TYPE[len];

for (int j=0; j<len; j++)

this->arrayNode[j]=arrayNodeNew[j];

lenght=len;

return this;

}

catch (myExceptions::xMemoryAllocationError memAll)

{

memAll.Print();

}

return NULL;

}

//Перегруженный оператор <<

friend ostream & operator << (ostream &, Vector<TYPE> &);

//Метод для получения ссылки к первому доступному узлу

Iterator<TYPE> begin()

{

return Iterator<TYPE>(arrayNode);

}

//Метод для удаления максимального элемента из массива

bool Delete()

{

int num=0; //Для хранения индекса максимального элемента

for (int i=0; i<this->lenght; i++)

if (arrayNode[i]>arrayNode[num]) num=i;

try

{

int j=0;

int len = this->lenght -1;

TYPE * arrayNodeNew = new TYPE[len] ;

if(!arrayNodeNew)

throw myExceptions::xMemoryAllocationError();

//Циклы для копирования элементов, кроме максимального из текущего массива в новый

for (int i=0; i<num; i++,j++)

arrayNodeNew[j]=this->arrayNode[i];

for (int q=num+1; q<this->lenght; q++,j++)

arrayNodeNew[j]=this->arrayNode[q];

//переопределение текущего массива

delete arrayNode;

arrayNode = new TYPE[len];

this->lenght=len;

if(!arrayNode)

throw myExceptions::xMemoryAllocationError();

//Перезапись элементов в текущий массив

for (int t=0; t<len; t++)

this->arrayNode[t]=arrayNodeNew[t];

return true;

}

//Ошибка будет перехвачена, если не выделилась память под массив (память занята)

catch (myExceptions::xMemoryAllocationError memAll)

{

memAll.Print();

}

return false;

}

};

void main()

{

//Создание массива целых чисел

Vector <int> intVec;

int val;

char buffer[32];

//cin.ignore();

//Цикл добавления элементов в массив

for(;;)

{

try

{

cout<<"What integer value to Vector? (character to stop): ";

cin.getline(buffer,32);

cheker::isIntegerNumber(buffer);

val = atoi(buffer);

intVec.Add(val);

}

catch (myExceptions::xNotANumber notNum)

{

notNum.Print();

break;

}

}

//Вывод массива

cout<<"\nVector of integer numbers:\n";

cout<<intVec;

cout<<endl;

//Удаление из массива максимального элемента

intVec.Delete();

//Вывод массива

cout<<"\nVector of integer numbers after deleting Max element:\n";

cout<<intVec;

cout<<endl;

//Объявление итератора

Vector<int>::Iterator<int> it;

int t=0,t1;

//Проверка правильности работы итератора - попытка вывода элементов по индексу

cout<<"Enter index of element, which you want to be printed: ";

cin>>t1;

try

{

if (t1>=intVec.GetLenght() || t<0)

throw myExceptions::xOutOfRange();

for (it=intVec.begin();t<t1;it++,t++);

cout<<"Element on ["<<t<<"] place: "<<*it<<"\n";

it--;

t--;

if (t<intVec.GetLenght() && t>=0)

cout<<"Element from left of them on place ["<<t<<"] and it is a "<<*it<<"\n";

else

throw myExceptions::xOutOfRange();

it++;

t++;

it++;

t++;

if (t<intVec.GetLenght() && t>=0)

cout<<"Element from right of them on place ["<<t<<"] and it is a "<<*it<<"\n";

else

throw myExceptions::xOutOfRange();

}

//Ошибка перехватится, если в процессе работы индекс элемента массива вышел за границы

//допустимого диапазона

catch (myExceptions::xOutOfRange indOut)

{

indOut.Print();

}

}