Matrice diagonale in C++

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