Escalonador de Matrizes

Publicado por Don Luigi (última atualização em 12/03/2014)

[ Hits: 7.261 ]

Download escalonadorDeMatrizes.c

Download 1394501512.escalonadorDeMatrizes.c (versão 2)




Minha primeira contribuição aqui no fórum: Um script que dado uma matriz de entrada, retorna a forma escalonada dessa matriz, bem como uma análise do sistema.

Críticas e sugestões são muito bem-vindas.

  



Versões atualizadas deste script

Versão 2 - Enviado por Don Luigi em 10/03/2014

Changelog: - Arrumado erros de divisão por zero em alguns casos particulares.
- Eliminação de algumas variáveis.

Erros pendentes:
- Percebi que o programa não funciona para casos em que um dos vetores é combinação linear de outro.
- Identificação de Sistema Possível e Indeterminado está falha.

Download 1394501512.escalonadorDeMatrizes.c


Esconder código-fonte

/// Autor: Gianluigi Dal Toso
/// Espaço VOL: www.vivaolinux.com.br/~Don_Luigi

#include<stdio.h>
#include<stdlib.h>
#include<math.h>

void inicializaMatriz(float ***m, int *numLin, int *numCol);
void imprimeMatriz(float **m, int numLin, int numCol);
void escalonaMatriz(float **m, int tamLin, int tamCol);
void analisaMatrizEscalonada(float **m, int tamLin, int tamCol);

int main() {
    int numLin, numCol, aux = 1;
    float **matriz;

    while(aux == 1){
        inicializaMatriz(&matriz, &numLin, &numCol);
        printf("\n\n --- MATRIZ: --- \n");
        imprimeMatriz(matriz, numLin, numCol);
        printf("\n MATRIZ ESCALONADA: \n");
        escalonaMatriz(matriz, numLin, numCol);
        imprimeMatriz(matriz, numLin, numCol);
        analisaMatrizEscalonada(matriz, numLin, numCol);

        printf("\nEscolha uma opção: ");
        printf("\n1 - Escalonar outra matriz.");
        printf("\n0 - Fechar o programa.");
        scanf("%d", &aux);
        system("clear");
    }

    return 0;
}

void inicializaMatriz(float ***m, int *numLin, int *numCol){
    int i, j;

    // Pegando tamanho da matriz
    printf("Digite o número de linhas: ");
    scanf("%d", numLin);
    printf("Digite o número de colunas: ");
    scanf("%d", numCol);

    // Alocando a matriz
    *m = (float **)malloc(*numLin*sizeof(float *));
    for(i = 0; i < *numLin; i++){
        (*m)[i] = (float *)malloc(*numCol*sizeof(float));
    }

    // Lendo os elementos da matriz do teclado
    for(i = 0; i < *numLin; i++){
        printf("Digite os %d números da %dª linha: ", *numCol, i+1);
        for(j = 0; j < *numCol; j++){
            scanf("%f", &(*m)[i][j]);
        }
    }
}

void imprimeMatriz(float **m, int numLin, int numCol){
    int i, j;

    for(i = 0; i < numLin; i++){
        printf("|"); // Parede esquerda
        for(j = 0; j < numCol; j++){
            printf("%10.4f", m[i][j]);
        }
        printf("  |\n"); // Parede direita
    }
}


void escalonaMatriz(float **m, int tamLin, int tamCol){
    int i, j, k, ref = 0, shit;
    float aux;

    // ref -> linha de referência

    for(j = 0; j < tamLin - 1; j++){
        for(i = 1 + j; i < tamLin; i++){
            //Percorrer elementos de uma linha inteira
            aux = m[i][j]/m[ref][j];

            for(k = ref; k < tamCol; k++){
                m[i][k] -= m[ref][k]*aux;
            }
        }
        ref++;
    }
}

void analisaMatrizEscalonada(float **m, int tamLin, int tamCol){
    int i, cont = 0;

    printf("\nAnálise do sistema: ");

    for(i = 0; i < tamCol - 1; i++){
        if(fabs(m[tamLin - 1][i]) > 0){
            cont++;
        }
    }

    if(m[tamLin - 1][tamCol - 1] != 0 && cont == 0){
        printf("Sistema Impossível (SI)\n\n");
    }
    else if(m[tamLin - 1][tamCol - 1] != 0 && cont == 1){
        printf("Sistema Possível e Determinado (SPD)\n\n");
    }
    else {
        printf("Sistema Possível e Indeterminado (SPI)\n\n");
    }
}

Scripts recomendados

EMULA DIVISÃO

Inverte frase

Equação do segundo grau em C++

Selection sort

Calculadora em C


  

Comentários
[1] Comentário enviado por Don_Luigi em 10/03/2014 - 17:34h

Pessoal, me perdoem mas acredito que tenha um erro na minha análise do sistema. Chegando em casa vou analisar e arrumar isso.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts