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;
}
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).
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.
Et si j'essayais d'expliquer cette version? :RÉ
Il y a 3 parties importantes du code:
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
}
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
}
}
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";
}