![](/user_photo/15541_yCabg.jpg)
Добавил:
sergey123
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:ООП / ООП / oop-ekz-tasks / Matrix Arr2D (2 семинар)
.txtСеминар 2 «Классы: доступ, конструкторы и деструктор»
Создать класс Arr2D для работы с двумерным массивом.
Указания.
1. Обеспечить интерфейс класса через конструктор(ы), конструктор(ы) копии, методы Set и Get, метод IsDiagonal.
2. Массив хранить в одномерном динамическом массиве типа int. Для адресации элемента использовать 2 индекса и преобразовывать их к одномерному индексу.
3. Обеспечить работу следующего программного кода:
Arr2D a(),//массив 5х5, элементы нулевые
b(a),//массив - копия a
c("99 2 3 4 5 6 7 8 9"),// массив 3х3, преобразовать из строки в 9 целых
d("1z 20 30 40"); // выброс и обработка исключения (1z - не целое число)
if (!c.IsDiagonal()) c.Set(1); //если не диагональная матрица, то сделать диагональной
с.Set(0); //обнулить элементы
int m=a.Get(1,0); // доступ к элементу
c.Set(2,2,a.Get(1,1)); //установка значения элемента
4. Написать собственную функцию преобразования строки в целые числа (для матрицы "c" в примере), использовать для внутренних нужд класса.
5. В функции преобразования строки использовать механизм throw при возникновении ошибки преобразования.
#include "stdafx.h"
#include "string.h"
#include <iostream>
#include "math.h"
using namespace std;
class Arr2D
{
private:
int dim;
int * arr;
public:
//------------------------ Конструктор ---------------------
Arr2D ( int d = 5, int p = 0 )
{
dim = d;
arr = new int [dim*dim];
for ( int i=0; i<(dim*dim); i++ )
arr[i] = p;
}
//---------------------- Конструктор копирования -----------
Arr2D ( Arr2D& m )
{
dim = m.dim;
arr = new int [dim*dim];
for ( int i=0; i<(dim*dim); i++ )
arr[i] = m.arr[i];
}
//------------------ Конструктор преобразования ------------
Arr2D ( char * s )
{
dim = sqrt( double((strlen(s)+1) / 2) );
arr = new int [dim*dim];
for ( int i = 0; i < strlen(s) + 1; i+=2 )
{
if ((i%2 == 1)&&(s[i] != ' '))
throw "Line is incorrect. Errorcode is 1.";
else
{
if ( (int(s[i]) < 48) || (int(s[i]) > 57) )
throw "Line is incorrect. Errorcode is 2.";
else
arr[i/2] = int(s[i]) - 48;
}
}
}
//---------- Деструктор -------------------------------------
~Arr2D()
{
delete [] arr;
}
//--------- Метод установки всех элементов равными m --------
void Set ( int m )
{
for ( int i=0; i<(dim*dim); i++ )
arr[i] = m;
}
//---- Метод установки элемента с адресом (x,y) равным m ----
void Set ( int x, int y, int value )
{
int n;
n = ( x - 1 ) * dim + y - 1; // формула, полученная путем длительного мозгового штурма и теоретического вывода
arr[n] = value;
}
//--------- Метод получения значения по адресу ячейки --------
int Get ( int x, int y )
{
if ( (x < 1) || (x >= dim) || (y < 1) || (y >= dim) )
{
cout<<"Error.";
return 1;
}
int n;
n = ( x - 1 ) * dim + y - 1;
return arr[n];
}
//---------- Метод проверки на диагональность ----------------
bool IsDiagonal()
{
int n, s=0;
for ( int i = 0; i<dim; i++ )
{
n = i*(dim+1);
if ( arr[n] != 1 )
return 0;
}
for( int i = 0; i <dim*dim; i++)
{
if( (arr[i]!=0) && (arr[i]!=1) )
return 0;
s += arr[i];
}
if ( s != dim )
return 0;
else return 1;
}
//--------- Вывод значений а экран ---------
void OutPut()
{
for( int i = 0; i < dim; i++ )
{
for ( int j = i*dim; j < (i+1)*dim; j ++)
cout<<arr[j];
cout<<endl;
}
}
};
int _tmain(int argc, _TCHAR* argv[])
{
try{
Arr2D x, y(3, 5), f(3,0), x2(x);
Arr2D z("1 3 4 2 1 9 4 7 8");
f.Set(1,1,1);
f.Set(2,2,1);
f.Set(3,3,1);
cout<<endl;
f.OutPut();
if(f.IsDiagonal())
cout<<"f is diagonal"<<endl;
cout<<endl;
cout<<endl;
x.OutPut();
cout<<endl;
cout<<endl;
x2.OutPut();
cout<<endl;
cout<<endl;
y.OutPut();
cout<<endl;
x.Set(1,1,8);
cout<<x.Get(1,1)<<endl;
if(!x.IsDiagonal())
cout<<"Not a diagonal"<<endl;
x.OutPut();
z.OutPut();
cout<<endl;
}
catch (char *er){
cout<<er<<endl;}
getchar();
return 0;
}
Соседние файлы в папке oop-ekz-tasks