2012-01-25 22 views
8

Ho bisogno di calcolare la somma di due diagonali in una matrice in C++, ho già una soluzione per questo ma devo essere stupido perché non capisco cosa sta facendo, quindi vorrei Mi piacerebbe sapere se c'è un'altra versione che posso capire. ecco il codice che fa il lavoro:calcola la somma di diagonali in una matrice

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]; 
    } 

La parte che è difficile da capire è

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

Qui è l'intero codice che ho cambiato, ma pretende molto lavoro per la diagonale secondaria:

#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

Avete una domanda specifica su qualche parte questo codice? –

+0

@DrewDormann si questo è il problema: if (j == n-i + 1 || i == n-j + 1) s = s + a [i] [j]; –

risposta

18

Sarebbe bello avere commenti in inglese, ma, il vostro codice fa (secondo anello):

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 

il codice molto più bello e molto più efficace (usando n, invece di n^2) sarebbe:

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) 
} 

Questo va dritto attraverso le diagonali (entrambe in un unico loop!) E non passa attraverso altri elementi.

EDIT:

diagonale principale ha coordinate {(1,1), (2,2), ..., (i,i)} (Perciò i == j).

La diagonale secondaria ha coordinate (nella matrice 3x3): {(1,3), (2,2),(3,1)} che in generale è: {(1,n-1+1), (2, n-2+1), ... (i, n-i+1), .... (n,1)}. Ma in C, gli array sono indicizzati da 0, non 1 quindi non sarà necessario quello +1 (probabilmente).

Tutti gli elementi in diagonale secondaria che deve adattarsi condizione: i == n - j + 1 (ancora a causa di indicizzazione C da 0 +1 modifiche -1 (i=0,, n=3, j=2, j = n - i - 1)).

È possibile ottenere tutto questo in un ciclo (codice sopra).

+0

@cyborg 'n = 5; i = 0; 'questo significherebbe quel secondo indice' j = 6; 'che è fuori dai confini (presumo' j = 4' sia corretto in questo caso). – 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 

}

Per capire meglio questo algoritmo devi dipingere una matrice sul tuo notebook e numerare gli elementi con la loro posizione in matrice, quindi applicare l'algoritmo passo dopo passo. Sono sicuro al 100% che capirai

+1

Sì, ho dipinto la matrice ma mi sono perso .. ma ora lo capisco dopo aver visto il tuo codice questo è stato utile: if (i + j = n-1) –

+0

Prova a fare ciò che fa il computer. Usa n = 3 e questo valore 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) (cambia l'a in un numero) Quindi vai in ciclo for e annota i tuoi i e j e poi controlla if se – boyd

+0

Ho provato questo in C++ e non ha funzionato per il secondario diagonale –

3

Che ne dici di provare a spiegare questa versione?: D

Ci sono 3 parti importanti del codice:

  • inputing matrice
  • calcolo diagonale maggiore (\ direzione)
  • calcolo minore diagonale (/ direzione)

Ed eccoli qui, spiegati:

// 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 
} 

Qui, d e s contengono rispettivamente gli inter-valori della diagonale maggiore e minore. Alla fine di 2 cicli, conterranno i risultati

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) ... 
     } 

Spero che questo aiuti.

noti che questo codice inizia matrice coordinate da 1 invece di 0, quindi sarà effettivamente necessario allocare (n+1)x(n+1) spazio per la matrice:

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

prima dell'uso.

Inoltre, il codice che hai fornito non è più efficace. Ha O(n^2) complessità, mentre il compito può essere fatto in O(n) in questo modo:

// 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

Penso che questa sia la soluzione più semplice per questa matrice. . . . !! –

0

è necessario utilizzare i + j == n + 1 invece di i + j == n - 1 per es diagonale secondaria

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 

    } 
} 
Problemi correlati