Escalonador de Matrizes
Publicado por Don Luigi (última atualização em 12/03/2014)
[ Hits: 7.818 ]
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");
}
}
Digitar dados em um vetor, guardando-os sequencialmente em um arquivo texto
Papagaiando o XFCE com temas e recursos
WhatsApp com Chamadas no Linux via Waydroid
XFCE - quase um Gnome ou Plasma mas muito mais leve
LXQT - funcional para máquinas pererecas e usuários menos exigentes
Como cortar as partes de um vídeo com passagens de áudio em branco
Tiling automático no KDE Plasma
SNMP Scan no OCS Inventory só funciona com HTTPS corretamente configurado
Links importantes de usuários do vol (4)
GOG confirma suporte oficial ao sistema Linux: "o trabalho começo... (2)
Para os fãs de DOOM, um vídeo do Romero (com dublagem em pt-br disponí... (2)









