Код:

#include <stdio.h>
#include <windows.h>
#include <time.h>
#define XYZZ 4
void print_matrix(double **m, int sz);
void print_vector(double *m, int sz);
void random_matrix(double **m, int sz);
void random_vector(double *m, int sz);
double opredelitel(double **m, int sz);
void change_lines(double **m, int sz, int d,int t);
int poww(int,int);
void copy_matrix(double **m, double **newm, int sz);
void change_column_matrix(double **m, double **newm, double *line, int num_column, int sz);
void kramer(double **m, double *line, double mainopr,int sz);
void main()
{
double mainopr;
int size=XYZZ;
double* line;
double** matrix;
matrix = new double*[size];
for(int k=0;k<size;k++)
{
matrix[k]=new double[size];
}
line = new double[size];
/* Проскуряков #567*/
/*matrix[0][0]=3;matrix[0][1]=-2;matrix[0][2]=-5;matrix[0][3]=1;
matrix[1][0]=2;matrix[1][1]=-3;matrix[1][2]=1;matrix[1][3]=5;
matrix[2][0]=1;matrix[2][1]=2;matrix[2][2]=0;matrix[2][3]=-4;
matrix[3][0]=1;matrix[3][1]=-1;matrix[3][2]=-4;matrix[3][3]=9;
line[0]=3; line[1]=-3; line[2]=-3;line[3]=22;/**/
/* Проскуряков #568*/
/*matrix[0][0]=4;matrix[0][1]=-3;matrix[0][2]=1;matrix[0][3]=5;
matrix[1][0]=1;matrix[1][1]=-2;matrix[1][2]=-2;matrix[1][3]=-3;
matrix[2][0]=3;matrix[2][1]=-1;matrix[2][2]=2;matrix[2][3]=0;
matrix[3][0]=2;matrix[3][1]=3;matrix[3][2]=2;matrix[3][3]=-8;
line[0]=7; line[1]=3; line[2]=-1;line[3]=-7;/**/
random_matrix(matrix,size);
printf("Matrix:\n");
print_matrix(matrix,size);
random_vector(line,size);
printf("Vector:\n");
print_vector(line,size);
mainopr=opredelitel(matrix,size);
printf("Main determinant: %f\n",mainopr);
if (mainopr !=0)
{
printf("Reshenie: \n");
kramer(matrix, line,mainopr, size);
}
else
{
printf("Systema nekramerovskaya\n");
}
for(k=0;k<size;k++)
{
delete[] matrix[k];
}
delete[] matrix;
delete[] line;
}
void kramer(double **m, double *line, double mainopr,int sz)
{
int i;
double** newmatrix;
double x;
newmatrix = new double*[sz];
for(int k=0;k<sz;k++)
{
newmatrix[k]=new double[sz];
}
for(i=0; i<sz;i++)
{
change_column_matrix(m, newmatrix, line, i, sz);
x=opredelitel(newmatrix,sz)/mainopr;
printf("x[%d]=%f\n",i,x);
}
for(k=0;k<sz;k++)
{
delete[] newmatrix[k];
}
delete[] newmatrix;
}
void change_column_matrix(double **m, double **newm, double *line, int num_column, int sz)
{
int i,j;
if (num_column <sz){
for (i=0 ; i<sz; i++)
{
for (j=0; j<sz;j++)
{
if (j != num_column)
{
newm[i][j]=m[i][j];
}
else
{
newm[i][j]=line[i];
}
}
}
}
else
{
printf("Error\n");
}
}
void print_matrix(double **m, int sz)
{
int i,j;
for (i=0 ; i<sz; i++)
{
for (j=0; j<sz;j++)
{
printf("%f ", m[i][j]);
}
printf("\n");
}
}
void print_vector(double *m, int sz)
{
int i;
for (i=0 ; i<sz; i++)
printf("%f ", m[i]);
printf("\n");
}
void random_matrix(double **m, int sz)
{
int i,j;
srand (time(NULL));
for (i=0 ; i<sz; i++)
for (j=0; j<sz;j++)
m[i][j]=rand()%10;
}
void random_vector(double *m, int sz)
{
int i;
srand (time(NULL));
for (i=0 ; i<sz; i++)
m[i]=rand()%10;
}
void copy_matrix(double **m, double **newm, int sz)
{
int i,j;
for (i=0 ; i<sz; i++)
for (j=0; j<sz;j++)
newm[i][j]=m[i][j];
}
double opredelitel(double **m, int sz)
{
double x,result;
int i,j,k,l,n, num_of_changes;
double** matrix_copy;
matrix_copy = new double*[sz];
for(k=0;k<sz;k++)
matrix_copy[k]=new double[sz];
copy_matrix(m,matrix_copy,sz);
result = 1;
num_of_changes=0;
if ( sz > 2)
{
for(i=0,j=0;i<sz-1;i++,j++)
{
if (matrix_copy[i][j]==0)
{
for(k=i+1;k<sz;k++)
{
if(matrix_copy[k][j]!=0)
{
change_lines(matrix_copy,sz,i,k);
num_of_changes++;
break;
}
}
}
for(l=i+1;l<sz;l++)
{
if (matrix_copy[l][j] != 0)
{
x=-matrix_copy[l][j]/matrix_copy[i][j];
for (n=j;n<sz;n++)
{
matrix_copy[l][n]=matrix_copy[i][n]*x+matrix_copy[l][n];
}
}
}
}
}
else if (sz==2)
{
return (m[0][0]*m[1][1]-m[0][1]*m[1][0]);
}
else if (sz==1)
{
return (m[0][0]);
}
else
{
printf ("Error");
return (-1);
}
for(i=0,j=0;i<sz;i++,j++)
{
result *= matrix_copy[i][j] ;
}
result *= poww(-1,num_of_changes);
for(k=0;k<sz;k++)
delete[] matrix_copy[k];
delete[] matrix_copy;
return(result);
}
void change_lines(double **m, int sz, int d,int t)
{
int i;
double temp;
for (i=0;i< sz;i++)
{
temp=m[d][i];
m[d][i]=m[t][i];
m[t][i]=temp;
}
}
int poww(int d,int t){
int st=1;
int result=1;
for(st=1; st<=t; st++)
{
result*=d;
}
return (result);
}