2012-01-25 12 views
8

Necesito calcular la suma de dos diagonales en una matriz en C++, ya tengo una solución para eso, pero debo ser tonto porque no puedo entender lo que está haciendo, entonces lo haría Me gustaría saber si hay otra versión que pueda entender. aquí está el código que hace el trabajo:calcule la suma de diagonales en una matriz

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 que es difícil de entender es

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

Aquí está todo el código que he cambiado, pero no funciona para la diagonal secundaria:

#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

¿Tiene una pregunta específica sobre ¿Alguna parte de este código? –

+0

@DrewDormann, sí, este es el problema: if (j == n-i + 1 || i == n-j + 1) s = s + a [i] [j]; –

Respuesta

18

Sería bueno tener comentarios en Inglés, pero, el código hace (segundo bucle):

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 

el código mucho más agradable y mucho más eficaz (usando n, en lugar de n^2) sería:

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

Esto va directo a través de las diagonales (¡ambas en un bucle!) Y no pasa por otros elementos.

EDIT: tiene

diagonal principal coordenadas {(1,1), (2,2), ..., (i,i)} (para ello i == j).

La diagonal secundaria tiene coordenadas (en la matriz 3x3): {(1,3), (2,2),(3,1)} que en general es: {(1,n-1+1), (2, n-2+1), ... (i, n-i+1), .... (n,1)}. Pero en C, las matrices están indexadas desde 0, no 1, por lo que no necesitarás ese +1 (probablemente).

Todos esos elementos en diagonal secundaria que tiene que encajar condición: i == n - j + 1 (de nuevo debido a la indexación de C desde 0 +1 cambios a -1 (i=0,, n=3, j=2, j = n - i - 1)).

Puede lograr todo esto en un bucle (código anterior).

+0

@cyborg 'n = 5; i = 0; 'eso significaría que el segundo índice' j = 6; 'que está fuera de los límites (supongo que' j = 4' es correcto en este 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 

}

Para comprender mejor este algoritmo, debe pintar una matriz en su cuaderno y numerar sus elementos con su posición en la matriz, luego aplicar el algoritmo paso a paso. Estoy 100% seguro de que comprenderá

+1

Sí, pinté la matriz pero aun así me perdí ... pero ahora lo entiendo después de ver tu código, esto fue útil: if (i + j = n-1) –

+0

Intenta hacer lo que hace la computadora.Utiliza n = 3 y estos valores 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) (cambie la a en un número) Luego ingrese en bucle y anote su i y j y luego verifique si – boyd

+0

lo probé en C++ y no funcionó para la secundaria diagonal –

3

¿Qué tal si trato de explicar esta versión?: D

Hay 3 partes importantes del código:

  • inputing la matriz
  • calcular diagonal mayor (\ dirección)
  • calcular menor diagonal (/ dirección)

Y aquí están, explicó:

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

Aquí, dy s contienen los valores inter de diagonal mayor y menor, respectivamente. Al final de 2 bucles, contendrán los resultados

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

Espero que esto ayude.

Tenga en cuenta que este código se inicia matriz coordina a 1 en lugar de 0, por lo que en realidad se necesita para asignar (n+1)x(n+1) espacio para la matriz:

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

antes de usarlo.

Además, el código que proporcionó no es el más efectivo. Tiene O(n^2) complejidad, mientras que la tarea se puede hacer en O(n) así:

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

Creo que esta es la solución más simple para esta matriz. . . . !! –

0

debe utilizar i + j == n + 1 en lugar de i + j == n - 1 para decir diagonal secundaria

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 

    } 
} 
Cuestiones relacionadas