#include <stdio.h>
#include <stdlib.h>
#include <math.h>
float **alocaomatriz(int m, int n)
/* Funcao Especial para alocação do sistema */
/* Variaveis : pointtemp -> Ponteiro temporário*/
/* index, variável auxiliar para contagem*/
/* m - linhas , n - colunas */
{
int index;
float **pointtemp;
if ( (m<1) || (n<0))
{
printf("Valores de M x N invalidos");
return(NULL);
}
/* Alocação das linhas */
pointtemp = (float **) calloc(m , sizeof (float *));
if ( pointtemp == NULL )
{
printf("**Erro , memoria Insuficiente.**");
return (NULL);
}
/* Alocação das colunas*/
for (index = 0 ; index < m ; index++)
{
pointtemp[index] = (float *) calloc(n , sizeof(float));
if ( pointtemp[index] == NULL )
{
printf("**Erro , memoria Insuficiente.**");
return (NULL);
}
}
return(pointtemp);
}
float **leitormatriz(int m, int n)
/* Programa de leitura da matrix*/
/* Variavies: m - linhas , n - colunas */
/* index1, index2, variaveis auxiliare de contagem*/
/* sistema => ponteiro de ponteiros, matriz*/
{
int index1, index2;
float **sistema;
sistema = alocaomatriz(m,n);
for (index1 = 0 ; index1 < m ; index1++)
{
for ( index2 = 0 ; index2 < n ; index2++)
{
printf("\nDigite X (%d) (%d): ", index1 + 1, index2 + 1);
scanf("%f",&sistema[index1][index2]);
}
}
return (sistema);
}
void liberarmatriz(float **matriz , int m, int n)
{
int index;
if ( (m < 1) || (n < 0))
{
printf("Valores de M x N invalidos");
return;
}
for (index = 0 ; index < m ; index++)
free(matriz[index]);
free(matriz);
}
void impressaomatriz(float **sistema ,int m,int n)
/*Funcao de impressao da matriz*/
{
int index1, index2;
for (index1 = 0 ; index1 < m ; index1++)
{
for (index2=0 ; index2< n ; index2++)
{
printf(" %f*X(%d)",sistema[index1][index2], index2+1);
if (index2 < n-2)
{
printf(" + ");
}
else if (index2 == n-2)
{
printf(" = ");
}
}
//quebrea de linha
printf("\n");
}
}
float arredondamento(float f)
{
if ((f < 0.0001 && f > 0) || (f > -0.0001 && f < 0))
{
return(0);
}
else
return(f);
}
int continuar()
{
int a;
a=0;
while ((a!= 1) || (a!= 2))
{
printf("Deseja continuar? (1-Sim 2-Nao)");
scanf("%d",&a);
if ( a == 1)
{
return (0);
}
if ( a == 2)
{
return (1);
}
}
}
void trocadelinha(float **sistema , int l1, int l2,int n)
//m - > números de linhas
//n - > números de colunas
//sistema -> matriz do sistema
//vetorcopia -> vetor temporário
//l1 e l2 linhas a serem permutadas
{
int index;
float vetorcopia;
for (index=0;index < n; index++)
{
vetorcopia = sistema[l1][index];
sistema[l1][index] = sistema[l2][index];
sistema[l2][index] = vetorcopia;
}
}
void metgaus(float** sistema, int m, int n)
{
int i, j, k;
float c;
for (i = 0; i < m-1; i++) {
for (j = i+1; j < m; j++) {
c = -(sistema[j][i]/sistema[i][i]);
for (k = i; k < n; k++)
sistema[j][k] = arredondamento(sistema[j][k] + c*sistema[i][k]);
}
printf("Iteracao numero: %d\n", i + 1 );
impressaomatriz(sistema, m, n);
if (continuar() == 1)
{
return;
}
}
}
int main()
{
/* Sistema = matriz dos sistema n x m*/
/* a -> m, b-> n */
float **sistema ;
int a,b;
printf("Digite o tamanho do seu sistema: Linhas x Colunas \n");
scanf("%d",&a);
scanf("%d",&b);
sistema = leitormatriz(a,b);
printf("\n");
impressaomatriz(sistema,a,b);
printf("**\n");
metgaus(sistema,a,b);
printf("\n**\n");
// impressaomatriz(sistema,a,b);
liberarmatriz(sistema,a,b);
getch();
return(0);
}