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

100
050
007

Es. di matrice NON simmetrica (per via del 3)

100
320
000

 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,000,100,2
01,051,101,2
02,002,172,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