Вычисления значений матрицы - VB
Формулировка задачи:
пытался написать прогр по вычислению матрицы(в итоге завис на 4ч и разрядилась аккум). нужна помощь
а именно - Написать программу для вычисления значений матрицы С
A(4,4)
B(4,4) K=SG(A) L=MAXG(B))
С=(K*B *A)+L*A^2 сама формула
Также Ввод, вывод, умножение матрицы на константу
перемножение матриц желательно оформить с использованием подпрограмм
правильность вычисления проверять с помощью этих матриц
Решение задачи: «Вычисления значений матрицы»
textual
Листинг программы
#ifndef MATRIX_H
#define MATRIX_H
class Matrix
{
int n,m;
double **array;
public:
Matrix(int z,int x);//---котструктор с параметрами, z и x размеры матрицы
Matrix();//--- контсруктор по умолчанию
Matrix(Matrix & A);//--конструктор копирования
~Matrix(void);//---деструктор
void OutMatrix(void);//---вывод матрицы на экран
void EnterMatrix(void);//---ввод матрицы
void SerchAkstrem(void); //---поиск эксремумов и их строки
void Polindrom(void); //---поиск чисел полиндромов
//-----перегрузка операторов----
Matrix&operator=(Matrix &a); //---оператор =
Matrix operator+(Matrix &a);//---оператор +
Matrix operator-(Matrix &a);//---оператор -
Matrix operator*(double a);//---оператор *a
Matrix operator/(double a);//---оператор /a
Matrix operator*(Matrix & a);//---оператор Matrix*Matrix
Matrix Transponiring(void);//---транспонирование матрицы
double SkPrOnVek(Matrix b);//---сколярное произведение 2х векторов doublel Matrix1(Matrix2)
Matrix operator-(void);//---внесение минуса в матрицу (*(-1))
double Determinant3x3max(void);//---детерминант матрицы. 3х3-максимальный рамер матрицы
};
#endif;
#include "Matrix.h"
#include <conio.h>
#include <iostream>
#include <math.h>
using namespace std;
//---конструктор с параметрами---
Matrix::Matrix(int z,int x)
{
cout<<"constructor\n";
n=z;m=x;
array=new double*[n];
for(int i=0;i<n;i++)
array[i]=new double[m];
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
array[i][j]=0;
};
//---конструктор по умолчанию---
Matrix::Matrix()
{
n=0;m=0;
array[0][0]=0;
printf("\n\nOpen construct without parametr!") ;
};
//---конструктор копирования---
Matrix::Matrix(Matrix & A)
{
cout<<"copi"<<endl;
n=A.n;m=A.m;
array=new double*[n];
for(int i=0;i<n;i++)
array[i]=new double[m];
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
array[i][j]=A.array[i][j];
};
//---деструктор---
Matrix::~Matrix()
{
cout<<"destruct \n";
delete array;
};
//---вывод матрицы на экран---
void Matrix::OutMatrix()
{
cout<<"\n\n matrix =" ;
for(int i=0;i<n;i++)
{
printf("\n");
for(int j=0;j<m;j++)
printf(" %lf ", array[i][j]);
};
};
//---ввод матрицы---
void Matrix::EnterMatrix()
{
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
scanf("%lf",&array[i][j]);
};
double Matrix::SkPrOnVek(Matrix a)
{
double s=0;
if(n==a.n&&m==a.m)
{
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
s=s+array[i][j]*a.array[i][j];
}
return s;
};
//---поиск экстремумов---
void Matrix::SerchAkstrem(void)
{
int nMax=0,nMin=0;
OutMatrix();
double min=array[0][0],max=array[0][0];
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
{
if(array[i][j]<min)
{
min=array[i][j];
nMin=i;
}
if(array[i][j]>max)
{
max=array[i][j];
nMax=i;
}
}
printf("\n\nMin= %Lf in %d string",min,nMin+1);
printf("\nMax= %Lf in %d string",max,nMax+1);
};
//---поиск чисел полиндромов---
void Matrix::Polindrom()
{
int k=0;
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
{
double p=array[i][j];
if(((int)fmod(p,10)==(int)(p/10))||((int)fmod(p,10)==(int)(p/100)))
k++;
}
printf("\n\nNamber polindrom = %d",k);
};
//---перегрузка оператора "="---
Matrix & Matrix::operator=(Matrix & a)
{
n=a.n;m=a.m;
if(n==a.n&&m==a.m)
{
if(this==&a) return *this;
for(int j=0;j<n;j++)
for(int i=0;i<m;i++)
array[j][i]=a.array[j][i];
cout<<"operator ="<<endl;
return *this;
}
else
{
printf("Can nnot do operator =. Becouse past operator Error(+-*/)\n");
return *this;
}
};
//---перегрузка оператора "+"---
Matrix Matrix::operator+(Matrix & a)
{
if(n==a.n&&m==a.m)
{
Matrix t=a;
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
t.array[i][j]=array[i][j]+a.array[i][j];
cout<<"operator +"<<endl;
return t;
}
else
{
Matrix t(0,0);
printf("\n Can not do operator +. Gabarits!!!");
return t;
}
};
//---перегрузка оператора "-"---
Matrix Matrix::operator-(Matrix & a)
{
if(n==a.n&&m==a.m)
{
Matrix t=a;
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
t.array[i][j]=array[i][j]-a.array[i][j];
cout<<"operator -"<<endl;
return t;
}
else
{
Matrix t(0,0);
printf("\n Can not do operator -. Gabarits!!!");
return t;
}
};
//---перегрузка оператора "* на число"---
Matrix Matrix::operator*(double a)
{
cout<<"operator *\n";
Matrix t(n,m);
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
t.array[i][j]=array[i][j]*a;
return t;
};
//---перегрузка оператора "/ на число"---
Matrix Matrix::operator/(double a)
{
cout<<"operator /\n";
Matrix t(n,m);
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
t.array[i][j]=array[i][j]/a;
return t;
};
//---транспонирование матрицы---
Matrix Matrix::Transponiring(void)
{
Matrix t(m,n);
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
t.array[j][i]=array[i][j];
return t;
};
//---перегрузка оператора "* Matrix на Matrix"---
Matrix Matrix::operator*(Matrix & a)
{
Matrix t(n,a.m);
if(m==a.n)
{
for(int x=0;x<a.m;x++)
{
for(int i=0;i<m;i++)
{
for(int j=0;j<m;j++)
{
t.array[i][x]=t.array[i][x]+array[i][j]*a.array[j][x];
}
}
}
cout<<"\noperator Matrix*Matrix\n";
}
else
{
printf("\n Can not do operator *. Gabarits!!!");
}
return t;
};
Matrix Matrix::operator-(void)
{
return *this*(-1);
};
//---детерминант матрицы. 3х3-максимальный рамер матрицы---
double Matrix::Determinant3x3max(void)
{
double x=0;
if(n==m)
{
if(n==1)
x=array[0][0];
if(n==2)
x=array[0][0]*array[1][1]-array[0][1]*array[1][0];
if(n==3)
{
x=array[0][0]*array[1][1]*array[2][2]+array[0][1]*array[1][2]*array[2][0]+array[1][0]*array[2][1]*array[0][2]-
array[0][2]*array[1][1]*array[2][0]-array[1][2]*array[2][1]*array[0][0]-array[1][0]*array[0][1]*array[2][2];
}
if(n>3)
{
printf("\n Can not serch determinant. Gabarits > 3x3!!!");
x=-666;
}
}
else
{
printf("\n Can not serch determinant. Gabarits!!!");
x=-666;
}
return x;
};