Код:
// ConsoleApplication68.cpp: определяет точку входа для консольного приложения.
//
#include "stdafx.h"
#include <iostream>
#include <math.h>
#include <locale.h>
class Matrix
{protected:
float **InitMatrix;
int ISizeOfMatrix;
int JSizeOfMatrix;
public:
/*ввод*/ friend std::istream &operator>>(std::istream &Stream,Matrix &a)
{
for (int NumberI = 0;NumberI<a.ISizeOfMatrix;NumberI++){
for (int NumberJ = 0;NumberJ<a.JSizeOfMatrix;NumberJ++){
std::cout<<"["<<NumberI<<"]"<<"["<<NumberJ<<"] = ";
Stream>>a.InitMatrix[NumberI][NumberJ];
}
}
std::cout<<"______________________________"<<std::endl;
return Stream;
}
/*вывод*/ friend std::ostream &operator<<(std::ostream &Stream,Matrix &a)
{
for (int NumberI = 0;NumberI<a.ISizeOfMatrix;NumberI++)
{
for (int NumberJ = 0;NumberJ<a.JSizeOfMatrix;NumberJ++)
{
std::cout<<"["<<NumberI<<"]"<<"["<<NumberJ<<"] = ";
Stream<<a.InitMatrix[NumberI][NumberJ];
}
Stream<<std::endl;
}
Stream<<"______________________________"<<std::endl;
return Stream;
}
/*конструктор*/ Matrix(int SizeI ,int SizeJ)
{
ISizeOfMatrix = SizeI;
JSizeOfMatrix = SizeJ;
InitMatrix = new float*[ISizeOfMatrix];
for (int Number = 0;Number<ISizeOfMatrix;++Number) {
InitMatrix[Number] = new float[JSizeOfMatrix];
}
}
Matrix():ISizeOfMatrix(3),JSizeOfMatrix(3)
{
InitMatrix = new float*[ISizeOfMatrix];
for (int i = 0;i<ISizeOfMatrix;i++)
{
InitMatrix[i] = new float[JSizeOfMatrix];
}
}
/*деструктор*/ ~Matrix()
{
for (int i = 0;i<ISizeOfMatrix;++i){
if (InitMatrix[i]) {
delete[] InitMatrix[i];
}
}
if (InitMatrix){
delete InitMatrix;}
}
/*+*/ Matrix &operator+(Matrix &Element)
{
if((this->ISizeOfMatrix != Element.ISizeOfMatrix) ||(this->JSizeOfMatrix != Element.JSizeOfMatrix)){
std::cout << "Different sizes" << std::endl;
return *this;}else {
Matrix &Result = *this;
for (int NumberI = 0;NumberI<this->ISizeOfMatrix; NumberI++)
{
for (int NumberJ = 0;NumberJ<this->JSizeOfMatrix;NumberJ++)
{
Result.InitMatrix[NumberI][NumberJ] += Element.InitMatrix[NumberI][NumberJ];
}
}
return Result;
}
}
/*возведение в степень*/ Matrix &operator()(int Degree)
{ std::cout<<"возведение в "<<Degree<<"степень"<<std::endl;
if (this->ISizeOfMatrix !=this->JSizeOfMatrix){
std::cout<<"матрица не квадратная значение не изменилось"<<std::endl ;
return *this;}
else
{ //вводные матрицы
float** tmp1 = new float*[ISizeOfMatrix];
float** tmp2 = new float*[ISizeOfMatrix];
float** tmp3 = new float*[ISizeOfMatrix];
//выделение матрицы
for (int I = 0;I<ISizeOfMatrix;++I) {
tmp1[I] = new float[ISizeOfMatrix];
tmp2[I] = new float[ISizeOfMatrix];
}
//приравнивание
for (int I = 0;I<ISizeOfMatrix;++I)
for (int J = 0;J<ISizeOfMatrix;++J)
tmp2[I][J] = InitMatrix[I][J];
//само возведение в степень
for (int CurrDeg = 1;CurrDeg<Degree;CurrDeg++){
tmp3 = tmp2;
tmp2 = tmp1;
tmp1 = tmp3;
for (int I = 0;I<ISizeOfMatrix;++I)
for (int J = 0;J<ISizeOfMatrix;++J) {
tmp2[I][J] = 0;
for (int K = 0;K<ISizeOfMatrix;++K)
tmp2[I][J] += tmp1[I][K]*InitMatrix[K][J];
}
}
for (int i = 0;i<ISizeOfMatrix;i++)
{
delete[] tmp1[i];
delete[] InitMatrix[i];
}
delete [] tmp1;
delete[]InitMatrix;
InitMatrix = tmp2;
return *this;
}
}
/*приравнивание*/ Matrix& operator=(Matrix &Element)
{
for (int NumberI = 0;NumberI<this->ISizeOfMatrix;NumberI++){
for (int NumberJ = 0;NumberJ<this->JSizeOfMatrix;NumberJ++)
{InitMatrix[NumberI][NumberJ] = Element.InitMatrix[NumberI][NumberJ];}}
return *this;}
/*обращение по индексу*/ float &operator()(int SizeI,int SizeJ){
return this->InitMatrix[SizeI][SizeJ];}
};
int main(int argCount , char** arguments)
{
setlocale(2,"rus");
Matrix a(3,3);
std::cout<<"матрица A"<<std::endl;
std::cin>>a;
std::cout<<a;
Matrix b(3,3);
std::cout<<"Матрица В"<<std::endl;
std::cin>>b;
std::cout<<"a(1,0)+b(1,0) =";
float q = a(1,0)+b(1,0); std::cout<<q<<std::endl;
std::cout<<a(3);
Matrix t= b+a;
std::cout<<"матрица а:"<<std::endl<<a;
std::cout<<"матрица b(a+b):"<<std::endl<<t<<std::endl<<b;
system("pause");
return 0;
}
что вообще значит это ?