AigizK » 08 май 2007, 07:55
Есть матрица размером NxN.Надо подсчитать определитель.Что я делаю:
1.Заполняю случайными числами(0 и1).
2.Проверяю,есть ли нулевые строки или столбцы
3.Проверяю есть ли совпадающие строки или столбцы
4.Выставляю на главной диагонали ненулевые значения.Для этого смотрю mas равен нулю,если да то к i-ой строке прибавляю все остальные строки.Таким образом у меня mas обязательно станет не нулевым.
5.Привожу матрицу к треугольному ввиду,т.е. к виду когда под главным диагоналем стоят одни нули.
6.Умножение элементов главного диагоналя дает определитель матрицы.
У меня почему то иногда файл,куда все это записывается вообще пуст.Иногда вычесляется,а в последнее время,даже массив первоначальной не полностью записывается.Кто может подсказать,в чем ошибка.Ниже код.
#include <stdio.h>
#include <stdlib.h>
#define N 4
float mas[N][N];
//*******Вспомогательная функция.Проверяет на 0,элементы гл.диагонали
int NullGlDiag()
{
for(int i=0;i<N;i++)
if(mas==0)return 1;
return 0;
}
void main()
{int i,j,k,fl;
FILE *f;
randomize();
f=fopen("1.txt","w");
//********Заполняем массив for(i=0;i<N;i++)
{
fprintf(f,"\n");
for(j=0;j<N;j++)
{
mas[j]=random(2)%2;
fprintf(f,"%f ",mas[j]);
}
}
//проверяем,есть ли нулевые строки или столбцы.
for(i=0;i<N;i++)
{
fl=0;
for(j=0;j<N;j++)
fl+=mas[j];
if(fl==0){fprintf(f,"\n\n%d stroka sostoit iz 0,poetomy opredelitel=0",i+1);fclose(f);return;}
}
for(i=0;i<N;i++)
{
fl=0;
for(j=0;j<N;j++)
fl+=mas[j];
if(fl==0){fprintf(f,"\n\n%d stolbes sostoit iz 0,poetomy opredelitel=0",i+1);fclose(f);return;}
}
//проверяем на одинаковые строки и столбцы
for(i=0;i<N-1;i++)
for(j=i+1;j<N;j++)
{
fl=1;
for(k=0;k<N;k++)if(mas[i][k]!=mas[j][k])fl=0;
if(fl==1)
{fprintf(f,"\n\n%d i %d stroki sovpadayt,poetomy opredelitel=0",i+1,j+1);
fclose(f);
return;
}
}
for(i=0;i<N-1;i++)
for(j=i+1;j<N;j++)
{
fl=1;
for(k=0;k<N;k++)if(mas[k][i]!=mas[k][j])fl=0;
if(fl==1)
{fprintf(f,"\n\n%d i %d stolbsi sovpadayt,poetomy opredelitel=0",i+1,j+1);
fclose(f);
return;
}
}
//Выставляем на диагонали ненулевые значения
fl=1 ;
while(fl==1)
{
if(NullGlDiag()==0)fl=0;
else
{
for(i=0;i<N;i++)
{
fl=0;
if(mas[i][i]==0)
{
fl=1;
for(j=0;j<N;j++)
if(i!=j)
for(k=0;k<N;k++)
mas[i][k]=mas[i][k]+mas[j][k];
goto lab1;
}
}
}
lab1:
}
//получаем треугольную матрицу
for(j=0;j<N;j++)
for(i=j+1;i<N;i++)
if(mas[i][j]!=0)
{
for(k=j;k<N;k++)
mas[i][k]=mas[i][k]/mas[i][j]-mas[j][k]/mas[j][j];
if(mas[i][i]==0)
{
fprintf(f,"\n\nglavnaya diagonal sodergit 0,opredelitel=0");
fclose(f);
return;
}
}
//получаем определитель,умножив друг на друга элементы гл.диагонали
float opr=1;
for(i=0;i<N;i++)opr*=mas[i][i];
fprintf(f,"\nopredelitel=%f",opr);
fclose(f);
return;
}
P.S. Язык программирования Си
Есть матрица размером NxN.Надо подсчитать определитель.Что я делаю:
1.Заполняю случайными числами(0 и1).
2.Проверяю,есть ли нулевые строки или столбцы
3.Проверяю есть ли совпадающие строки или столбцы
4.Выставляю на главной диагонали ненулевые значения.Для этого смотрю mas[i][i] равен нулю,если да то к i-ой строке прибавляю все остальные строки.Таким образом у меня mas[i][i] обязательно станет не нулевым.
5.Привожу матрицу к треугольному ввиду,т.е. к виду когда под главным диагоналем стоят одни нули.
6.Умножение элементов главного диагоналя дает определитель матрицы.
У меня почему то иногда файл,куда все это записывается вообще пуст.Иногда вычесляется,а в последнее время,даже массив первоначальной не полностью записывается.Кто может подсказать,в чем ошибка.Ниже код.
#include <stdio.h>
#include <stdlib.h>
#define N 4
float mas[N][N];
//*******Вспомогательная функция.Проверяет на 0,элементы гл.диагонали
int NullGlDiag()
{
for(int i=0;i<N;i++)
if(mas[i][i]==0)return 1;
return 0;
}
void main()
{int i,j,k,fl;
FILE *f;
randomize();
f=fopen("1.txt","w");
//********Заполняем массив for(i=0;i<N;i++)
{
fprintf(f,"\n");
for(j=0;j<N;j++)
{
mas[i][j]=random(2)%2;
fprintf(f,"%f ",mas[i][j]);
}
}
//проверяем,есть ли нулевые строки или столбцы.
for(i=0;i<N;i++)
{
fl=0;
for(j=0;j<N;j++)
fl+=mas[i][j];
if(fl==0){fprintf(f,"\n\n%d stroka sostoit iz 0,poetomy opredelitel=0",i+1);fclose(f);return;}
}
for(i=0;i<N;i++)
{
fl=0;
for(j=0;j<N;j++)
fl+=mas[j][i];
if(fl==0){fprintf(f,"\n\n%d stolbes sostoit iz 0,poetomy opredelitel=0",i+1);fclose(f);return;}
}
//проверяем на одинаковые строки и столбцы
for(i=0;i<N-1;i++)
for(j=i+1;j<N;j++)
{
fl=1;
for(k=0;k<N;k++)if(mas[i][k]!=mas[j][k])fl=0;
if(fl==1)
{fprintf(f,"\n\n%d i %d stroki sovpadayt,poetomy opredelitel=0",i+1,j+1);
fclose(f);
return;
}
}
for(i=0;i<N-1;i++)
for(j=i+1;j<N;j++)
{
fl=1;
for(k=0;k<N;k++)if(mas[k][i]!=mas[k][j])fl=0;
if(fl==1)
{fprintf(f,"\n\n%d i %d stolbsi sovpadayt,poetomy opredelitel=0",i+1,j+1);
fclose(f);
return;
}
}
//Выставляем на диагонали ненулевые значения
fl=1 ;
while(fl==1)
{
if(NullGlDiag()==0)fl=0;
else
{
for(i=0;i<N;i++)
{
fl=0;
if(mas[i][i]==0)
{
fl=1;
for(j=0;j<N;j++)
if(i!=j)
for(k=0;k<N;k++)
mas[i][k]=mas[i][k]+mas[j][k];
goto lab1;
}
}
}
lab1:
}
//получаем треугольную матрицу
for(j=0;j<N;j++)
for(i=j+1;i<N;i++)
if(mas[i][j]!=0)
{
for(k=j;k<N;k++)
mas[i][k]=mas[i][k]/mas[i][j]-mas[j][k]/mas[j][j];
if(mas[i][i]==0)
{
fprintf(f,"\n\nglavnaya diagonal sodergit 0,opredelitel=0");
fclose(f);
return;
}
}
//получаем определитель,умножив друг на друга элементы гл.диагонали
float opr=1;
for(i=0;i<N;i++)opr*=mas[i][i];
fprintf(f,"\nopredelitel=%f",opr);
fclose(f);
return;
}
P.S. Язык программирования Си