Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

ООП / ООП / oop-ekz-tasks / Matrix Arr2D (2 семинар)

.txt
Скачиваний:
12
Добавлен:
18.02.2017
Размер:
4.15 Кб
Скачать
Семинар 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