• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

Программа с матрицами

  • Автор темы koka278
  • Дата начала
K

koka278

Здравствуйте, помогите пожалуйста дописать. Нужно было реализовать в виде модуля, программку, которая выполняет действия над квадратными матрицами:
1) нахождение определителя матрицы
2) сложение 2х матриц
3) умножение 2х матриц
4) транспонирование матрицы

Как не пробывал, но что-то 2,3,4 не получается
вот что уже написал:
C++:
#include <iostream.h> 
#include <math.h> 
#include <windows.h>


char FileName[256];
char Stroka[100];
char RusText[100];
char *slovo;

double **Matrix,**Matrix2,Osndet;
int i,j,N=0;
double Determinant()
{
int maxl,k;
double del, det=1,d;

//приведение матрицы к треугольному виду
for(k=0;k<N-1;k++)
{			  
maxl=k;
for(i=k+1;i<N;i++)
{
if(abs(Matrix[i][k])>abs(Matrix[k][k]))
{
maxl=i;
}
}
if(maxl!=k)//если максимальный элемент не на диагонали, тогда переставляем строки с учетом изменения определителя
{
det=det*(-1);
for(j=0;j<N;j++)
{
d=Matrix[k][j];
Matrix[k][j]=Matrix[maxl][j];
Matrix[maxl][j]=d;
}
}
if(Matrix[k][k]!=0)
{
for(i=k+1;i<N;i++)
{
del=Matrix[i][k]/Matrix[k][k];
for(j=0;j<N;j++)
{
Matrix[i][j]=Matrix[i][j]-del*Matrix[k][j];//вычитание верхней строки от нижних
}

}
}
else
{
return 0;
}
}
//вычисление определителя путем премножения диагональных элементов
for(i=0;i<N;i++)
det*=Matrix[i][i];	 
return det;
}


main()
{
char RusMatrVvd[20],RusMatrStr[15],RusMatrStlb[15];
CharToOem("Введите элемент ",RusMatrVvd);
CharToOem("-ой стоки ",RusMatrStr);
CharToOem("-ого столбца: ",RusMatrStlb);
CharToOem("Введите размерность квадратной матрицы : ",RusText);				 
cout<<RusText;
cin>>N;
Matrix=new double*[N];			 
for(i=0;i<N;i++)				
{	  
Matrix[i]=new double[N];
for(j=0;j<N;j++)
{
cout<<RusMatrVvd<<i+1<<RusMatrStr<<j+1<<RusMatrStlb;
cin>>Matrix[i][j];
}
}

CharToOem("Исходная матрица:",RusText);
cout<<endl<<RusText<<endl;
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
cout<<Matrix[i][j]<<"\t";
}
cout<<endl;
}

CharToOem("Что делать? ",RusText);					 
cout<<endl<<RusText<<endl;
CharToOem("1 - Вычисление определителя матрицы",RusText);
cout<<endl<<RusText<<endl;
CharToOem("2 - Сложение двух матриц ",RusText);
cout<<endl<<RusText<<endl;
CharToOem("3 - Умножение одной матрицы на другую ",RusText);
cout<<endl<<RusText<<endl;
CharToOem("4 - Нахождение транспонированной матрицы ",RusText);
cout<<endl<<RusText<<endl<<endl;
int vop1;
cin>>vop1;
switch(vop1)
{
case 1:
{
Osndet = Determinant();
CharToOem("Определитель равен: ",RusText);
cout<<endl<<RusText<<Osndet<<endl;
break;
}

case 2:
{
CharToOem("Введите элементы второй матрицы : ",RusText);		
cout<<RusText<<endl;
Matrix2=new double*[N];			 
for(i=0;i<N;i++)			
{	  
Matrix2[i]=new double[N];
for(j=0;j<N;j++)
{
cout<<RusMatrVvd<<i+1<<RusMatrStr<<j+1<<RusMatrStlb;
cin>>Matrix2[i][j];
}
}

CharToOem("Вторая матрица:",RusText);
cout<<endl<<RusText<<endl;
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
cout<<Matrix2[i][j]<<"\t";
}
cout<<endl;
}
//дальше не знаю как сложить
}
break;
}
case 3:
{
//помогите умножить

case 4:
{
//помогите найти транспонированную матрицу
}
getch();
return 0;
}
и еще чтобы, после выполнения программа не завершала работу, а спрашивала "выполнить что-нибудь еще?"
 
K

koka278

Вот я доделал,если кому-то пригодится
C++:
#include <iostream.h> 
#include <math.h> 
#include <windows.h>



char FileName[256];
char Stroka[100];
char RusText[100];
char *slovo;

double **Matrix,**Matrix2,**Matrix3,**Matrix4,**Matrix5,**Matrix6,det;
int i,j,N=0,vop;

//вычисление определителя
double Determinant()
{
int maxl,k;
double del, det=1,d;

//приведение матрицы к треугольному виду
for(k=0;k<N-1;k++)
{			  
maxl=k;
for(i=k+1;i<N;i++)
{
if(fabs(Matrix[i][k])>fabs(Matrix[k][k]))
{
maxl=i;
}
}
if(maxl!=k)//если максимальный элемент не на диагонали, тогда переставляем строки с учетом изменения определителя
{
det=det*(-1);
for(j=0;j<N;j++)
{
d=Matrix[k][j];
Matrix[k][j]=Matrix[maxl][j];
Matrix[maxl][j]=d;
}
}
if(Matrix[k][k]!=0)
{
for(i=k+1;i<N;i++)
{
del=Matrix[i][k]/Matrix[k][k];
for(j=0;j<N;j++)
{
Matrix[i][j]=Matrix[i][j]-del*Matrix[k][j];//вычитание верхней строки от нижних
}

}
}
else
{
return 0;
}
}
//вычисление определителя путем премножения диагональных элементов
for(i=0;i<N;i++)
det*=Matrix[i][i];	 
return det;
}


//транспонирование
double transpon()
{
Matrix6=new double*[N];
for (int i=0; i<N; i++)
{
Matrix6[i]=new double[N];
for (int j=0; j<N; j++)
{
Matrix6[i][j] = Matrix[j][i];
cout<<Matrix6[i][j]<<"\t";
}
cout<<endl;
}

return 0;
}
// сложение двух матриц
double slozhenie()
{

Matrix3=new double*[N];
for (int i=0; i<N; i++)
{
Matrix3[i]=new double[N];
for (int j=0; j<N; j++)
{
Matrix3[i][j] = Matrix[i][j] + Matrix2[i][j];
cout<<Matrix3[i][j]<<"\t";
}
cout<<endl;
}

return 0;
}

// умножение двух матриц
double umnozhenie()
{

Matrix5=new double*[N];	 
for (int i=0; i<N; i++)
{					
Matrix5[i]=new double[N];
for (int j=0; j<N; j++)
{
Matrix5[i][j]=0;
for(int k=0;k<N;k++)
Matrix5[i][j] +=Matrix[i][k]*Matrix4[k][j];
}
}


return 0;
}


main()
{
do
{
char RusMatrVvd[20],RusMatrStr[15],RusMatrStlb[15];
CharToOem("Введите элемент ",RusMatrVvd);
CharToOem("-ой стоки ",RusMatrStr);
CharToOem("-ого столбца: ",RusMatrStlb);
CharToOem("Введите размерность квадратной матрицы : ",RusText);				 
cout<<RusText;
cin>>N;
Matrix=new double*[N];			 
for(i=0;i<N;i++)				
{	  
Matrix[i]=new double[N];
for(j=0;j<N;j++)
{
cout<<RusMatrVvd<<i+1<<RusMatrStr<<j+1<<RusMatrStlb;
cin>>Matrix[i][j];
}
}

CharToOem("Исходная матрица:",RusText);
cout<<endl<<RusText<<endl;
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
cout<<Matrix[i][j]<<"\t";
}
cout<<endl;
}


CharToOem("Что делать? ",RusText);					 
cout<<endl<<RusText<<endl;
CharToOem("1 - Вычисление определителя матрицы",RusText);
cout<<endl<<RusText<<endl;
CharToOem("2 - Сложение двух матриц ",RusText);
cout<<endl<<RusText<<endl;
CharToOem("3 - Умножение одной матрицы на другую ",RusText);
cout<<endl<<RusText<<endl;
CharToOem("4 - Нахождение транспонированной матрицы ",RusText);
cout<<endl<<RusText<<endl<<endl;
int vop1;
cin>>vop1;
switch(vop1)
{
case 1:
{
det = Determinant();
CharToOem("Определитель равен: ",RusText);
cout<<endl<<RusText<<det<<endl;
break;
}

case 2:
{
CharToOem("Введите элементы второй матрицы : ",RusText);		
cout<<RusText<<endl;
Matrix2=new double*[N];			 
for(i=0;i<N;i++)			
{	  
Matrix2[i]=new double[N];
for(j=0;j<N;j++)
{
cout<<RusMatrVvd<<i+1<<RusMatrStr<<j+1<<RusMatrStlb;
cin>>Matrix2[i][j];
}
}

CharToOem("Вторая матрица:",RusText);
cout<<endl<<RusText<<endl;
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
cout<<Matrix2[i][j]<<"\t";
}
cout<<endl;
}
CharToOem("Сумма:",RusText);
cout<<endl<<RusText<<endl;
slozhenie();
break;
}
case 3:
{
CharToOem("Введите элементы второй матрицы : ",RusText);		
cout<<RusText<<endl;
Matrix4=new double*[N];			 
for(i=0;i<N;i++)			
{	  
Matrix4[i]=new double[N];
for(j=0;j<N;j++)
{
cout<<RusMatrVvd<<i+1<<RusMatrStr<<j+1<<RusMatrStlb;
cin>>Matrix4[i][j];
}
}

CharToOem("Вторая матрица:",RusText);
cout<<endl<<RusText<<endl;
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
cout<<Matrix4[i][j]<<"\t";
}
cout<<endl;
}
CharToOem("Произведение:",RusText);
cout<<endl<<RusText<<endl;
umnozhenie();
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
cout<<Matrix5[i][j]<<"\t";
}
cout<<endl;
}
break;
}
case 4:
{
CharToOem("Транспонированная матрица:",RusText);
cout<<endl<<RusText<<endl;
transpon();
break;
}
}




CharToOem("Завершить работу?",RusText);
cout<<endl<<RusText<<endl;
CharToOem("1 - Да",RusText);
cout<<endl<<RusText<<endl;
CharToOem("2 - Нет ",RusText);
cout<<endl<<RusText<<endl;
cin>>vop;
}
while(vop!=1);

return 0;
}
 
E

ensane

koka278, зачем матрицу к треугольному виду при нахождении определителя приводишь? Это в задании так сказано?
Плюс технический вопрос: вы классы уже проходили?
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!