Скачиваний:
1
Добавлен:
08.08.2022
Размер:
23.83 Кб
Скачать
яю/*	040=85 (0@80=B !13)

	5@53@C78BL >?5@0F8N «<=» B0:, GB>1K >=0 2>72@0I0;0 8AB8=C, 5A;8 :064K9

	M;5<5=B ?5@2>9 <0B@8FK 1K; 1K <5=LH5 8;8 @025= <0:A8<0;L=><C M;5<5=BC

	A>>B25BAB2CNI53> AB>;1F0 2B>@>9 <0B@8FK



	040=85 (0@80=B !23)

	5@53@C78BL >?5@0F8N «/=» B0:, GB>1K 2A5 M;5<5=BK ?5@2>9 

	<0B@8FK 70<5=O;8AL =0 7=0G5=85 2K@065=8O max (a(i,j), b(i,j)), 

	345 a 8 b   8AE>4=K5 <0B@8FK

*/



#include "pch.h"

#include <iostream>

#include <fstream>



// 07>2K9 :;0AA

class MatrixBase

{

	void clear();					// G8AB:0

	int bytes;						// >;8G5BA2> 109B GB>1K ?@54AB028BL <0B@8FC (:>;-2> ?0<OB8 :>B>@>5 =5>1E>4. <0B@8F5)

									// = sizeMatrix * sizeMatrix * sizeElem

public:

	

	char* arr;



	int sizeElem;						//  07<5@ M;5<5=B0 = sizeof(type)

	int sizeMatrix;						//  07<5@=>ABL <0B@8FK (NxN)



	MatrixBase(int sizeMatrix, int sizeElem);	// >=AB@C:B>@ A F5;>G8A;5==K< ?0@0<5B@>< (?0@0<5B@ 70405B @07<5@=>ABL <0B@8FK);

	MatrixBase(MatrixBase& copy);				// >=AB@C:B>@ :>?8@>20=8O 2 8=8F80;870F88;



	void readFromFile(const char* filename);									// $C=:F8O GB5=8O A D09;0

	void writeToFile(const char* filename);										// $C=:F8O 70?8A8 2 D09;

	virtual void readElem(std::istream& in, char* elem) const = 0;				// '8AB> 28@C0;L=0O DC=:F8O 22>40 

	virtual void writeElem(std::ostream& out, char* elem) const = 0;			// '8AB> 28@C0;L=0O DC=:F8O 2K2>40 



	void editElem(int, int, char*);

	virtual bool LeftLessRight(const char*, const char*) = 0;	// $C5:F<O A@02=5=8O 

	char *getMaxElemInCol(int numberCol);



	void operator/=(MatrixBase& right);

	bool operator<=(MatrixBase& right);

	MatrixBase& operator= (const MatrixBase& right);

	friend std::istream& operator>> (std::istream&, const MatrixBase& matrix);

	friend std::ostream& operator<< (std::ostream&, const MatrixBase& matrix);

	

	~MatrixBase();

};



MatrixBase::MatrixBase(int sizeMatrix, int sizeElem)

{

	this->sizeMatrix = sizeMatrix;

	this->sizeElem = sizeElem;



	bytes = sizeMatrix * sizeMatrix * sizeElem;

	arr = new char[bytes];

}



MatrixBase::MatrixBase(MatrixBase& copy)

{

	sizeElem = copy.sizeElem;

	sizeMatrix = copy.sizeMatrix;

	bytes = sizeMatrix * sizeMatrix * sizeElem;



	arr = new char[bytes];

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

		arr[i] = copy.arr[i];

}



// $C=:F8O 22>40 2 D09;

void MatrixBase::readFromFile(const char * filename)

{

	std::ifstream fin(filename);

	if (!fin.is_open()) {

		std::cout << "Houston, we have a problem with file...inputFile();" << std::endl;

		return;

	}//if



	int sizeMatrixFile;		//  07<5@ <0B@8FK A D09;0

	fin >> sizeMatrixFile;



	if (sizeMatrix != sizeMatrixFile) {

		clear(); // >G8I05< <0B@8FC 8 A>7405< =>2>3> @07<5@0	

		sizeMatrix = sizeMatrixFile;

		bytes = sizeElem * sizeMatrix * sizeMatrix;

		arr = new char[bytes];

	}//if



	int count = sizeMatrix * sizeMatrix; // >;-2> M;5<5=B>2



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

		readElem(fin, arr + i * sizeElem);



		//for (int i = 0; i < sizeMatrix; i++) {

		//	for (int j = 0; j < sizeMatrix; j++) {

		//		readElem(fin, rr + i * sizeElem * sizeMatrix + j * sizeElem);

		//	}//for j

		//}//for i

}





// K2>40 M;5<5=B 2 D09;

void MatrixBase::writeToFile(const char* filename)

{

	std::ofstream fout(filename);

	if (!fout.is_open()) {

		std::cout << "Houston, we have a problem with file...outputFile();" << std::endl;

		return;

	}//if

		

	fout << sizeMatrix << std::endl;	// '8B05< @07<5@ <0B@8FK

	for (int i = 0; i < sizeMatrix; i++){

		for (int j = 0; j < sizeMatrix; j++){

			writeElem(fout, arr + i * sizeElem * sizeMatrix  + j * sizeElem);

			fout << " ";

		}//for j

		fout << std::endl;

	}//for i

}



void MatrixBase::editElem(int i, int j, char* value)

{

	int start = i * sizeMatrix * sizeElem + j * sizeElem;	// 0E>48< =0G0;L=CN OG59:C

	for (int i = start; i < start + sizeElem; i++)			// i - =><5@ 109B0 :>B>@K9 ?5@570?8AK205<

		arr[i] = value[i - start];							// >A;54>20B5;L=>5 70<5=0 :064>3> 109B0

}





char * MatrixBase::getMaxElemInCol(int numberCol)

{

	/*

	CA:09 sizeElem = 4

	CABL ! AB>;1F0 = 1



	00	04	08		45AL sizeMatrix = 3

	12	16	20		n - 2K1@0==K9 AB>;15F

	24	28	32		2865=85 ?> AB>;1FC: (arr + n*sizeElem +i*sizeElem*sizeMatrix)



	i = 0: 00 + 1*4 + 0 = 4

	i = 1: 00 + 1*4 + 1*3*4 = 0 + 4 + 12 = 16

	i = 2: 00 + 1*4 + 2*3*4 = 0 + 4 + 24 = 28



	$>@<C;0 @01>B05B!

	f = arr + n*sizeElem +i*sizeElem*sizeMatrix

	*/

	int f;



	// !>7405< 2@5<5==CN ?5@5<5==CN

	char* max = new char[sizeElem];



	// @54?>;>68<, GB> <0:A8<0;L=K9 M;5<5=B =0E>48BAO =0 1>9 AB@>:5 n'=>< AB>;1F5.

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

		max[i] = arr[i + numberCol * sizeElem];



	// "5305<" ?> M;5<5=B0< AB@>:8

	for (int i = 0; i < sizeMatrix; i++){

		// f - D>@<C;0 4;O 42865=8O ?> AB>;1FC, :>B>@0O 1K;0 2K2545=0 @0==55.

		f = numberCol * sizeElem + i * sizeElem * sizeMatrix; 



		if (LeftLessRight(max, arr + f)) { // 5A;8 <0:A8<0;L=K9 M;-B < A;54CNI89 ?> AB>;1FC 

			for (int k = 0; k < sizeElem; k++) // <0:A8<0;L=K< M;-B>< AB0=>28BAO A;54CNI89 2 AB>;1F5

				max[k] = arr[k + f];

		}//if

	}//for i



	return max;

}



void MatrixBase::clear()

{

	delete arr;

}



/*

	040=85 (0@80=B !23)

	5@53@C78BL >?5@0F8N «/=» B0:, GB>1K 2A5 M;5<5=BK ?5@2>9

	<0B@8FK 70<5=O;8AL =0 7=0G5=85 2K@065=8O max (a(i,j), b(i,j)),

	345 a 8 b   8AE>4=K5 <0B@8FK

*/

void MatrixBase::operator/=(MatrixBase & right)

{

	// left /= right

	// "5305<" ?> F8:;C A H03>< @07<5@0 M;5<5=B0 sizeElem

	for (int i = 0; i < bytes; i += sizeElem) {

		if (LeftLessRight(arr + i, right.arr + i)) { // 5A;8 M;-B <0B@8FK left < M;-B0 <0B@8FK right 

			for (int k = 0; k < sizeElem; k++)		 // 4>102;O5< =081>;LH89 M;-B (c right)

				arr[i + k] = right.arr[i + k];

		}//if

	}//for i

}



/*

	0@80=B !13

	5@53@C78BL >?5@0F8N «<=» B0:, GB>1K >=0 2>72@0I0;0 8AB8=C, 5A;8 :064K9

	M;5<5=B ?5@2>9 <0B@8FK 1K; 1K <5=LH5 8;8 @025= <0:A8<0;L=><C M;5<5=BC

	A>>B25BAB2CNI53> AB>;1F0 2B>@>9 <0B@8FK

*/

bool MatrixBase::operator<=(MatrixBase & right)

{

	int currentCol; // B5:CI89 AB>;15F

	bool result = true;

	// "5305<" ?> F8:;C A H03>< @07<5@0 M;5<5=B0 sizeElem

	for (int i = 0; i < bytes; i += sizeElem) {

		currentCol = (i / sizeElem) % sizeMatrix;

		// A;8 ACI5AB2C5B M;5<5=B, :>B>@K9 1>;LH5 <0:A8<0;L=>3> M;-B0

		// 5A;8 (<0:A8<C< 2 AB>;1F5 < B5:CI89 M;5<5=B)

		if (LeftLessRight(right.getMaxElemInCol(currentCol), arr + i)) {  

			return false;													

		}//if

	}//for i

	return result;

}



MatrixBase& MatrixBase::operator= (const MatrixBase& right)

{

	// >?8@C5< A0<>3> A51O? - A@07C 2KE>48<.

	if (this == &right)

		return *this;



	if (sizeMatrix != right.sizeMatrix){		// 5A;8 @07<5@K =5 @02=K, B> >G8I05< this 8 70405< 59 =>2K9 @07<5@.

		clear();

		sizeMatrix = right.sizeMatrix;

		sizeElem = right.sizeElem;

		bytes = sizeElem * sizeMatrix * sizeMatrix;

		arr = new char[bytes];

	}//for



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

		arr[i] = right.arr[i];



	return *this;

}



std::istream& operator>> (std::istream& in, const MatrixBase& matrix)

{

	int count = matrix.sizeMatrix * matrix.sizeMatrix;

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

		matrix.readElem(in, matrix.arr + i * matrix.sizeElem);

	return in;

}



std::ostream& operator<< (std::ostream& out, const MatrixBase& matrix)

{

	for (int i = 0; i < matrix.sizeMatrix; i++){

		for (int j = 0; j < matrix.sizeMatrix; j++){

			matrix.writeElem(out, matrix.arr + i * matrix.sizeMatrix * matrix.sizeElem + j * matrix.sizeElem);

			out << " ";

		}//for j

		out << std::endl;

	}//for i

	return out;

}



MatrixBase::~MatrixBase()

{

	clear();

}





class floatMatrix : public MatrixBase

{

	void readElem(std::istream&, char*) const override;

	void writeElem(std::ostream&, char*) const override;



public:

	floatMatrix(int sizeMatrix);

	bool LeftLessRight(const char* left, const char* right);

};



floatMatrix::floatMatrix(int sizeMatrix) : MatrixBase(sizeMatrix, sizeof(float))

{

	std::cin >> *this;

}



bool floatMatrix::LeftLessRight(const char* left, const char* right)

{

	return *(float*)(left) < *(float*)(right);

}



void floatMatrix::readElem(std::istream& in, char* elem) const

{

	in >> *(float*)(elem);

}



void floatMatrix::writeElem(std::ostream& out, char* elem) const

{

	out << *(float*)(elem);

}





class intMatrix : public MatrixBase

{

	void readElem(std::istream&, char*) const override;

	void writeElem(std::ostream&, char*) const override;



public:

	intMatrix(int);

	bool LeftLessRight(const char* left, const char* right);

};



intMatrix::intMatrix(int sizeMatrix) : MatrixBase(sizeMatrix, sizeof(int))

{

	std::cin >> *this;

}



bool intMatrix::LeftLessRight(const char* left, const char* right)

{

	return *(int*)(left) <= *(int*)(right);

}



void intMatrix::readElem(std::istream& in, char* elem) const

{

	in >> *(int*)(elem);

}



void intMatrix::writeElem(std::ostream& out, char* elem) const

{

	out << *(int*)(elem);

}



int main()

{



	//-------------------=8F80;870F8O 8 107>2K9 8=AB@C<5=B0;-------------------//

	int n;

	std::cout << "Write the dimension of matrix A: ";

	std::cin >> n;



	floatMatrix A(n);

	std::cout << "A: " << std::endl << A;



	floatMatrix B(A);

	std::cout << "matrix B (copy constructor): " << std::endl << B;



	A = B;

	//std::cout << "matrix B (B = A): " << std::endl << B;



	float temp = 231.01;

	A.editElem(0, 0, (char*)&temp);

	std::cout << "Fill elem with coords A[0][0]: " << std::endl << A;



	//-------------------=8F80;870F8O ! + ?@>25@:0 B <= C (040=85 !13)-------------------//

	/*	040=85 (0@80=B !13)

		5@53@C78BL >?5@0F8N «<=» B0:, GB>1K >=0 2>72@0I0;0 8AB8=C, 5A;8 :064K9

		M;5<5=B ?5@2>9 <0B@8FK 1K; 1K <5=LH5 8;8 @025= <0:A8<0;L=><C M;5<5=BC

		A>>B25BAB2CNI53> AB>;1F0 2B>@>9 <0B@8FK

	*/



	std::cout << "matrix C(" << n << "):\n";

	floatMatrix C(n);

	std::cout << "C: " << std::endl << C;



	bool result = (B <= C);



	std::cout << "C" << std::endl;

	std::cout << C;

	std::cout << "B" << std::endl;

	std::cout << B;

	std::cout << "\nresult (B<=C): " << result;



	/*  07>1@0=K ?@8<5@K

	  B

	13 9   <=   10 11 = 0   ;   1 <= 1 = 1	  ;		1 2  <=  1 30 = 1

	8  7		12 14		;				  ;		2 4		 20 1

	*/



	//-------------------=8F80;870F8O ! + ?@>25@:0 B /= C (040=85 !23)-------------------//

	/*	040=85 (0@80=B !23)

		5@53@C78BL >?5@0F8N «/=» B0:, GB>1K 2A5 M;5<5=BK ?5@2>9 

		<0B@8FK 70<5=O;8AL =0 7=0G5=85 2K@065=8O max (a(i,j), b(i,j)), 

		345 a 8 b   8AE>4=K5 <0B@8FK

	*/

	

	B /= C;

	std::cout << "\n\nC" << std::endl;

	std::cout << C;

	std::cout << "B" << std::endl;

	std::cout << B;

	std::cout << "\nresult (B /= C): \n" << B;



	/*  07>1@0=K ?@8<5@K

	1 2 3		9 8 7					9 8 7

	4 5 6   /=  6 5 4     =0 2KE>45		6 5 6

	7 8 9	    3 2 1					7 8 9

	*/

	

	//------------------- 01>B0 A D09;0<8-------------------//

	B.writeToFile("file.txt");

	std::cout << "\nMatrix B is saved to the file: ";

	B.readFromFile("file.txt");

	std::cout << "\nMatrix B from file: ";

	std::cout << "B" << std::endl;

	std::cout << B;

	return 0;

}





// 0?CA: ?@>3@0<<K: CTRL+F5 8;8 <5=N "B;04:0" > "0?CA: 157 >B;04:8"

// B;04:0 ?@>3@0<<K: F5 8;8 <5=N "B;04:0" > "0?CAB8BL >B;04:C"



// !>25BK ?> =0G0;C @01>BK 

//   1.  >:=5 >1>7@520B5;O @5H5=89 <>6=> 4>102;OBL D09;K 8 C?@02;OBL 8<8.

//   2.  >:=5 Team Explorer <>6=> ?>4:;NG8BLAO : A8AB5<5 C?@02;5=8O 25@A8O<8.

//   3.  >:=5 "KE>4=K5 40==K5" <>6=> ?@>A<0B@820BL 2KE>4=K5 40==K5 A1>@:8 8 4@C385 A>>1I5=8O.

//   4.  >:=5 "!?8A>: >H81>:" <>6=> ?@>A<0B@820BL >H81:8.

//   5. >A;54>20B5;L=> 2K15@8B5 ?C=:BK <5=N "@>5:B" > ">1028BL =>2K9 M;5<5=B", GB>1K A>740BL D09;K :>40, 8;8 "@>5:B" > ">1028BL ACI5AB2CNI89 M;5<5=B", GB>1K 4>1028BL 2 ?@>5:B ACI5AB2CNI85 D09;K :>40.

//   6. 'B>1K A=>20 >B:@KBL MB>B ?@>5:B ?>765, 2K15@8B5 ?C=:BK <5=N "$09;" > "B:@KBL" > "@>5:B" 8 2K15@8B5 SLN-D09;.

Соседние файлы в папке УТС 5 семестр