Escalonador de Matrizes
Publicado por Don Luigi (última atualização em 12/03/2014)
[ Hits: 7.697 ]
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ã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
/// 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");
}
}
Número par ou ímpar (com operado bit a bit)
Verificar intervalo de números
Script Acadêmico - Matrizes em C
Monitorando o Preço do Bitcoin ou sua Cripto Favorita em Tempo Real com um Widget Flutuante
IA Turbina o Desktop Linux enquanto distros renovam forças
Como extrair chaves TOTP 2FA a partir de QRCODE (Google Authenticator)
Como realizar um ataque de força bruta para desobrir senhas?
Como usar Gpaste no ambiente Cinnamon
Atualizando o Fedora 42 para 43
Erro no suitable vídeo mode (4)
Navegar no Firefox sem passar pelo Google [RESOLVIDO] (2)
Pergunta: Meu teclado não está respondendo direito como e consertar? (3)
Erro: Lazarus 4.2 64 no Linux Mint não entra mais apos ajustar desktop... (1)









