Pubblicità

Lezione C++ Pratica – 12 – Operazioni avanzate con le matrici

Argomenti dell’articolo


Operazioni sulle matrici in C++: teoria e implementazione completa

Nel precedente articolo abbiamo visto come il file opmatrici2.cpp realizzi una calcolatrice matriciale tramite un menu interattivo.
In questa estensione entriamo nel cuore del codice, analizzando l’implementazione concreta delle funzioni e il modo in cui la matematica viene tradotta in C++.


Dichiarazione delle librerie e delle variabili

Il programma utilizza librerie standard fondamentali:

#include <iostream>
#include <iomanip>
using namespace std;
  • iostream → input/output
  • iomanip → formattazione dell’output
  • using namespace std → semplifica la sintassi

Le matrici vengono dichiarate come array bidimensionali statici:

int m1[100][100], m2[100][100], m3[100][100];

Questo approccio è semplice e adatto a scopi didattici.


Caricamento di una matrice

La funzione che permette all’utente di inserire i valori è:

void caricamatrice(int x[][100], int p, int q)
{
    for (int i = 0; i < p; i++)
        for (int j = 0; j < q; j++)
        {
            cout << "Elemento [" << i << "][" << j << "]: ";
            cin >> x[i][j];
        }
}

Cosa succede:

  • p → numero di righe
  • q → numero di colonne
  • Due cicli annidati permettono di scorrere l’intera matrice
  • Ogni elemento viene inserito manualmente

Stampa della matrice

Per visualizzare correttamente i dati:

void stampamatrice(int x[][100], int p, int q)
{
    for (int i = 0; i < p; i++)
    {
        for (int j = 0; j < q; j++)
            cout << setw(5) << x[i][j];
        cout << endl;
    }
}

L’uso di setw(5) rende l’output allineato e leggibile, migliorando l’esperienza dell’utente.


Somma di tutti gli elementi

int MatriceSomma(int x[][100], int p, int q)
{
    int s = 0;
    for (int i = 0; i < p; i++)
        for (int j = 0; j < q; j++)
            s += x[i][j];
    return s;
}

Questa funzione mostra:

  • uso di una variabile accumulatore
  • ritorno di un valore calcolato

Somma tra due matrici

void MatriceTotale(int x[][100], int y[][100], int z[][100], int p, int q)
{
    for (int i = 0; i < p; i++)
        for (int j = 0; j < q; j++)
            z[i][j] = x[i][j] + y[i][j];
}

📌 Nota importante:
le matrici devono avere le stesse dimensioni, condizione verificata nel menu principale.


Prodotto tra due matrici

void ProdottoMatrici(int x[][100], int y[][100], int z[][100],
                     int l1, int l2, int l3, int l4)
{
    for (int i = 0; i < l1; i++)
        for (int j = 0; j < l4; j++)
        {
            z[i][j] = 0;
            for (int k = 0; k < l2; k++)
                z[i][j] += x[i][k] * y[k][j];
        }
}

Qui avviene la magia matematica:

  • Triplo ciclo for
  • Traduzione diretta della formula del prodotto matriciale
  • z[i][j] è la somma dei prodotti riga × colonna

Calcolo del determinante

void stampa2matrice(int x[2][2])
{
	int i,j;
	printf("\n");
	for (i=0;i<2;i++)
	{	cout << setw(4);
		for (j=0;j<2;j++)
		{
			cout << "|";
			cout <<x[i][j]<<"\t";
			cout << "|";
		}
	cout <<"\n";
}}
void determinante(int z[][100],int &d,int p,int q)
{	int i,j;
	int r,sr,sc;
	int sub[2][2];
	if ((p==q) and (q==3)){
		for (r=0;r<3;r++) {
			for (i=0;i<2;i++)
				for (j=0;j<2;j++)
					{
						sr=(i< r ? i : i+1);
						sc=j+1;
						sub[i][j]=z[sr][sc];
					}
	stampa2matrice(sub);
	if (r % 2==0)
	 	d=d+z[r][0]*det2(sub);
	else
		d=d-z[r][0]*det2(sub);
 	}}
   else 
   	if (p==q and q==2)
   	 	d=z[0][0]*z[1][1]-z[1][0]*z[0][1];
	else
	{
		cout <<"\nNon posso calcolare il Determinante !\n";
	}
	   	
}
					}

Il determinante viene calcolato con la regola di Laplace il cui algoritmo è questo sotto riprotato.

Diagramma a blocchi dell'algoritmo di Laplace per il calcolo del determinante di una matrice 3 x 3

Nell’algoritmo sono presenti due sotto algoritmi uno per la stampa dei complementi algebrici e l’altro molto semplice per il calcolo di un determinante di una matrice 2 x 2.

Aspetti interessanti:

  • Uso del passaggio per riferimento
  • Applicazione diretta delle formule matematiche
  • Controllo sulle dimensioni della matrice

Il main() utilizza un ciclo do-while con switch:

do {
    cout << "1) Carica matrice\n";
    cout << "2) Somma elementi\n";
    cout << "3) Determinante\n";
    cout << "4) Prodotto matrici\n";
    cout << "5) Somma matrici\n";
    cout << "0) Esci\n";
    cin >> scelta;

    switch (scelta)
    {
        case 1: caricamatrice(m1, r, c); break;
        case 2: cout << MatriceSomma(m1, r, c); break;
        ...
    }
} while (scelta != 0);

Questo rende il programma:

  • interattivo
  • chiaro
  • facilmente ampliabile

Considerazioni finali

Questo progetto è un ottimo esempio di programmazione procedurale in C++, perfetto per:

  • comprendere array bidimensionali
  • consolidare funzioni e cicli
  • applicare matematica e informatica insieme

Il Codice completo

Per approfondire iscrivi al corso
“Dall’Algoritmo al C++ Base”

Sorgente C++

Codice Sorgnet

Video della lezione


In questa pagina sono presenti link di affiliazione che garantiscono a questo sito una piccola quota di ricavi, senza variazione del prezzo per l'acquirente.

Pubblicità