Листинг класса пользовательских ошибок
#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++;
}
}
};
-
Задачу реализовать как класс контейнера и итератора
Пример выполнения программы:
Листинг программы:
#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();
}
}