Sei sulla pagina 1di 9

Dpto.

de Lenguajes y Sistemas Informticos U NIVERSIDAD DE C DIZ

Tema 2 Un ejemplo: la clase Matriz

I. Medina, G. Aburruzaga, F. Palomo y J. Argudo Programacin Orientada a Objetos.

Pgina 1

Clase Matriz

Clase Matriz

// Clase para matrices de nmeros en coma flotante // y doble precisin. #ifndef MATRIZ_H_ #define MATRIZ_H_ #include <valarray> class matriz { public: explicit matriz(size_t m = 1, size_t n = 1, double y = 0.0); matriz(size_t m, size_t n, double f(size_t i, size_t j)); size_t filas() const; size_t columnas() const; std::valarray<double>& operator [](size_t i); const std::valarray<double>& operator [](size_t i) const; matriz& operator +=(const matriz& a); matriz& operator -=(const matriz& a); matriz& operator *=(const matriz& a); friend matriz operator -(const matriz& a); private: size_t m, n; std::valarray<std::valarray<double> > x;

Tema 2. El paradigma de la programacin orientada a objetos

I. Medina, G. Aburruzaga, F. Palomo y J. Argudo

Pgina 2

Clase Matriz

}; // Prototipos de operadores externos no amigos que trabajan // con matrices. const matriz& operator +(const matriz& a); matriz operator +(const matriz& a, const matriz& b); matriz operator -(const matriz& a, const matriz& b); matriz operator *(const matriz& a, const matriz& b); // Definiciones en lnea. #include "matriz-inline.h" #endif

Tema 2. El paradigma de la programacin orientada a objetos

I. Medina, G. Aburruzaga, F. Palomo y J. Argudo

Pgina 3


// // // // // // Notas:

Clase Matriz

Clase Matriz
Este fichero contiene definiciones en lnea de funciones y operadores relacionados con la clase matriz y se incluye en la cabecera "matriz.h". Por lo tanto, no debe incluirse ni compilarse por separado.

// Constructores: matriz constante. inline matriz::matriz(size_t m, size_t n, double y): m(m), n(n), x(std::valarray<double>(y, n), m) {} // Dimensin. inline size_t matriz::filas() const { return m; } inline size_t matriz::columnas() const { return n; } // Operadores de ndice.
Tema 2. El paradigma de la programacin orientada a objetos

I. Medina, G. Aburruzaga, F. Palomo y J. Argudo

Pgina 4

Clase Matriz

inline std::valarray<double>& matriz::operator [](size_t i) { return x[i]; } inline const std::valarray<double>& matriz::operator [](size_t i) const { return x[i]; } // Operadores de auto-suma, auto-resta y auto-multiplicacin.

inline matriz& matriz::operator +=(const matriz& a) { x += a.x; return *this; } inline matriz& matriz::operator -=(const matriz& a) { x -= a.x; return *this; } inline matriz& matriz::operator *=(const matriz& a) { return *this = *this * a; }

Tema 2. El paradigma de la programacin orientada a objetos

I. Medina, G. Aburruzaga, F. Palomo y J. Argudo

Pgina 5


// Operadores de signo. inline const matriz& operator +(const matriz& a) { return a; } inline matriz operator -(const matriz& a) { matriz c(a); c.x = -c.x; return c; } // Operadores de suma y resta. inline matriz operator +(const matriz& a, const matriz& b) { return matriz(a) += b; } inline matriz operator -(const matriz& a, const matriz& b) { return matriz(a) -= b; }

Clase Matriz

Tema 2. El paradigma de la programacin orientada a objetos

I. Medina, G. Aburruzaga, F. Palomo y J. Argudo

Pgina 6

Mtodos de la clase Matriz

Mtodos de la clase Matriz

#include "matriz.h" // Constructor: matriz definida por una funcin de posicin. matriz::matriz(size_t m, size_t n, double f(size_t i, size_t j)) : m(m), n(n), x(std::valarray<double>(n), m) { for (size_t i = 0; i < m; ++i) for (size_t j = 0; j < n; ++j) x[i][j] = f(i, j); } // Operador de multiplicacin. matriz operator *(const matriz& a, const matriz& b) { matriz c(a.filas(), b.columnas()); // Matriz nula. for (size_t i = 0; i < a.filas(); ++i) for (size_t j = 0; j < b.columnas(); ++j) for (size_t k = 0; k < a.columnas(); ++k) c[i][j] += a[i][k] * b[k][j]; return c; }

Tema 2. El paradigma de la programacin orientada a objetos

I. Medina, G. Aburruzaga, F. Palomo y J. Argudo

Pgina 7


#include <iostream> #include "matriz.h" using namespace std;

Ejemplo de prueba

Ejemplo de prueba

// Insercin de una matriz en un flujo de salida. ostream& operator <<(ostream& fs, matriz& a) { for (size_t i = 0; i < a.filas(); ++i) { for (size_t j = 0; j < a.columnas(); ++j) fs << a[i][j] << ; fs << endl; } return fs; } // Funcin delta de Kronecker. inline double delta(size_t i, size_t j) { return i == j; }
Tema 2. El paradigma de la programacin orientada a objetos

I. Medina, G. Aburruzaga, F. Palomo y J. Argudo

Pgina 8

Ejemplo de prueba

// Prueba. int main() { matriz a(3, 3); matriz b(3, 3, 2.0); matriz c(3, 3, delta); a = c; cout << "A =\n" << a << b += -a; cout << "B =\n" << b << c *= c += c; cout << "C =\n" << c << matriz d(a + b * c); cout << "A + B * C =\n" }

// Matriz nula de 3 x 3. // Matriz de 3 x 3 con todos // sus elementos a 2. // Matriz identidad de 3 x 3. endl; endl; endl; << d << endl;

Tema 2. El paradigma de la programacin orientada a objetos

I. Medina, G. Aburruzaga, F. Palomo y J. Argudo

Potrebbero piacerti anche