Visual C++ .NET - alguien me puede explicar con detalle este program

 
Vista:

alguien me puede explicar con detalle este program

Publicado por juan david layton valenzuela (1 intervención) el 20/10/2009 00:15:03
hola muchachos les pido el favor que si alguien me puede explicar con detalle este codigo el cual no entiendo muy bien principalmente me gustaria saber que hace matriz.h y como se ejecuta claro esta como el resto del programa; es que quiero salir de muchas dudas y poder tambien de paso lograr una buena expocicion gracias espero pronta respuesta...

#include "matriz.h"
#include <conio.h>
#include <stdlib.h>

#define __MAX_DEC__ 5 // Cantidad m xima de decimales

static char *formato [] =
{ "%f ", "%5.0f ", "%7.1f ", "%8.2f ", "%9.3f ", "%10.4f ", "%11.5f " };

Matriz &Matriz::Cargar (int posx, int posy)
{
linea i, j;
float valor;
for (i = 0; i < m; i++, posy++)
for (j = 0; j < n; j++)
{
gotoxy (posx + 8 * j, posy);
cscanf ("%f", &valor);
elem [i] [j] = valor;
}
return *this;
}

void Matriz::Mostrar (int posx, int posy, int dec)
{
char *f = formato [dec < 0 || dec > __MAX_DEC__? 0: ++dec];
if (elem)
{
linea i, j;
for (i = 0; i < m; i++)
{
gotoxy (posx, posy++);
for (j = 0; j < n; j++) cprintf (f, elem [i] [j]);
}
}
}

Matriz &Matriz::HacerAzar ()
{
linea i, j;
for (j = 0; j < m; j++)
for (i = 0; i < n; i++)
elem [j] [i] = (float) (random (100) - random (100)) / (1 + random (10));
return *this;
}

Matriz &Anexar (Matriz &A, Matriz &B)
{
static Matriz M;
linea i, j, k;
if (A.m == B.m)
{
if (!M.Hacer (A.m, A.n + B.n))
for (i = 0; i < M.m; i++)
{
for (j = 0; j < A.n; j++) M [i] [j] = A [i] [j];
for (k = 0; k < B.n; k++) M [i] [j++] = B [i] [k];
}
}
else M.Cerrar ();
return M;
}

bool Matriz::Hacer (linea i, linea j)
{
if (i == m && j == n) return _F;
Cerrar ();
if ((m = i) && (n = j) && (elem = new float * [m]))
{
do elem [--i] = 0; while (i);
while ((elem [i] = new float [n]) && ++i < m);
}
return i < m? Cerrar (): _F;
}

Matriz &Matriz::SubMatriz (linea i, linea j)
{
static Matriz M;
linea p, q, r, s;
if (i < m && j < n)
{
if (!M.Hacer (m - 1, n - 1))
for (r = 0, p = 0; p < m; p++)
if (p != i)
{
for (s = 0, q = 0; q < n; q++)
if (q != j) M [r] [s++] = elem [p] [q];
r++;
}
}
else M.Cerrar ();
return M;
}

float Matriz::BuscarPivote (linea i, linea j)
{
linea k = i;
while (!elem [k] [j] && ++k < m);
if (k > i) IntercambiarFilas (k, i);
return elem [i] [j];
}

bool Matriz::IntercambiarFilas (linea i, linea j)
{
float r;
if (!(i < m && j < m)) return _V;
for (linea k = 0; k < n; k++)
{ r = elem [i] [k]; elem [i] [k] = elem [j] [k]; elem [j] [k] = r; }
return _F;
}

float Matriz::Adjunto (linea i, linea j)
{
float f = MenorComplementario (i, j);
return (i + j) % 2? -f: f;
}

float Matriz::MenorComplementario (linea i, linea j)
{ return SubMatriz (i, j).Determinante (); }

bool Matriz::Cerrar ()
{
if (elem)
{
while (m--) if (elem [m]) delete elem [m];
delete elem;
}
Iniciar ();
return _V;
}

Matriz &Matriz::operator = (Matriz &M)
{
if (!Hacer (M.m, M.n))
{
linea i, j;
for (i = 0; i < m; i++)
for (j = 0; j < n; j++)
elem [i] [j] = M [i] [j];
}
return *this;
}

Matriz &Matriz::HacerNula ()
{
linea i, j;
for (j = 0; j < m; j++)
for (i = 0; i < n; i++)
elem [j] [i] = 0;
return *this;
}

Matriz &Matriz::HacerIdentidad ()
{
linea i, j;
if (EsCuadrada ())
for (j = 0; j < m; j++)
for (i = 0; i < n; i++)
elem [j] [i] = i == j;
return *this;
}

Matriz &Matriz::HacerTriangular ()
{
linea i, j, k;
float p, q;
for (i = 1; i < m; i++)
for (j = 0; j < i && j < n; j++)
{
p = elem [i] [j];
q = elem [0] [j];
for (k = j; k < n; k++) elem [i] [k] -= (elem [0] [k] * p) / q;
}
return *this;
}

Matriz &Matriz::HacerDiagonal ()
{
linea i, x, y;
float pivote;
for (i = 0; i < m; i++)
if (!!(pivote = BuscarPivote (i, i)))
{
for (x = 0; x < m; x++)
if (x != i)
for (y = i + 1; y < n; y++)
elem [x] [y] -= (elem [i] [y] * elem [x] [i]) / pivote;
for (y = i + 1; y < n; y++) elem [i] [y] /= pivote;
for (x = 0; x < m; x++) elem [x] [i] = (x == i);
}
return *this;
}

bool Matriz::EsIdentidad ()
{
linea i, j;
bool es;
if (es = EsCuadrada ())
for (i = 0; es && i < m; i++)
for (j = 0; es && j < n; j++)
es = elem [i] [j] == float (i == j);
return es;
}

bool Matriz::EsNula ()
{
linea i, j;
bool es = _V;
for (i = 0; es && i < m; i++)
for (j = 0; es && j < n; j++)
es = !elem [i] [j];
return es;
}

bool Matriz::EsTriangular ()
{
linea i, j;
bool es = _V;
for (j = 1; es && j < m; j++)
for (i = 0; es && i < j && i < n; i++)
es = !elem [j] [i];
return es;
}

float Matriz::Determinante ()
{
linea i, j, k;
float d = 0, p;
if (EsCuadrada ())
switch (m)
{
case 1:
return elem [0] [0];
case 2:
return elem [0] [0] * elem [1] [1] - elem [1] [0] * elem [0] [1];
case 3:
for (i = 0; i < m; i++)
{
for (p = 1, k = i, j = 0; j < m && !!(p *= elem [k++ % m] [j++]); );
d += p;
}
for (i = 0; i < m; i++)
{
for (p = 1, k = m + i, j = 0; j < m && !!(p *= elem [k-- % m] [j++]); );
d -= p;
}
break;
default: for (j = 0; j < n; j++) d += elem [0] [j] * Adjunto (0, j);
}
return d;
}

Matriz &Matriz::operator * (Matriz &M)
{
static Matriz P;
linea i, j, k;
float p;
if (n == M.m)
{
if (!P.Hacer (m, M.n))
for (i = 0; i < P.m; i++)
for (j = 0; j < P.n; j++)
{
for (p = 0, k = 0; k < n; k++)
p += elem [i] [k] * M [k] [j];
P [i] [j] = p;
}
}
else P.Cerrar ();
return P;
}

Matriz &Matriz::operator * (float f)
{
static Matriz P;
linea i, j;
if (!P.Hacer (m, n))
for (i = 0; i < m; i++)
for (j = 0; j < n; j++)
P [i] [j] = elem [i] [j] * f;
return P;
}

Matriz &Matriz::operator + (Matriz &M)
{
static Matriz P;
linea i, j;
if (m == M.m && n == M.n)
{
if (!P.Hacer (m, n))
for (i = 0; i < m; i++)
for (j = 0; j < n; j++)
P [i] [j] = elem [i] [j] + M [i] [j];
}
else P.Cerrar ();
return P;
}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Alejandro

Análisis de código de clase Matriz en C++

Publicado por Alejandro (265 intervenciones) el 07/02/2024 19:41:22
Juan, este código parece ser parte de una implementación de una clase `Matriz` en C++. Analicemos algunas partes clave y proporcionemos una breve explicación de su funcionalidad:

1. Archivos de encabezado (`matriz.h`):
- El código incluye un archivo de encabezado llamado `matriz.h`. Los archivos de encabezado generalmente contienen declaraciones de clases, funciones y variables que se utilizan en varios archivos fuente del proyecto. Puedes revisar el contenido específico de `matriz.h` para entender las declaraciones relacionadas con la clase `Matriz`.

2. Definiciones de formato:
- Se define un array llamado `formato` que contiene especificadores de formato para imprimir números en diferentes precisiones. Este array se utiliza posteriormente en la función `Mostrar` para determinar cómo se deben mostrar los elementos de la matriz.

3. Función `Matriz::Cargar`:
- Esta función se utiliza para cargar valores en una instancia de la clase `Matriz`. Lee valores desde la consola y los almacena en la matriz.

4. Función `Matriz::Mostrar`:
- Muestra la matriz en la consola utilizando el formato especificado. Los valores de los elementos se formatean según la precisión proporcionada.

5. Funciones para manipulación de matrices:
- Existen diversas funciones para operaciones con matrices, como `HacerAzar` (inicializa la matriz con valores aleatorios), `Anexar` (anexa dos matrices), `SubMatriz` (devuelve una submatriz), entre otras.

6. Funciones para operaciones algebraicas:
- Se implementan funciones para operaciones algebraicas, como cálculo del determinante, multiplicación de matrices, suma de matrices, etc.

7. Sobrecarga de operadores:
- Se sobrecargan operadores como `=`, `*`, `+` para que puedan ser utilizados con objetos de la clase `Matriz`.

8. Funciones de evaluación de propiedades de la matriz:
- Se implementan funciones para evaluar propiedades de la matriz, como si es cuadrada, nula, triangular, identidad, etc.

Es importante tener en cuenta que este código parece ser solo una parte de la implementación de la clase `Matriz`. Para comprender completamente su funcionamiento, sería útil revisar el archivo de encabezado `matriz.h` y otros posibles archivos fuente relacionados.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar