2010-11-03 42 views
3

下面是我的程序和即時通訊有問題的行列式函數。程序輸出問題

文件輸入:

2 
1 0 
0 1 
3 
8 9 1 
3 5 2 
-2 3 -1 
0 

,併爲其在讀楠爲輸入文件矩陣兩個行列式函數的結果的第二矩陣,什麼可能錯我的代碼可以去任何想法?

#include <iostream> 
#include <fstream> 
#include <cmath> 

using namespace std; 

const int maxsize = 10; 

ifstream fin; 
ofstream fout; 

void transpose (double omatrix[][maxsize],double tmatrix [][maxsize], int array_size) 
{ 
    for(int i = 0; i < array_size; i++) 
    { 
     for(int j = 0; j < array_size; j++) 
     { 
      tmatrix[j][i] = omatrix[i][j]; 
     } 


    } 
} 

void sub (double omatrix[][maxsize], double smatrix[][maxsize], int array_size, int i, int j) 
{ 
    int counter1 = 0, counter2 = 0; 

    for (int a = 0; a < array_size; a++) 
    { 
     if (a != i) 
     { 
      for (int b = 0; b < array_size; b++) 
      { 
       if (b != j) 
       { 
        smatrix[counter1][counter2] = omatrix[a][b]; 
        counter2++; 
       } 
      } 
      counter1++; 
     } 
    } 
} 

double determininant(double original_matrix[][maxsize], int array_size) 
{ 
    double D = 0.0, temp[maxsize][maxsize]; 

    if(array_size == 1) 
    { 
     return original_matrix[0][0]; 
    } 

    else if(array_size == 2) 
    { 
     return (original_matrix[0][0] * original_matrix[1][1]) - (original_matrix[0][1] * original_matrix[1][0]); 
    } 
    for(int i = 0; i < array_size; i++) 
    { 
     sub (original_matrix,temp,array_size, 0, i); 
     D += pow(-1.0,i) * original_matrix[0][i] * determininant(temp, array_size - 1); 
    } 
    return D; 
} 

void inverse(double omatrix[][maxsize], int array_size, double imatrix[][maxsize]) 
{ 
    double D = determininant(omatrix, array_size); 
    double c[maxsize][maxsize]; 

    if (D != 0) 
    { 
     for(int i = 0; i < array_size; i++) 
      { 
       for(int j = 0; j < array_size; j++) 
       { 
        sub (omatrix, c, array_size, i, j); 
        imatrix[j][i] = pow(-1.0, i+j) * determininant(c, array_size - 1)/D; 
       } 
      } 
    } 
} 

void mult(double omatrix[][maxsize], double imatrix[][maxsize], double pmatrix[][maxsize], int array_size) 
{ 
    for(int i = 0; i < array_size; i++) 
      { 
       for(int j = 0; j < array_size; j++) 
       { 
        pmatrix[i][j] = 0; 

        for(int k = 0; k < array_size; k++) 
        { 
         pmatrix[i][j] += omatrix[i][k] *imatrix[k][j]; 
        } 
       } 
      } 
} 

void print (const double m[][maxsize], int array_size) 
{ 
    for(int i = 0; i < array_size; i++) 
      { 
       for(int j = 0; j < array_size; j++) 
       { 
        fout << m[i][j] << " "; 
       } 
       fout << "\n"; 
      } 
      fout << "\n"; 
} 


int main() 
{ 
    double original_matrix[maxsize][maxsize], 
      inverse_matrix [maxsize][maxsize], 
      transposed_matrix[maxsize][maxsize], 
      product_matrix [maxsize][maxsize], 
      D; 


    int array_size; 

    fout.setf(ios::fixed); 
    fout.precision(2); 

    char File_Name[10]; 
    cout << "Please enter a name for the output file"; 
    cin >> File_Name; 

    fin.open ("input.txt"); 
    fout.open (File_Name); 

    if (fin.fail()) 
    { 
     cout << "Input file opening failed. \n"; 
     return 0; 
    } 

    while(fin >> array_size) 
    { 
     if(array_size != 0) 
     { 
      for(int i = 0; i < array_size; i++) 
      { 
       for(int j = 0; j < array_size; j++) 
       { 
        fin >> original_matrix[i][j]; 
       } 
      } 

      fout << "THE ORIGIONAL ARRAY! \n"; 
      print (original_matrix, array_size); 
      transpose (original_matrix, transposed_matrix, array_size); 
      fout << "THE TRANSPOSED VIRSION! \n"; 
      print (transposed_matrix, array_size); 
      fout << determininant(original_matrix, array_size) << "\n\n"; 
      inverse(original_matrix, array_size, inverse_matrix); 
      print (inverse_matrix, array_size); 
      mult(original_matrix, inverse_matrix, product_matrix, array_size); 
      print (product_matrix, array_size); 


     } 
    } 

    fin.close(); 
    fout.close(); 

    return 0; 
} 

輸出是:

THE ORIGIONAL ARRAY! 
1.00 0.00 
0.00 1.00 

THE TRANSPOSED VIRSION! 
1.00 0.00 
0.00 1.00 

1.00 

1.00 -0.00 
-0.00 1.00 

1.00 0.00 
0.00 1.00 

THE ORIGIONAL ARRAY! 
8.00 9.00 1.00 
3.00 5.00 2.00 
-2.00 3.00 -1.00 

THE TRANSPOSED VIRSION! 
8.00 3.00 -2.00 
9.00 5.00 3.00 
1.00 2.00 -1.00 

nan        <--------------------- is wrong should be -78.00 
                 which makes the next 2 mess up. 
0.00 -0.00 0.00 
-0.00 0.00 -0.00 
0.00 -0.00 0.00 

0.00 0.00 0.00 
0.00 0.00 0.00 
0.00 0.00 0.00 
+0

這是功課嗎? – Margus 2010-11-03 04:32:39

+2

是的,爲什麼我會想用矩陣做所有這些...... lol – Zud 2010-11-03 04:33:31

+0

你確定你的數組正在被正確讀取嗎? – 2010-11-03 04:36:28

回答

2

你忘了在sub(...)重置counter2。因此,您正在複製到結果矩陣中的錯誤位置,並在計算中使用未初始化的內存。

(故事的寓意是將變量儘可能放在最小的範圍內,並且實際需要它們。)

+0

好的診斷 – 2010-11-03 07:23:00

+0

你是上帝!非常感謝! – Zud 2010-11-03 07:29:13