用C语言编程递归求行列式的值

原创 2007年09月17日 10:43:00
/************************************************************************
功能: 用递归方法求行列式的值
作者: 黄志斌 于 广西河池
在自学《高等数学(二)》时,做行列式习题所得结果有些与教材所附
答案不一致,为了验证究竟答案的正确性,编写了这个程序。
其实用MS Office中Excel也可以验证,不过自己 DIY  感觉更舒服。
    希望这个程序能对您有所帮助。
日     期     概  要
-----------------------------------------------------
2001.3.23     完成运算功能
2002.3.17     按照匈牙利式命名规则和
              林锐博士的《高质量C/C++编程指南》
              增强程序可读性
2002.3.19     停止使用全局变量iRowOrCol,
              将原先的调试部分改为预处理
*********************************************************************/
#include "stdio.h"
#include "mem.h"
#define IsDebug 0

/*int iRowOrCol;*/
void ReadMatrix(int *ipMatrixRead, int iRowOrCol4Read)
{
 int iRow4Read, iCol4Read;
 for (iRow4Read = 0; iRow4Read < iRowOrCol4Read; iRow4Read ++)
 {
  for (iCol4Read = 0; iCol4Read < iRowOrCol4Read; iCol4Read ++)
  {
   printf("matrix[%d, %d]=", iRow4Read, iCol4Read);
   scanf("%d", (ipMatrixRead + iRow4Read * iRowOrCol4Read + iCol4Read));
  }
 }
}


void WriteMatrix(int *ipMatrixWrite, int p_iRowOrCol)
{
 int iRow4Write, iCol4Write;
 putch('┌');

 for (iRow4Write = 0; iRow4Write < (p_iRowOrCol + 1) * 3 - 1; iRow4Write ++)
 {
  putch(' ');
 }
 printf("%c/n", '┐');

 for (iRow4Write = 0; iRow4Write < p_iRowOrCol; iRow4Write ++)
 {
  putch('│');
  for (iCol4Write = 0; iCol4Write < p_iRowOrCol; iCol4Write ++)
  {
   printf("%3d", *(ipMatrixWrite + iRow4Write * p_iRowOrCol + iCol4Write));
  }
  printf("%c/n", '│');
 }

 putch('└');
 for (iRow4Write = 0; iRow4Write < (p_iRowOrCol + 1) * 3 -1; iRow4Write ++)
 {
  putch(' ');
 }
 printf("%c/n", '┘');

 #if IsDebug == 1
  getch();
 #endif
}


int ComputMatrix(int *ipMatrixComput, int iColComput)
{
 int iRow4Comput, iCol4Comput, iRowTmp, *ipNewMatrix, CurrentRow, iResult;

 if (1 == iColComput)
 {
  iResult = *ipMatrixComput;
 }
 else
 {
  iResult = 0;
  for (CurrentRow = 0; CurrentRow < iColComput; CurrentRow ++)
  {
   if (*(ipMatrixComput + CurrentRow * iColCom! put))
   {
    if (ipNewMatrix = (int *)malloc((iColComput - 1) * (iColComput - 1) * sizeof(int)))
    {
     #if IsDebug == 1
      printf("/n%d", *(ipMatrixComput + CurrentRow * iColComput));
     #endif

     for (iRowTmp = 0, iRow4Comput = 0; iRow4Comput < iColComput; iRow4Comput ++)
     {
      if (iRow4Comput != CurrentRow)
      {
       for (iCol4Comput = 0; iCol4Comput < iColComput -1; iCol4Comput ++)
       {
        *(ipNewMatrix + iRowTmp*(iColComput - 1) + iCol4Comput) = *(ipMatrixComput + iRow4Comput * iColComput + iCol4Comput + 1);
       }
       iRowTmp ++;
      }
     }

     #if IsDebug == 1
      for (iRow4Comput = 0; iRow4Comput < iColComput - 1; iRow4Comput ++)
      {
       for (iCol4Comput = 0; iCol4Comput < iColComput - 1; iCol4Comput ++)
       {
        printf(" %d ", *(ipNewMatrix + iRow4Comput * (iColComput - 1) + iCol4Comput));
       }
      }
      printf("]/n************/n");
      WriteMatrix(ipNewMatrix, iColComput - 1);
     #endif

     iResult += *(ipMatrixComput + CurrentRow * iColComput) * ComputMatrix(ipNewMatrix, iColComput - 1) * ((CurrentRow + 1) % 2 ? 1 : -1);

     #if IsDebug == 1
      printf("result=%d/n", iResult);
      getch();
     #endif

     free(ipNewMatrix);
    }
   }
  }
 }
 return (iResult);
}


void main(void)
{
 int *ipMatrix, iRowOrCol;
 char chSure;
 while (1)
 {
  printf("/n/nEnter the row or col of matrix:");
  scanf("%d", &iRowOrCol);
  if (iRowOrCol > 0)
  {
   if (ipMatrix = (int *)malloc(iRowOrCol * iRowOrCol * sizeof(int)))
   {
    while (1)
    {
     ReadMatrix(ipMatrix, iRowOrCol);
     WriteMatrix(ipMatrix, iRowOrCol);
     printf("Are you sure(Y/N)?");
     chSure = getche();

     if (toupper(chSure) == 'Y')
     {
      break;
     }
     else
     {
      printf("/n/n");
     }
    }
    printf("/n/n= %d/n", ComputMatrix(ipMatrix, iRowOrCol));
    free(ipMatrix);
   }
   else
   {
    printf("Error:No enough memory!/n");
    break;
   }
  }
  else
  {
   printf("Invalid col value!/n/n");
  }
  printf("/nCompute another Matrix(Y/N)?");
  chSure = getche();
  if (toupper(chSure) != 'Y')
  {
   break;
  }
 }
}
 
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Hanoi塔问题 栈与递归C语言编程实现

Hanoi塔 栈与递归C编程实现 参考书 严蔚敏  数据结构 #include #include #include typedef int ElemType; typedef int ...

用递归方法计算行列式的值

这里给出采用递归方式计算一个n阶的行列式的方法,行列式的值存入vector< vector >类型的二维容器中,这里设定按第一行依次展开计算第一行每个元素的代数余子式。

C语言编程:一球从100米高度自由落下,每次落地后反弹回原来高度的一半,再落下,求它第10次落地时,共经过多少米,?第十次反弹多高?

C语言编程:一球从100米高度自由落下,每次落地后反弹回原来高度的一半,再落下,求它第10次落地时,共经过多少米,?第十次反弹多高?

C语言编程:字母大小写转换以及求字符串长度的两种方法

输入一串字符,输出结果为大写的变为小写,小写的变为大写 #include #include//求字符串长度的函数strlen()在里面 int main() { char s[20]; int...

C语言编程之递归求阶乘

题目: 利用递归方法实现一个函数,该函数能够实现n的阶乘,即 n! = n*(n-1)*…*3*2*1; #include int factorial(int n) { if(n == 1) ...

嵌入式C语言编程小知识总结

嵌入式C语言编程小知识1.   流水线被指令填满时才能发挥最大效能,即每时钟周期完成一条指令的执行(仅指单周期指令)。如果程序发生跳转,流水线会被清空,这将需要几个时钟才能使流水线再次填满。因此,尽量...

嵌入式C语言编程规范(个人规约)

0规范制定说明 0.1箴言 技术人员设计程序的首要目的是用于技术人员沟通和交流,其次才是用于控制CPU的。程序的生命力在于用户使用,程序的成长在于后期的维护及根据用户需求更新和升级功能。如果你的程序只...

Linux下的C语言编程——求三角形面积

求三角形面积 第一点,需要先判断是否是三角形 第二点,处理等边三角形 第三点,求面积 #include #include float solve_len(float a,float b,...

嵌入式系统C语言编程小心使用局部变量

问题: 今天同事在写一个STM32上的程序时,总是遇到内存溢出的错误。结果发现是因为使用了一个局部变量导致的。 因为C语言的局部变量被编译器自动放到栈区的空间(全局变量需要手动申请并释放空间)。嵌入式...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)