// matriz.cpp - Definición de los métodos de la clase CMatriz
#include <iostream>
#include "matriz.h"
using namespace std;

//////////////////////////////////////////////////////////////////
// Matriz multidimensional basada en una unidimensional
//
void CMatriz::construir(int n, int *dim)
{
  int i;
  for (i = 0; i < n; i++)
    if (dim[i] < 1)
    {
      cerr << "Dimensión nula o negativa\n";
      exit(-1);
    }
  // Establecer los atributos
  dimsMatriz = new int[n];
  for (i = 0; i < n; i++) dimsMatriz[i] = dim[i];
  nDims = n;
  matriz = new double[totalElementos()];
}

CMatriz::CMatriz(int d1, int d2, int d3) // constructor
{
  int nDims = 0;
  if (d3) nDims = 3; else if (d2) nDims = 2; else nDims = 1;
  int dim[] = { d1, d2, d3 }; // tres dimensiones
  construir(nDims, dim);
}

CMatriz::~CMatriz()
{
  delete [] matriz;
  delete [] dimsMatriz;
}

int CMatriz::totalElementos() const
{
  int i;
  int nTElementos = 1;
  // Calcular el número total de elementos de la matriz
  for (i = 0; i < nDims; i++)
    nTElementos *= dimsMatriz[i];
  return nTElementos;
}

int CMatriz::desplazamiento(int *subind) const
{
  int i;
  int desplazamiento = 0;

  for (i = 0; i < nDims; i++)
  {
    // Verificar si los subíndices están dentro del rango
    if (subind[i] < 0 || subind[i] >= dimsMatriz[i])
    {
      cout << "Subíndice fuera de rango\n";
      return -1;
    }
    // Desplazamiento equivalente en la matriz unidimensional
    desplazamiento += subind[i];
    if (i+1 < nDims)
      desplazamiento *= dimsMatriz[i+1];
  }
  return desplazamiento;
}

void CMatriz::asignarDato(int dato, int i1, int i2, int i3)
{
  // Asignar un valor al elemento especificado de la matriz
  int subind[] = { i1, i2, i3 };
  int i = desplazamiento(subind);
  if (i == -1) exit(-1); // subíndice fuera de rango
  matriz[i] = dato;
}

double CMatriz::obtenerDato(int i1, int i2, int i3) const
{
  // Obtener el valor al elemento especificado de la matriz
  int subind[] = { i1, i2, i3 };
  int i = desplazamiento(subind);
  if (i == -1) exit(-1); // subíndice fuera de rango
  return matriz[i];
}
//////////////////////////////////////////////////////////////////

