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

/************************************************************************
功能: 用递归方法求行列式的值
作者: 黄志斌 于 广西河池
在自学《高等数学(二)》时,做行列式习题所得结果有些与教材所附
答案不一致,为了验证究竟答案的正确性,编写了这个程序。
其实用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;
  }
 }
}
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值