L’esercizio è apparentemente banale, ma può mettere nel sacco lo studente disattento alla definizione di matrice diagonale e dei valori ammessi in base alle coordinate dei singoli elementi della matrice stessa.
Una matrice quadrata, si dice diagonale se I coefficienti presenti sulla diagonale principale sono gli unici elementi diversi da zero ammessi. La diagonale principale è intesa la diagonale che parte dal primo elemento in alto a sinistra per arrivare all’ultimo in basso destra.
Es. di matrice diagonale. Tutti gli elementi
1 | 0 | 0 |
0 | 5 | 0 |
0 | 0 | 7 |
Es. di matrice NON simmetrica (per via del 3)
1 | 0 | 0 |
3 | 2 | 0 |
0 | 0 | 0 |
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 | 00,1 | 00,2 |
01,0 | 51,1 | 01,2 |
02,0 | 02,1 | 72,2 |
Dalla definizione questa è una matrice diagonale e infatti notiamo che i numeri in posizione 0,0 e 1,1 e 2,2 sono gli unici ad essere diversi da zero, meglio tutti gli elementi che non stanno sulla diagonale sono tutti pari a zero. Gli elementi della diagonale possono essere eventualmente essere anche loro stessi zero? SI, il paradosso è che una matrice con tutti zero è lo stesso diagonale. Se volessimo scomodare la sintassi matematica, gli elementi Ni,j = 0 con i ≠ j
A questo punto abbiamo gli elementi teorici per affrontare la codifica in C++. Per questo esercizio procediamo con l’utilizzo delle funzioni. Una di queste ci serve per caricare una matrice a mano, un’altra per caricare random in modo automatico la matrice, un’altra per il controllo della stessa. Due funzioni per caricare le matrici sono necessarie: la funzione random aiuta ma le probabilità di piazzare gli zeri nei punti giusti è bassa. Meglio utilizzare e ricompilare il nostro programmino per testare entrambe le funzioni a riga 87 e 88.
Le matrici sono quadrate di dimensione 100 ma ho scelto di far indicare all’utente quante caselle usare veramente.
#include <iostream>
#include <time.h>
#include <stdlib.h>
using namespace std;
int const DIM = 100;
/***
Usa una funzione casuale/randomica per estrarre un numero da 0 a 100
e lo inserisce a rotazione nelle caselle delle matrice
**/
void caricaMatriceRandom(int _m[DIM][DIM], int _n)
{
int numero;
for (int i=0; i< _n; i++)
{
for (int j=0; j< _n; j++)
{
numero = rand() % 100 +0;
_m[i][j] = numero;
}
}
}
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 diagonale(int _m[DIM][DIM], int n)
{
bool isDiagonale = true; //ipotizzo sia diagonale e controllo che non lo sia
for (int i=0; i < n; i++)
{
for (int j=0; j < n; j++)
{
//per essere diagonale controllo che gli elementi non in diagonale siano nulli
if (i != j && _m[i][j] != 0)
{
isDiagonale = false; //se trovo un elemento fuori diagonale diverso da zero dichiaro falsa la variabile
}
}
}
return isDiagonale;
}
int main()
{
int n = 0 ;
int matrice[DIM][DIM];
bool ok;
srand(time(NULL));
cout << "Quanto vuoi sia grande la matrice da verifcare? (inserisci un numero minore di 100)" << endl;
cin >> n;
//caricaMatriceRandom(matrice, n);
caricaMatrice(matrice, n);
stampaMatrice(matrice, n);
ok = diagonale(matrice, n);
if (ok)
cout << "La matrice è diagonale" << endl;
else
cout << "La matrice NON è diagonale" << endl;
return 0;
}
Ultima modifica 29 Gennaio 2022