-
Notifications
You must be signed in to change notification settings - Fork 0
/
Matrice.h
executable file
·77 lines (70 loc) · 2.16 KB
/
Matrice.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
// Matrice.h: interface for the Matrice class.
//
//////////////////////////////////////////////////////////////////////
#ifndef MATRICE_H
#define MATRICE_H
#include "Vettore.h"
template <class T>
class Matrice: public Vettore< Vettore<T> >
{
protected:
int vjmin, vjmax; // indici minimo e massimo di colonnna
// funzione di utilità per copiare una matrice
void copia( const Matrice& MC )
{ for ( int i = Vettore<VetT>::imin(); i <= Vettore<VetT>::imax(); i++ )
for ( int j = jmin(); j <= jmax(); j++ )
(*this)(i,j) = MC(i,j);
}
public:
typedef Vettore<T> VetT;
// FUNZIONI COSTANTI
// true se matrice nulla
bool nulla( ) const { return Vettore<VetT>::nullo(); }
// indice minimo di colonna
int jmin( ) const {return vjmin;}
// indice massimo di colonna
int jmax( ) const {return vjmax;}
// restituisce il numero di colonne
int m( ) const {return jmax()-jmin()+1;}
// restituisce il valore elemento (i,j)
virtual const T& operator() ( int i, int j ) const
{ assert(! nulla() );
return (*this)[i][j];
}
// FUNZIONI NON COSTANTI
// costruttore di matrice nulla
Matrice( ) {vjmin = 1; vjmax = 0;}
// dimensionamento a partire da una matrice nulla
void init( int iMn, int iMx, int jMn, int jMx )
{
assert ( nulla() );
assert ( iMn <= iMx && jMn <= jMx );
Vettore<VetT>::init(iMn,iMx); // crea il vettore di righe
for ( int i = iMn; i <= iMx; i++ )
(*this)[i].init(jMn,jMx); // crea ogni singola riga
vjmin = jMn; vjmax = jMx;
}
// costruttore di matrice non nulla
Matrice( int iMn, int iMx, int jMn, int jMx )
{ init(iMn,iMx,jMn,jMx);
}
// costruttore per copia profonda
Matrice( const Matrice& M )
{ init(M.imin(),M.imax(),M.jmin(),M.jmax());
copia(M);
}
// restitusce l'elemento(i,j) come l-value per eventuali modifiche
virtual T& operator() ( int i, int j )
{ assert(! nulla() );
return (*this)[i][j];
}
// assegnamento profondo
Matrice& operator= ( const Matrice& MC )
{ if ( this == &MC ) return *this;
assert ( VetT::imin() == MC.imin() && VetT::imax() == MC.imax() &&
jmin() == MC.jmin() && jmax() == MC.jmax() );
copia(MC);
return *this;
}
};
#endif