web-dev-qa-db-fra.com

calculer la somme des diagonales dans une matrice

Je dois calculer la somme de deux diagonales dans une matrice en C++, j'ai déjà une solution à cela, mais je dois être bête parce que je ne comprends pas ce qu'elle fait. J'aimerais donc savoir s'il existe une autre version que je peux comprendre. voici le code qui fait le travail:

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 partie difficile à comprendre est

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

Voici le code entier que j'ai changé mais cela ne fonctionne pas pour la diagonale secondaire:

#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;
}
10
Igor Ivanovski

Ce serait bien d'avoir des commentaires en anglais, mais, votre code fait (deuxième boucle):

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

Le code beaucoup plus agréable et efficace (en utilisant n au lieu de n^2) serait:

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

Cela va directement à travers les diagonales (les deux à la même boucle!) Et ne va pas à travers d'autres éléments.

MODIFIER:

La diagonale principale a les coordonnées {(1,1), (2,2), ..., (i,i)} (pour cette raison i == j).

La diagonale secondaire a les coordonnées (dans la matrice 3x3): {(1,3), (2,2),(3,1)} qui en général est: {(1,n-1+1), (2, n-2+1), ... (i, n-i+1), .... (n,1)}. Mais en C, les tableaux sont indexés à partir de 0, pas 1, vous n'aurez donc pas besoin de ce +1 (probablement).

Tous les éléments en diagonale secondaire qui doivent tenir la condition: i == n - j + 1 (à nouveau en raison de l'indexation de C de 0 +1 à -1 (i=0,, n=3, j=2, j = n - i - 1).

Vous pouvez réaliser tout cela en une boucle (code ci-dessus).

22
Vyktor
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

}

Pour mieux comprendre cet algorithme, vous devriez peindre une matrice sur votre cahier et numéroter ses éléments avec leur position dans la matrice, puis appliquer l’algorithme étape par étape.Je suis sûr à 100% que vous comprendrez.

6
boyd

Et si j'essayais d'expliquer cette version? :RÉ

Il y a 3 parties importantes du code:

  • entrer la matrice
  • calcul de la diagonale majeure (\ direction)
  • calcul de diagonale mineure (/ direction)

Et les voici, expliquèrent:

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

Ici, d et s contiennent les inter-valeurs des diagonales majeures et mineures respectivement. Au bout de 2 boucles, ils contiendront les résultats

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

J'espère que cela t'aides.

Notez que ce code démarre les coordonnées de la matrice à 1 au lieu de 0, vous devrez donc allouer un espace (n+1)x(n+1) pour la matrice:

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

avant de l'utiliser.

En outre, le code que vous avez donné n'est pas le plus efficace. Il a la complexité O(n^2), alors que la tâche peut être effectuée dans O(n) comme ceci:

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

vous devez utiliser i + j == n + 1 au lieu de i + j == n - 1 pour la diagonale secondaire i.e

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

    }
}
0
Tnahsoe Tnhsen
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
Abdul Rehman