/*matrice2.cpp*/

// Allocazione dinamica di una matrice
// Primo metodo

#include <iostream>
using namespace std;

int main (void)
{
// Dichiarazione della matrice come puntatore a un vettore di puntatori
double **M;
int R, C;
int i, j;
double v;

// Inserimento del numero di righe e colonne della matrice
cout << "Righe e colonne: ";
cin >> R >> C;

// Creazione della matrice:
// Innanzitutto un vettore di R puntatori
M = new double* [R];
// poi a ogni puntatore viene allocata una diversa riga della matrice
for ( i = 0; i < R; i++ )
M[i] = new double [C];
// Ciclo infinito: uscita con break
while ( 1 ) {
// Lettura degli indici dell'elemento da inserire o leggere
cout << "Riga e colonna della matrice: ";
cin >> i >> j;

// L'utente viene invitato a inserire un valore alla riga i, colonna j
// oppure a scrivere 0 se desidera leggere quanto è contenuto in quella posizione
cout << "Valore (0 se si desidera leggerlo, negativo per uscire)";
cin >> v;
if ( v < 0 )
break;
if ( v != 0 )
// inserimento del valore alla posizione corretta del vettore.
// Notare l'uso dei due indici separati, come nel caso statico
M[i][j] = v;
else
// Scrittura del contenuto del vettore alla posizione richiesta
cout << M[i][j] << endl;
}

// Cancellazione della matrice:
// PRIMA vengono liberate le singole righe
for ( i = 0; i < R; i++ )
delete[] M[i];
// POI viene liberato il vettore di puntatori
delete[] M;

return 0;
}