Page 1

Anuncio
//-------------------------------------------------------------------------#ifndef classmatrizH
#define classmatrizH
#include <stdio.h>
//-------------------------------------------------------------------------/*
Este ejercicio fue desarrollado en el año lectivo 2014
Los alumnos deberán agregar a la clase matriz todos los atributos
y métodos especificados (permutación de filas, columnas, suma,
producto, etc)
durante la clase del día 03/09/2016.
Observar que ya están desarrollados los constructores copia, los
signos igual y
el cálculo del determinante
*/
class TMatriz
{
private:
double **a;
int fil, col;
void alocar( int f, int c);
void dealocar(void);
public:
TMatriz( int f, int c );
TMatriz( TMatriz & m );
~TMatriz();
int fils(void){return fil;}
int cols(void){return col;}
double & t( int f, int c){return a[f][c];}
double & operator()(int f, int c ){return t(f,c);}
TMatriz &operator=(TMatriz m );
double determinante(void);
};
#endif
//-------------------------------------------------------------------------#pragma hdrstop
#include "classmatriz.h"
//-------------------------------------------------------------------------#pragma package(smart_init)
void mostrar( TMatriz & m )
{
/*
OBSERVAR QUE ESTE PROCEDIMIENTO NO PERTENECE A LA CLASE
FUE PUESTO UNICAMENTE PARA DEPURAR LOS METODOS DE LA CLASE
*/
int i, j;
for( i = 0; i < m.fils(); i++ )
{
for( j = 0; j < m.cols(); j++ )
{
printf( "%lf\t", m(i,j));
}
printf( "\n");
}
printf("\n" );
}
void TMatriz::alocar( int f, int c)
{
int i, j;
fil = f;
col = c;
a = new double *[f];
for( i = 0; i < f; i++ )
{
a[i] = new double[c];
for( j = 0; j < col; j++ )
{
a[i][j] = 0;
}
}
}
TMatriz::TMatriz( TMatriz & m )
{
int i, j;
fil = m.fils();
col = m.cols();
alocar(fil, col);
for( i = 0; i < fil; i++ )
{
for( j = 0; j < col; j++ )
{
a[i][j] = m(i, j);
}
}
}
TMatriz::TMatriz( int f, int c )
{
alocar(f,c);
}
void TMatriz::dealocar(void)
{
int i;
for(i = 0; i < fil; i++ )
{
delete[]a[i];
}
delete[]a;
}
TMatriz::~TMatriz()
{
dealocar();
}
TMatriz & TMatriz::operator=(TMatriz m )
{
int i, j;
dealocar();
fil = m.fils();
col = m.cols();
alocar(fil, col );
for( i = 0; i < fil; i++ )
{
for( j = 0; j < col; j++ )
{
a[i][j]= m(i,j );
}
}
return *this;
}
double TMatriz::determinante(void)
{
int i,j,k;
double det, aux, coef;
TMatriz m = *this;
det = 1;
if( fil == col )
{
//normalizacion de filas y columnas
for( i = 0; i < fil-1; i++ )
{
for( j = i + 1; j < fil; j++ )
{
if (m(j,i) > m(i,i) )
{
for( k = 0; k < col; k++ )
{
det *= -1;
aux = m( j, k );
m(j, k) = m( i, k );
m(i, k) = aux;
}
}
}
}
//mostrar (m);
//convertimos la matriz en matriz diagonal
for( i = 0; i < (fil - 1); i++ )
{
for( j = i+1; j < fil; j++ )
{
if( m(i, i ) != 0.00 )
{
coef= m(j,i)/m(i,i)*(-1);
for( k = 0; k < col; k++ )
{
m(j,k) = m(i,k)*coef + m(j,k);
}
}
else
{
printf( "MATRIZ SINGULAR %lf\n", 0 );
}
}
}
//mostrar(m);
//calculamos el determinante multiplicando los terminos de la
diagonal
for( i = 0; i < fil; i++ )
{
det *= m(i,i);
}
return det;
}
else
{
printf( "No es matriz cuadrada\nNo tiene determinante\n");
return 0;
}
}
//-------------------------------------------------------------------------/*
Este ejercicio fue dado en el año 2015.
Utiliza la clase TMatriz (dada en dicho período)
Muestra el método de Gauss en modo consola.
tmatriz.h es una clase definida en dicho año.
Los alumnos deberán utilizar los métodos y los atributos del
de la clase publicada este año.
*/
#pragma hdrstop
#include <stdio.h>
#include <stdlib.h>
#include "tmatriz.h"
#include <math.h>
#include <mem.h>
//-------------------------------------------------------------------------#pragma argsused
void Llenar( TMatriz & m )
{
int i, j;
randomize();
for( i = 0; i < m.filas(); i++ )
{
for( j = 0; j < m.columnas(); j++ )
{
m(i, j ) = (double)random(100000)/100.00;
m(i, j ) *= (random(100)%2 == 0) ? 1 : -1;
}
}
}
void Mostrar( TMatriz & a )
{
int i, j;
for( i = 0; i < a.filas(); i++ )
{
for( j = 0; j < a.columnas(); j++ )
{
printf( "%5.2lf\t", a(i, j) );
}
printf( "\n" );
}
printf( "\n" );
}
void Agrupar( TMatriz & a )
{
int i,j,k, mayor, aux;
for( k = 0; k < (a.filas()-1); k++ )
{
mayor = fabs(k);
for(i = k +1; i < a.filas(); i++)
{
if( fabs(a(i, k))> fabs(a(mayor,k) ) )
{
mayor = i;
}
}
if( mayor != k )
{
for( j = 0; j < a.filas() + 1; j++ )
{
aux = a(k,j );
a(k,j) = a(mayor, j);
a(mayor, j ) = aux;
}
}
}
}
void Normalizar( TMatriz & a )
{
int i, j, k;
double coef;
for( k = 0; k < a.filas(); k++ )
{
for( j = k+1; j < a.filas(); j++ )
{
if( a(k, k)!=0 )
{
coef = a(j, k)/a(k, k);
}
else
{
printf( "SOLUCION TRIVIAL" );
exit(1);
}
for( i = k; i < a.filas() + 1; i++ )
{
a(j, i) -= coef * a(k, i );
}
}
}
}
CalcularResultado (TMatriz & a, double * x )
{
int i, j;
for( i =
{
x[i]
}
for( i =
{
x[i]
0; i < a.filas(); i++ )
= 0;
a.filas() - 1; i >= 0; i-- )
= a(i, a.filas() )/a(i, i);
for( j = i + 1; j < a.filas() ; j++ )
{
x[i] -= a(i, j) * x[j]/a(i, i);
}
}
}
main(void)
{
int cant;
int i;
printf("Cantidad de Ecuaciones ");
scanf( "%d", &cant );
getchar();
TMatriz a(cant, cant+1);
double * x;
x = new double[cant];
memset( x, 0, sizeof(double)* cant);//pone todos los términos
del vector x a cero
Llenar( a );
Mostrar( a );
Agrupar( a );
Mostrar( a );
Normalizar( a );
Mostrar( a );
CalcularResultado( a, x );
printf( "\n\nRESULTADOS\n\n" );
for( i = 0; i < cant; i++ )
{
printf( "x[%d] = %lf\n", i, x[i] );
}
printf( "\n" );
delete[] x;
getchar();
}
//--------------------------------------------------------------------------
Descargar