当前位置:首页 » 编程语言 » c语言求矩阵行列式
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

c语言求矩阵行列式

发布时间: 2022-01-31 08:21:49

A. c语言求行列式的值

你这样全部叫别人写是不可能的,除非把你的代码发出来,大家给你检查下错误,不要不好意思.

B. 求c语言求矩阵的行列式和逆天天向哪儿

引用型参数应该在能被定义为const的情况下,尽量定义为const 。
#define N 5 /*[注]:修改6为你所要的矩阵阶数*/
#include "stdio.h"
#include "conio.h"

/*js()函数用于计算行列式,通过递归算法实现*/
int js(s,n)
int s[][N],n;
{int z,j,k,r,total=0;
int b[N][N];/*b[N][N]用于存放,在矩阵s[N][N]中元素s[0]的余子式*/
if(n>2) {for(z=0;z<n;z++)
{for(j=0;j<n-1;j++)
for(k=0;k<n-1;k++)
if(k>=z) b[j][k]=s[j+1][k+1];
else b[j][k]=s[j+1][k];
if(z%2==0) r=s[0][z]*js(b,n-1); /*递归调用*/
else r=(-1)*s[0][z]*js(b,n-1);
total=total+r;
}
}
else if(n==2) total=s[0][0]*s[1][1]-s[0][1]*s[1][0];
return total;
}

/*n_1()函数用于求原矩阵各元素对应的余子式,存放在数组b[N][N]中,定义为float型*/
void n_1(s,b,n)
int s[][N],n;
float b[][N];
{int z,j,k,l,m,g,a[N][N];
for(z=0;z<n;z++)
{l=z;
for(j=0;j<n;j++)
{ m=j;
for (k=0;k<n-1;k++)
for(g=0;g<n-1;g++)
{ if(g>=m&&k<l) a[k][g]=s[k][g+1];
else if(k>=l&&g<m) a[k][g]=s[k+1][g];
else if(k>=l&&g>=m) a[k][g]=s[k+1][g+1];
else a[k][g]=s[k][g];
}
b[z][j]=js(a,n-1);
}
}
}

main()
{int a[N][N];
float b[N][N];
int r,z,j;
float temp;
//clrscr();
printf("Input original data:\n");
for(z=0;z<N;z++) /*输入所需要的数据,为整型数据*/
for(j=0;j<N;j++)
scanf("%d",&a[z][j]);
printf("\nPress Enter continue......");
getchar();
//gotoxy(1,1);
printf("The original matrix is:\n");
for(z=0;z<N;z++)/*打印原矩阵*/
{for(j=0;j<N;j++)
printf("%5d",a[z][j]);
printf("\n");
}
r=js(a,N); /*调用js()函数计算原矩阵的行列式值*/
printf("\nThe original matrix hanglieshi is:|A|==%d\n",r);
if (r==0) printf("Because |A|==0,the original matrix have no nijuzhen!"); /*判断条件:若|A|==0,则原矩阵无逆矩阵,反之则存在逆矩阵*/
else
{n_1(a,b,N); /*调用n_1()函数,得到原矩阵各元素对应的"余子式",存放在数组b[N][N]中*/
for(z=0;z<N;z++) /*求代数余子式,此时b[N][N]中存放的为原矩阵各元素对应的"代数余子式"*/
for(j=0;j<N;j++)
if((z+j)%2!=0 && b[z][j]!=0) b[z][j]=-b[z][j];
for(z=0;z<N;z++) /*对b[N][N]转置,此时b[N][N]中存放的为原矩阵的伴随矩阵*/
for(j=z+2;j<N;j++)
{temp=b[z][j];
b[z][j]=b[j][z];
b[j][z]=temp;
}
printf("Because |A|!=0,the original matrix have nijuzhen!\n");
printf("The bansuijuzhen A* is:\n");
for(z=0;z<N;z++)/* 打印伴随矩阵A* */
{for(j=0;j<N;j++)
printf("%4.0f\t",b[z][j]);
printf("\n");
}

for(z=0;z<N;z++) /*求逆矩阵,此时b[N][N]中存放的是原矩阵的逆矩阵*/
for(j=0;j<N;j++)
b[z][j]=b[z][j]/r;
printf("\nThe nijuzhen is:(A*)/|A|(|A|=%d)\n",r); /*打印逆矩阵*/
for(z=0;z<N;z++)
{for(j=0;j<N;j++)
printf("%8.3f",b[z][j]);
printf("\n");
}
}
}

C. 用C语言解决:求任意阶(n阶)矩阵的行列式

很遗憾,上面匿名的程序不正确。
比如n=2 输入:
3---7
2---1
得出错误结果。
而当输入n=3
0---1---3
3---0---2
5---2---0
时也会得出错误结果。
错误的原因有2:
1 是数据类型不对,匿名的程序是设定输入都是整数int,显然按照行列式的定义结果肯定是整数,但是他程序中使用了整型数的除法,结果是取整整数,虽然他使用了类型强制转换,但结果显然不同,有误差而且有时候这个误差很大形成错误。
2 是算法有点问题。小可很欣赏匿名的算法思路,简洁明快。不过有相当缺陷,这在程序中注明。
下面的程序是在匿名的程序思路上改写的。考虑到数据类型和精确度问题,程序中行列式数据使用double型。由于tc和win-tc是16位编辑器,对float型和double型数据支持不好,所以程序是在32位编辑器Dev-c++下调试并通过的。
本题的一个完整的c程序如下,程序在Dev-c++下都调试通过,结果正确。
/* 用C语言解决:求任意阶(n阶)矩阵的行列式值 */
#include <stdio.h>
#include <math.h>

void getarray(int n);
void showarray(int n);
double getresult(int n);
double array[10][10];/*设矩阵不超过10阶,可更改*/

int main()
{
int n;
double result;
printf("\nPlease input the Array size n:");
scanf("%d",&n);
getarray(n);
showarray(n);
result=getresult(n);
printf("\nResult=%f\n",result);
system("pause");
return 0;
}

void getarray(int n)
{
int row,col;
for(row=0;row<n;row++)
{
printf("\nPlease input line %d:",row+1);
for(col=0;col<n;col++)
scanf("%lf",&array[row][col]);
}
}

void showarray(int n)
{
int row,col;
printf("\nA=");
for(row=0;row<n;row++)
{
for(col=0;col<n;col++)
printf("\t%f",array[row][col]);
printf("\n");
}
}

double getresult(int n)
{
double temp,result=1.0;
int switchtime=0,flag=0;
int row,nextrow,col,stemp;
for(row=0;row<n-1;row++)
{
nextrow=row+1;
if(array[row][row]==0)/* 开始处理第一列,如果行列式第一行第一个数为零,要交换行 */
{ while(array[nextrow][row]==0)
{
nextrow++; /* 如果行列式第二行第一个数为零,行增加继续寻找非零数值的行 */
if(nextrow==n)/* 如果遍历完行列式行列式第一列元素都为零,退出while循环 */
{ flag=1;
break;
}
}
if(flag==1) /* 退出while循环后回到for(row=0;row<n-1;row++)行加1?*/
continue; /* 从array[row][row]==0知列也相应加1,开始处理第二列 */
switchtime++; /* 每交换一次行,行列式符号变化1次,统计变化次数 */
for(col=0;col<n;col++) /* 交换非零行到行列式顶部 */
{
stemp=array[row][col];
array[row][col]=array[nextrow][col];
array[nextrow][col]=stemp;
}
}
for(nextrow=row+1;nextrow<n;nextrow++)
{ /* 类似高斯消去法,消第一行下各行第一列数值到零*/
temp=array[nextrow][row]/array[row][row];
for(col=0;col<n;col++)
array[nextrow][col]+=-temp*array[row][col];/* 化行列式为上三角行列式形式 */
}
}
showarray(n);
for(row=0;row<n;row++)
result*=array[row][row];
if(switchtime%2)
return -result;
else
return result;
}

D. 求矩阵行列式的C语言原代码

要看是不是用户输入行例数,如果是这样就有些麻烦。。。别问人了,也不要想着别人给你写,直接去网上找,找得到这种题的代码的,因为题不很难。。。HOHOHO
就用“求矩阵行列式的C语言原代码”在网络里找就是了。。。

E. 如何用c语言来求一个四阶行列式的值

#include <stdio.h>
#include <stdlib.h>
#define MAX 9 /*定义最大为9阶行列式*/

int Fun(int n, int a[MAX][MAX] ); /*函数声明*/
int main()
{
int n = 0; /*初始化阶数n*/
int i = 0, j = 0; /*i,j分别表示行与列*/
int a[MAX][MAX] = {{0}}; /*定义行列式*/

scanf("%d",&n); /*读入阶数*/
while( n != 0) /*输入为0时退出程序*/
{
for( i = 0; i < n; i++) /*此处2次循环将行列式存入数组中*/
{
for( j = 0; j < n; j++)
scanf("%d", &a[i][j]);
}
printf("%d\n", Fun( n, a ) );
scanf("%d", &n);
}

return 0;
}

/*以下为计算行列式值的递归函数*/
int Fun( int n, int a[MAX][MAX] )
{
int b[MAX][MAX] = {{0}}; /*定义数组b并初始化*/
int i = 0, j = 0, sum = 0; /*i,j为行与列,sum为行列式的值*/
int x = 0,c = 0,p=0; /*用x判断加与减,c,p为中间变量*/

if(n == 1)
return a[0][0];

for(i = 0;i < n; i++) /*此处大循环实现将余子式存入数组b中*/
{
for(c = 0;c < n-1; c++)
{
for(j = 0;j < n-1;j++)
{
if (c < i){ /*借助c判断每行的移动方法*/
p = 0; /*当p=0时,行列式只向左移,即消去对应的第一列的数*/
}
else{ /*否则行列式左移后再上移*/
p = 1;
}
b[c][j] = a[c+p][j+1];
}
}

if(i % 2 == 0){ /*i+j(此时j=0,故只考虑i)为偶数,加法预算*/
x = 1;
}
else{ /*i+j为奇数,减法运算*/
x = (-1);
}
sum += a[i][0] * Fun(n - 1, b ) * x; /*计算行列式的值*/
}

return sum; /*将值返回*/
}

F. c语言计算矩阵行列式问题

简化代码,宏定义后,后面的程序直接拿来用就可以了

G. C语言,这是我编的求矩阵行列式的函数,但是出了问题,求解答

你这个程序至少有两个问题(可能还有别的错误,我再看看)

第一个

if(m=1)//应该是m==1
{
return**p;
}//行数为1直接返回


第二个问题,循环嵌套不对,下面是正确的代码,注意大括号位置。

		for(i=0;i<m;i++)
{
p2[i]=(float**)malloc((m-1)*sizeof(float));
for(j=0;j<m-1;j++)
{
p2[i][j]=(float*)malloc((m-1)*sizeof(float));
}//第一维是p第几列的余子式,第二维第三维是余子式
}

H. C语言求行列式的值

C语言程序如下:

#include<stdio.h>
#include<math.h>

#defineMAX100

doubleD(doublearr[][MAX],intn);
voidDisplay(doublearr[][MAX],intn);

voidmain()
{
doublearr[MAX][MAX];
doublebak[MAX][MAX];
doublevalue;
intn;
inti,j,k,c;

printf("Pleaseentermatrixsizen(1<=n<20):");
scanf("%d",&n);

printf("Pleaseinputmatrixlinebyline: ");
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
scanf("%lf",&arr[i][j]);
}
}

printf("matrixa: ");
Display(arr,n);

/*保存D(0,i)的值到bak中*/
for(i=0;i<n;i++) /*处理第1行的每一列元素*/
{
for(j=1;j<n;j++) /*逐行处理*/
{
for(c=0,k=0;k<n;k++) /*逐列处理*/
{
if(k==i)
{
continue;
}
bak[j-1][c++]=arr[j][k];
}
}
value=D(bak,n-1);

printf("Submatrix: ");
Display(bak,n-1);

printf("DValueoftheSubmatrixis%f ",D(bak,n-1));
}

value=D(arr,n);
printf("result=%f ",value);
}

doubleD(doublearr[][MAX],intn)
{
doublebak[MAX][MAX];
inti,j,k,c,d;
doublesum=0;

if(n==1)
{
returnarr[0][0];
}

for(i=0;i<n;i++) /*处理第1行的每一列元素*/
{
for(j=1;j<n;j++) /*逐行处理*/
{
for(c=0,k=0;k<n;k++) /*逐列处理*/
{
if(k==i)
{
continue;
}
bak[j-1][c++]=arr[j][k];
}
}

/*计算arr(row,col)*D(row,col)的值*/
sum+=(i%2==0?1:-1)*arr[0][i]*D(bak,n-1);
}
returnsum;
}

voidDisplay(doublearr[][MAX],intn)
{
inti,j;
printf("");
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
printf("%10.1lf",arr[i][j]);
}
printf(" ");
}
}


运行测试:

I. 行列式求值--C语言

#include<stdio.h>
#include<stdlib.h>
void main()
{
float f(float *a,int n);
int i,j,n;
scanf("%d",&n);
float *a=(float *)malloc(n*sizeof(float));
for(i=0;i<n;i++)
for(j=0;j<n;j++)
scanf("%f",a+i*n+j);
printf("行列式如下:\n");
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
printf("%-5.2f ",*(a+i*n+j));
printf("\n");
}
printf("%-8.2f\n",f(a,n));
}
float f(float *a,int n)
{
int i,j,k,p=1;
float *b=(float *)malloc(n*n*sizeof(float));
for(i=0;i<n;i++)
for(j=0;j<n;j++)
*(b+i*n+j)=0;
float s=0;
if(n==1)
return *a;
if(n==2)
return *a**(a+n+1)-*(a+1)**(a+n);
else
for(i=0;i<n;i++)
{
for(j=0;j<n-1;j++)
for(k=0;k<n-1;k++)
if(k>=i)
*(b+n*j+k)=*(a+n*j+k+1);
else
*(b+n*j+k)=*(a+n*j+k);
s+=p**(a+n*(n-1)+i)*f(b,n-1);
p*=-1;
}
return s;
}

J. 求一个 计算矩阵行列式 的C或C++程序!

以下是我原来写过的一个关于矩阵的类,里面实现了求方阵的行列式函数:intdet(matrix);
//matrix.h
//*******************************
#ifndefmatrix_h
#definematrix_h
classmatrix
{
private:
intm;
intn;
doublearr[8][8];
public:
matrix();
matrix(double);
voidset();//对矩阵的赋值;
voidshow();//在屏幕上显示矩阵;
friendinthomotype(matrix,matrix);//是否同型;
friendintmultipliable(matrix,matrix);
//判断矩阵是否可相乘
friendmatrixoperator+(matrix,matrix);
//矩阵相加,对加号重载;
friendmatrixoperator-(matrix,matrix);
//矩阵机减,对减号重载;
friendmatrixadd(matrix,matrix);
//矩阵相加;
friendmatrixminus(matrix,matrix);
//矩阵相减
friendmatrixmultiply(matrix,matrix);
//矩阵相乘
friendmatrixoperator*(matrix,matrix);
//矩阵相乘,对乘号重载;
frienddoubledet(matrix);
//求方阵的行列式;
intissquare()
{
returnm==n;
}
//判断是否为方阵;
matrixleft(intx,inty);
//求元素arr[x][y](x,y从0开始)的余子式;
};
#endif
//*******************************
//matrix.cpp
//下面是对类中成员及友元函数的实现
//*******************************
#include<iostream.h>
#include"matrix.h"
matrix::matrix()
{
m=8;
n=8;
for(inti=0;i<m;i++)
{
for(intj=0;j<n;j++)
arr[i][j]=0;
}
}
matrix::matrix(doublex)
{
m=1;
n=1;
arr[0][0]=x;
}
voidmatrix::set()
{
cout<<"Setthetypeofthematrix(?*?)"<<endl;
cin>>m>>n;
cout<<":"<<endl;
for(inti=0;i<m;i++)
{
for(intj=0;j<n;j++)
cin>>arr[i][j];
}
}
voidmatrix::show()
{
cout<<"Thisisthematrix:"<<endl;
for(inti=0;i<m;i++)
{
for(intj=0;j<n;j++)
{
cout<<arr[i][j]<<ends;
}
cout<<endl;
}
}
inthomotype(matrixx,matrixy)
{
if(x.m==y.m&&x.n==y.n)
return1;
else
return0;
}
intmultipliable(matrixx,matrixy)
{
if(x.n==y.m)
return1;
else
return0;
}
matrixadd(matrixx,matrixy)
{
matrixz;
if(homotype(x,y))
{
z.m=x.m;
z.n=x.n;
for(inti=0;i<z.m;i++)
for(intj=0;j<z.n;j++)
z.arr[i][j]=x.arr[i][j]+y.arr[i][j];
returnz;
}
else
{
cout<<"cannotbeadded!"<<endl;
returnz;
}
}
matrixoperator+(matrixx,matrixy)
{
returnadd(x,y);
}
matrixminus(matrixx,matrixy)
{
matrixz;
if(homotype(x,y))
{
z.m=x.m;
z.n=x.n;
for(inti=0;i<z.m;i++)
for(intj=0;j<z.n;j++)
z.arr[i][j]=x.arr[i][j]-y.arr[i][j];
returnz;
}
else
{
cout<<"cannotbeadded!"<<endl;
returnz;
}
}
matrixoperator-(matrixx,matrixy)
{
returnminus(x,y);
}
matrixmultiply(matrixx,matrixy)
{
matrixz;
if(x.n!=y.m)
{
cout<<"."<<endl;
returnz;
}
for(inti=0;i<x.m;i++)
{
for(intj=0;j<y.n;j++)
{
for(intk=0;k<x.n;k++)
z.arr[i][j]+=x.arr[i][k]*y.arr[k][j];
}
}
z.m=x.m;
z.n=y.n;
returnz;
}
matrixoperator*(matrixx,matrixy)
{
matrixz;
z=multiply(x,y);
returnz;
}
matrixmatrix::left(intx,inty)
{
matrixleftmatrix;
if((x>=m)||(y>=n))
{
cout<<"errer"<<endl;
returnleftmatrix;
}
/*if(!issquare())
{
cout<<"不是方阵!"<<endl;
return*this;
}//*/
leftmatrix.m=m-1;
leftmatrix.n=n-1;
inttestx=0;
inttesty=0;
for(inti=0;i<leftmatrix.m;i++)
{
testy=0;
for(intj=0;j<leftmatrix.n;j++)
{
if(i==x)
testx=1;
if(j==y)
testy=1;
if((!testx)&&(!testy))
leftmatrix.arr[i][j]=this->arr[i][j];
elseif(testx&&(!testy))
leftmatrix.arr[i][j]=this->arr[i+1][j];
elseif((!testx)&&testy)
leftmatrix.arr[i][j]=this->arr[i][j+1];
else
leftmatrix.arr[i][j]=this->arr[i+1][j+1];
}
}
returnleftmatrix;
}
doubledet(matrixx)//递归算法
{
if(!x.issquare())
{
cout<<"不是方阵!"<<endl;
return9.99;
}
if(x.m==0)
return0;
elseif(x.m==1)
returnx.arr[0][0];
elseif(x.m==2)
return(x.arr[0][0]*x.arr[1][1]-x.arr[0][1]*x.arr[1][0]);
else
{
doublenum=0;
inta=1;
for(inti=0;i<x.m;i++)
{
num=num+a*x.arr[0][i]*det(x.left(0,i));
//按第0行展开
a=-a;
}
returnnum;
}
}
//**************************************