2012-01-25 55 views
8

Tôi cần tính tổng hai đường chéo trong ma trận trong C++, tôi đã có giải pháp cho điều đó nhưng tôi phải câm vì tôi không thể hiểu nó đang làm gì, vì vậy tôi sẽ muốn biết nếu có một phiên bản khác mà tôi có thể hiểu được. đây là đoạn code mà không được công việc:tính tổng các đường chéo trong ma trận

cout<<"Jepi rangun e matrices"<<endl; // pra bejme manipulim me matrice katrore ku rreshtat=kolonat 
cin>>n; 
cout<<"Tani jepi elementet e matrices"<<endl; // lexohet matrica 

for(i=1;i<=n;i++) 
{ 
    for(j=1;j<=n;j++) 
     cin>>a[i][j]; 
} 

d=0; 
s=0; // ketu e keni kushtin si dhe mbledhjen per te dy diagonalet me dy variabla te ndryshme 

for(i=1;i<=n;i++) 
    for(j=1;j<=n;j++) 
    { 
     if(i==j) 
      d=d+a[i][j]; 
     if(j==n-i+1 || i==n-j+1) 
      s=s+a[i][j]; 
    } 

Phần này rất khó hiểu là

if(j==n-i+1 || i==n-j+1) 
    s=s+a[i][j]; 

Dưới đây là toàn bộ mã mà tôi đã thay đổi nhưng nó không làm việc cho đường chéo thứ:

#include <iostream> 
using namespace std; 

int main() 
{ 
    int d=0,s=0; // ketu e keni kushtin si dhe mbledhjen per te dy diagonalet me dy variabla te ndryshme 
    int i,j,n; 
    int a[5][5]; 

    cout<<"Jepi rangun e matrices"<<endl; // pra bejme manipulim me matrice katrore ku rreshtat=kolonat 
    cin>>n; 
    cout<<"Tani jepi elementet e matrices"<<endl; // lexohet matrica 

    for(i=1;i<=n;i++) 
    { 
     for(j=1;j<=n;j++) 
      cin>>a[i][j]; 
    } 

    for(i=1;i<=n;i++) 
    { 
     for(j=1;j<=n;j++) 
     { 
      if(i==j) 
       d+=a[i][j]; //principal diagonal 
      if(i+j==n-1) 
       s+=a[i][j];//secondary diagonal 

     } 
    } 

    cout << d << endl; 
    cout << s << endl; 
    cin.get(); 
    cin.get(); 
    return 0; 
} 
+0

Bạn có một câu hỏi cụ thể về bất kỳ phần nào mã này? –

+0

@DrewDormann vâng đây là vấn đề: nếu (j == n-i + 1 || i == n-j + 1) s = s + a [i] [j]; –

Trả lời

18

Nó sẽ là tốt đẹp để có ý kiến ​​bằng tiếng Anh, nhưng, mã của bạn không (vòng lặp thứ hai):

browse all rows 
    browse all cells 
    if i == j (is in main diagonal): 
     increase one sum 
    if i == n - i + 1 (the other diagonal) 
     increase the second sum 

mã đẹp hơn nhiều và hiệu quả hơn nhiều (sử dụng n, thay vì n^2) sẽ là:

for(int i = 0; i < n; i++){ 
    d += a[i][i]; // main diagonal 
    s += a[i][n-i-1]; // second diagonal (you'll maybe need to update index) 
} 

Điều này đi thẳng trough diagonals (cả hai tại một vòng!) Và không đi máng các mặt hàng khác.

EDIT:

Main chéo có tọa độ {(1,1), (2,2), ..., (i,i)} (do i == j).

Đường chéo thứ cấp có tọa độ (trong ma trận 3x3): {(1,3), (2,2),(3,1)} nói chung là: {(1,n-1+1), (2, n-2+1), ... (i, n-i+1), .... (n,1)}. Nhưng trong C, các mảng được lập chỉ mục từ 0, không phải 1 vì vậy bạn sẽ không cần đến số đó +1 (có thể).

Tất cả những mặt hàng trong đường chéo thứ hơn có để phù hợp với điều kiện: i == n - j + 1 (một lần nữa do lập chỉ mục C từ 0 +1 thay đổi -1 (i=0,, n=3, j=2, j = n - i - 1)).

Bạn có thể đạt được tất cả điều này trong một vòng lặp (mã ở trên).

+0

@cyborg 'n = 5; i = 0; 'có nghĩa là chỉ số thứ hai' j = 6; 'nằm ngoài ranh giới (tôi giả sử' j = 4' là đúng trong trường hợp này). – Vyktor

4
int diag1=0; 
int diag2=0; 

for (i=0;i<n;i++) 
for (j=0;j<n;j++){ 

    if(i==j) diag1+=a[i][j]; //principal diagonal 
    if(i+j==n-1) diag2+=a[i][j];//secondary diagonal 

}

Để hiểu thuật toán này tốt hơn bạn nên vẽ một ma trận trên máy tính xách tay của bạn và số đó là các phần tử với vị trí của chúng trong ma trận, sau đó áp dụng bước thuật toán theo bước.I chắc chắn 100% bạn sẽ hiểu được

+1

Vâng tôi vẽ ma trận nhưng tôi đã bị mất .. nhưng bây giờ tôi hiểu nó sau khi tôi thấy mã của bạn này là hữu ích: nếu (i + j = n-1) –

+0

Cố gắng làm những gì máy tính làm. Sử dụng n = 3 và giá trị này a (1,1) a (1,2) a (1,3), a (2,1) a (2,2) a (2,3), a (3,1) a (3,2) a (3,3) (thay đổi số trong một số) Sau đó đi vòng lặp và lưu ý i và j của bạn và sau đó kiểm tra nếu – boyd

+0

Tôi đã thử điều này trong C++ và nó không hoạt động cho chéo –

3

Tôi cố gắng giải thích phiên bản này như thế nào?: D

Có 3 bộ phận quan trọng của mã:

  • inputing ma trận
  • tính lớn chéo (\ hướng)
  • tính nhỏ chéo (/ hướng)

Và ở đây chúng được giải thích:

// input elements 
for(i=1;i<=n;i++) // from left to right 
{ 
    for(j=1;j<=n;j++) // from up to down 
     cin>>a[i][j]; // input element at (i,j) position 
} 

Ở đây, d và s chứa các giá trị tương ứng của đường chéo lớn và nhỏ tương ứng. Ở cuối 2 vòng, chúng sẽ chứa kết quả

for (i=1;i<=n;i++) 
    for (j=1;j<=n;j++) 
    { 
     if(i==j)   // major diagonal - if coordinates are the same 
      d=d+a[i][j]; // e.g. (1,1), (2,2) 
     if(j==n-i+1 || i==n-j+1) // coordinates of the minor diagonal - check 
      s=s+a[i][j];   // e.g. n=3 (3,1) (2,2) ... 
     } 

Hy vọng điều này sẽ hữu ích.

Lưu ý rằng mã này bắt đầu ma trận phối tại 1 thay vì 0, do đó bạn sẽ thực sự cần phải phân bổ (n+1)x(n+1) không gian cho các ma trận:

double a[n+1][n+1]; 

trước khi sử dụng nó.

Ngoài ra, mã bạn đã cung cấp không hiệu quả nhất. Nó có O(n^2) phức tạp, trong khi nhiệm vụ có thể được thực hiện trong O(n) như vậy:

// matrix coordinates now start from 0 
for (int i=0; i < n; ++i){ 
    d += a[i][i]; // major 
    s += a[i][n-1-i]; // minor 
} 
0
int num[5][5]={0}; //decleration 
int i=0,j=0,sum=0; 
for (int i=0;i<5;i++) 
{ 
    for (int j=0;j<5;j++) 
    { 
     cin>>num[i][j]; 
    }       //Taking Matrix input 
} 
     cout<<endl<<"The Matrix is "<<endl; 
    for (int i=0;i<5;i++) 
    { 
     for (int j=0;j<5;j++) 
     { 
      cout<<num[i][j]<<" "; 
     } 
      cout<<endl;    //Displaying the Matrix 
    }        
cout<<endl<<"The sum of diagonals of the matrix is "<<endl; 
if(i==j) 
{ 
    for (i=0;i<5;i++) 
    { 
     for (j=0;j<5;j++) 
     { 
      if (i==j)  //This loop works where i and j will be equal 
      { 
      sum=sum+num[i][j]; 
      } 
     } 
    } 
    cout<<sum; 
} 
else //Some times the user creates 4 x 3 matrix or so than diagonals not match so. . . 
{ 
    cout<<"The sum is not Possible"; 
} 
+0

Tôi nghĩ đây là giải pháp đơn giản nhất cho ma trận này. . . . !! –

0

bạn phải sử dụng i + j == n + 1 thay vì i + j == n - 1 cho tức là đường chéo thứ

for(i = 1; i <= n; i++) 
{ 
    for(j = 1; j <= n; j++) 
    { 
     if(i == j) 
      d += a[i][j]; //principal diagonal 
     if(i + j == n+1) 
      s += a[i][j];//secondary diagonal 

    } 
} 
Các vấn đề liên quan