程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> ”上三角“行列式源代碼(改良版,添加了幾種特殊情況的特殊處理)

”上三角“行列式源代碼(改良版,添加了幾種特殊情況的特殊處理)

編輯:關於C語言

#include<iostream.h>
#include<fstream.h>
#include<cmath>
void main()
{
 //輸入行列式開始
 int n,i,j,a[20][20],T[20],max[20],b[20],k,q,p,f=2,u=0;
 float t[20][20],c,sum=1,w[20];
 cout<<"階數:";
 cin>>n;
 ifstream   infile; //定義輸入文件類
    ofstream   outfile; //定義輸出文件類
    infile.open("D:\\考試題目.txt"); //打開一個輸入文件“考試題目.txt”
 for(i=1;i<=n;i++)
 {
  for(j=1;j<=n;j++)
  {
    infile>>a[i][j];//將“考試題目.txt”中的十個整型數輸入到a[i]中
  }
 }
 infile.close();//關閉輸入文件
 //輸入行列式階數
 for(j=1;j<=n;j++)//從第一列開始找起
 {
  T[j]=0;      //將計數器初始化為0
  for(i=1;i<=n;i++)
  {
   if(a[i][j]==0)//在j列中每找到一個0就計數
   {
    T[j]++;//統計第j列中0的個數
   }
  }
 }
 outfile.open("D:\\答案.txt"); //打開一個輸出文件“答案.txt”
 //此循環結束後已經將每列的0的個數存儲到數組T[j]中
 //開始比較每列0的個數並排列
 for(i=1;i<=n;i++)//經過n次循環將T[j]從大到小排列
 {
  max[i]=-100;
  for(j=1;j<=n;j++)
  {
   max[i]=(max[i]>T[j])?max[i]:T[j];
  }
  //找出第i個最大值
  for(j=1;j<=n;j++)//通過一個循環找到第i個最大值對應的列數j j是對應的列數
  {
   if(max[i]==T[j])
   {
    T[j]=-200;//將T[j]設為較小的數
    //outfile<<"第"<<j<<"列:"<<max[i]<<"個0"<<endl;
    
    b[i]=j;
    break;
   }
  }
 }
 outfile<<"------------------------------------行列式答案-------------------------------------"<<endl;
 //打印新的行列式
    outfile<<"第1步:換列:"<<endl;
 for(i=1;i<=n;i++)
 {
  for(j=1;j<=n;j++)
  {
   t[i][j]=float(a[i][b[j]]);
   //判斷換列次數
   if(i==1&&j!=b[j])
   {
    u++;
   }
   outfile<<t[i][j]<<" ";
  }
  outfile<<endl;
 }
 //判斷第一個數是0的特殊情況的解決辦法
 if(t[1][1]==0)
 {
  for(i=2;i<=n;i++)
  {
   if(t[i][1]!=0)
   {
    for(j=1;j<=n;j++)
    {
     w[j]=t[i][j];
     t[i][j]=t[1][j];
     t[1][j]=w[j];
    }
    break;
   }
  }
  u++;
 }
 //換列結束,將新的行列式重新存儲在一個新的數組中t[][]
 for(j=1;j<n;j++)//列
 {
  for(k=j+1;k<=n;k++)//j列需化為0的行
  {
   if(t[k][j]!=0)
   {
    for(i=j;i<=n;i++)//行
    {
     if(t[i][j]!=0&&i!=k)
     {
      p=0;
      c=float(t[k][j]/t[i][j]);
      for(q=1;q<=n;q++)//列
      {
       t[k][q]=t[k][q]-c*t[i][q];
       if(abs(t[k][q])<0.0001&&k!=q)
       {
        t[k][q]=0;
       }
       p++;
      }
      //打印中間過程
      outfile<<"第"<<f++<<"步:r["<<k<<"]-"<<c<<"r["<<i<<"]:"<<endl;
      for(int s=1;s<=n;s++)
      {
       for(int d=1;d<=n;d++)
       {
        outfile<<t[s][d]<<" ";
       }
       outfile<<endl;
      }
      if(p==n)
      {
       break;
      }
     }
    }
   }
  }
 }
 for(i=1;i<=n;i++)
 {
  sum=t[i][i]*sum;
 }
    outfile<<"第"<<f++<<"步:"<<endl;
 if(u!=0)
 {
  u=u-1;
 }
 outfile<<"該行列式最終結果="<<sum*pow(-1,u)<<endl;
 outfile.close();//關閉輸出文件

 

}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved