L’esercizio è apparentemente banale, ma può mettere nel sacco lo studente disattento alla definizione di matrice simmetria rispetto alla diagonale.
Una matrice quadrata, si dice simmetrica se I coefficienti sono simmetrici (a specchio se si preferisce) rispetto alla diagonale principale (che va dall’angolo in alto a sinistra a quello in basso a destra).
Es. di matrice simmetrica
1 | 2 | 3 |
2 | 5 | 4 |
3 | 4 | 7 |
Es. di matrice NON simmetrica
1 | 2 | 3 |
3 | 2 | 1 |
3 | 2 | 1 |
Qui occorre l’intuizione ma per lo studente meno esperto, in questo genere di problemi bisogna prima di tutto osservare. Riscriviamo una delle due matrici con gli indici in piccolo e cerchiamo qualche particolarità.
10,0 | 20,1 | 30,2 |
21,0 | 51,1 | 41,2 |
32,0 | 42,1 | 72,2 |
Dalla definizione questa è una matrice simmetrica e infatti notiamo che i numeri in posizione 0,1 e 1,0 sono uguali, così come 0,2 e 2,0; 2,1 e 1,2. Ma sta proprio qui che gli indici sono a specchio: basta un ciclo doppio per scorrere tutti gli elementi e verificare Ni,j =Nj,i. Ci occorre anche un sistema per tener traccia che i valori analizzati rispondano alla correttezza. Basta una coppia sballata, in automatico non abbiamo una matrice simmetrica.
Ecco perché qui, utilizzo una variabile booleana, ma poteva essere tranquillamente un intero da incrementare da zero, che diventa falsa quando almeno una coppia i,j j,i non ha numeri uguali. Tralasciamo le classiche e doverose funzioni per caricare e stampare la matrice.
#include <iostream>
using namespace std;
int const DIM = 100;
void caricaMatrice(int _m[DIM][DIM], int _n)
{
cout << "Preparati ad inserire la matrice" << endl;
for (int i=0; i < _n; i++)
{
cout << "Inserisci la "<< i+1 <<"° riga"<< endl;
for (int j=0; j < _n; j++)
{
cin >> _m[i][j];
}
}
}
void stampaMatrice(int _m[DIM][DIM], int _n)
{
cout << "La matrice caricata è: " << endl;
for (int i=0; i < _n; i++)
{
cout << endl;
for (int j=0; j < _n; j++)
{
cout << _m[i][j] << " ";
}
}
cout << endl;
}
bool simmetrica(int _m[DIM][DIM], int n)
{
bool isSimmetrica = true; //ipotizzo sia simmetrica
for (int i=0; i < n; i++)
{
for (int j=0; j < n; j++)
{
//per essere simmetrica controllo
if (_m[i][j] != _m[j][i])
{
isSimmetrica = false; //se trovo due caselle che non sono ok metto a falso
}
}
}
return isSimmetrica;
}
int main()
{
int n = 0 ;
int matrice[DIM][DIM];
bool ok;
cout << "Quanto vuoi sia grande la matrice da verifcare?" << endl;
cin >> n;
caricaMatrice(matrice, n);
stampaMatrice(matrice, n);
ok = simmetrica(matrice, n);
if (ok)
cout << "La matrice è simmetrica" << endl;
else
cout << "La matrice NON è simmetrica" << endl;
return 0;
}
Ultima modifica 5 Febbraio 2022