#include <iostream>
#include <cstdlib>
#include <vector>
using namespace std;
class Matriz {
public:
Matriz();
Matriz( int, int );
Matriz( const Matriz &m );
Matriz operator+ ( const Matriz &m2 );
Matriz operator* ( const Matriz &m2 );
void LeerMatriz();
void ActualizarMatriz(); //! Pendiente
void ImprimirMatriz();
void EscalarMatriz( int );
void InversaMatriz(); //! Pendiente
bool IdentidadMatriz();
static int obtenerCuentaMatriz();
private:
int **m_matriz;
int cols;
int rows;
static int cuentaMatriz;
};
int Matriz::cuentaMatriz = 0;
//! constructor por defecto
Matriz::Matriz(){
cols = 4;
rows = 4;
}
//! constructor cópia
Matriz::Matriz( const Matriz &m ){ *this = m; }
//! constructor por parámetro
Matriz::Matriz( int c , int r ){
(c < 0 || c > 4 ? 4 : c );
(r < 0 || r > 4 ? 4 : r );
cols = c;
rows = r;
m_matriz = new int*[rows];
for (int i = 0; i < rows; i++) {
m_matriz[i] = new int[cols];
}
}
//! Suma de matrices
Matriz Matriz::operator+ (const Matriz &m2)
{
Matriz matriz_result(rows, cols);
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
matriz_result.m_matriz[i][j] = m_matriz[i][j] + m2.m_matriz[i][j];
}
}
return matriz_result;
}
//! Multiplicación de matrices
Matriz Matriz::operator* (const Matriz &m2)
{
Matriz matriz_result(rows, m2.cols);
int total;
for (int i = 0; i < rows; i++) {
for (int j = 0; j < m2.cols; j++) {
for (int k = 0; k < cols; k++) {
total += (m_matriz[i][k] * m2.m_matriz[k][j]);
}
matriz_result.m_matriz[i][j] = total;
total = 0;
}
}
return matriz_result;
}
void Matriz::LeerMatriz(){
int elemento;
cout << "\n";
for (int i = 0; i < rows; i++) {
cout << "Fila " << i + 1 << endl;
for (int j = 0; j < cols; j++) {
cout << "Ingresa el elemento " << j + 1 << ": ";
cin >> elemento;
m_matriz[i][j] = elemento;
}
cout << endl;
}
cuentaMatriz++;
}
void Matriz::ImprimirMatriz() {
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
cout << m_matriz[i][j] << " ";
}
cout << "\n\n";
}
cout << "\n" << endl;
}
void Matriz::EscalarMatriz( int n ) {
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
m_matriz[i][j] = m_matriz[i][j] * n;
}
}
cout << "Se multiplicó a la Matriz por el escalar " << n << endl;
}
bool Matriz::IdentidadMatriz() {
if (rows != cols) {
return false;
}
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
if (i == j) {
if (m_matriz[i][j] != 1)
return false;
} else {
if (m_matriz[i][j] != 0)
return false;
}
}
}
return true;
}
int Matriz::obtenerCuentaMatriz() { return cuentaMatriz; }
int OpMenu(){
int op;
do{
cout << "\n"
<< " Matrices\n"
<< "===============================\n"
<< "1.- Leer ............ (Pulsa 1)\n"
<< "2.- Actualizar ...... (Pulsa 2)\n"
<< "3.- Iprimir ......... (Pulsa 3)\n"
<< "4.- Sumar ........... (Pulsa 4)\n"
<< "5.- Multiplicar ..... (Pulsa 5)\n"
<< "6.- Escalar ......... (Pulsa 6)\n"
<< "7.- Inversa ......... (Pulsa 7)\n"
<< "8.- Identidad ....... (Pulsa 8)\n"
<< "9.- Salir ........... (Pulsa 9)\n"
<< "===============================\n"
<< "INTRODUZCA UNA OPCION (1-9): ";
cin >> op;
if( cin.fail() || cin.bad() ){
op = 0;
cin.clear();
cin.ignore(80, '\n');
}
}while( op < 1 || op > 9 );
cout << "\n";
return op;
}
int main(){
vector<Matriz> v;
int opcion;
int escalar;
int c, r;
cout << "Número de columnas de la Matriz: ";
cin >> c;
cout << "Número de filas de la Matriz: ";
cin >> r;
Matriz m(c, r);
Matriz t(c, r);
do{
opcion = OpMenu();
switch( opcion ){
case 1:
m.LeerMatriz();
v.push_back(m);
break;
case 2:
break;
case 3:
m.ImprimirMatriz();
break;
case 4:
t = v[0] + v[1];
t.ImprimirMatriz();
break;
case 5:
t = v[0] * v[1];
t.ImprimirMatriz();
break;
case 6:
cout << "Escalar: ";
cin >> escalar;
m.EscalarMatriz(escalar);
m.ImprimirMatriz();
break;
case 7:
break;
case 8:
cout << (m.IdentidadMatriz() ? "" : "No") << " Es identidad." << endl;
break;
default:
break;
}
}while( opcion != 9 );
}