//-------------------------------------------------------------------------#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(); } //--------------------------------------------------------------------------