Você está na página 1de 5

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

h> #define MAX_LINHA 20 typedef struct no * pMe; struct no{ int coluna; float valor; pMe prox; }; typedef pMe matriz[MAX_LINHA]; void inicializa(matriz m, int linha) { int i; for (i = 0; i < linha; i++){ m[i] = NULL; } } void insere(matriz m, int linha, int coluna, float n) { pMe p, novo; novo = (pMe) malloc (sizeof(struct no)); novo -> valor = n; novo -> coluna = coluna; novo -> prox = NULL; if(m[linha] == NULL){ m[linha] = novo; }else{ for(p = m[linha]; p -> prox != NULL; p = p -> prox); p -> prox = novo; } } void imprime(matriz m, int tam) { int i, j; pMe p; for (i=0; i<tam; i++){ p = m[i]; for (j = 0; j<tam; j++){ if (p == NULL || p -> coluna != j){ printf("0.00\t"); }else{ printf("%.2f\t", p -> valor); p = p -> prox; } } printf("\n"); } } void libera (matriz m, int tam) { pMe p, q; int i; for (i = 0; i < tam; i++){

p = m[i]; while (p != NULL){ q = p; p = p -> prox; free (q); } } } void subtraiMatriz(matriz mSubtracao, matriz m1, matriz m2, int tam) { int i, j, subtracao; pMe p, q; for (i = 0; i<tam; i++){ p = m1[i]; q = m2[i]; for (j = 0; j<tam; j++){ if ( (p == NULL || p -> coluna != j) && (q == NULL || q -> coluna != j) ){ subtracao = 0; }else{ if (p == NULL || p -> coluna != j){ subtracao = q -> valor; q = q -> prox; }else if (q == NULL || q -> coluna != j){ subtracao = p -> valor; p = p -> prox; }else{ subtracao = p -> valor - q -> valor; p = p -> prox; q = q -> prox; } } if (subtracao != 0) { insere(mSubtracao, i, j, subtracao); } printf("\n"); } } } void somaMatriz(matriz mSoma, matriz m1, matriz m2, int tam) { int i, j, soma; pMe p, q; for (i = 0; i<tam; i++){ p = m1[i]; q = m2[i]; for (j = 0; j<tam; j++){ if ( (p == NULL || p -> coluna != j) && (q == NULL || q -> coluna != j) ){ soma = 0; }else{ if (p == NULL || p -> coluna != j){ soma = q -> valor; q = q -> prox; }else if (q == NULL || q -> coluna != j){ soma = p -> valor; p = p -> prox; }else{

soma = p -> valor + q -> valor; p = p -> prox; q = q -> prox; } } if (soma != 0) { insere(mSoma, i, j, soma); } printf("\n"); } } } void insereMult(matriz m, int l, int c, float mult) { pMe p; for(p = m[l]; p != NULL && p -> coluna != c; p = p -> prox); if (p != NULL && p -> coluna == c){ p -> valor += mult; }else{ insere(m, l, c, mult); } } void multMatriz(matriz mMult, matriz m1, matriz m2, int tam) { int i, j, k; //i= linha m1, j = linha m2 e coluna m1 e k = coluna m2; pMe p, q; for (i = 0; i<tam; i++) { p = m1[i]; for (j = 0; j<tam; j++) { q = m2[j]; if ( p != NULL && p -> coluna == j){ //se p nulo, nem preciso fazer a multiplicao for (k = 0; k<tam; k++) { if ( q != NULL && q -> coluna == k ) { //s fao a multiplicacao se q for diferente de zero insereMult(mMult, i, k, (p -> valor * q -> valor)); q = q -> prox; } } p = p -> prox; } } } } int main() { matriz m1, m2, resultado; int tamMatriz, i, j, opcao; float valor1, valor2; printf("Digite o tamanho das matrizes quadradas:\n"); scanf("%d", &tamMatriz); if (tamMatriz > 0){//verificando se o nmero de matriz desejado vlido

inicializa(m1, tamMatriz); inicializa(m2, tamMatriz); for(i = 0; i<tamMatriz; i++){ for(j = 0; j<tamMatriz; j++){ printf("Matriz 1[%d][%d]: ", i, j); scanf("%f", &valor1); if (valor1 != 0) { insere(m1, i, j, valor1); } printf("Matriz 2[%d][%d]: ", i, j); scanf("%f", &valor2); if (valor2 != 0) { insere(m2, i, j, valor2); } printf("\n"); } } imprime(m1, tamMatriz); imprime(m2, tamMatriz); } do{ printf("\n-------------------------\nFunes do programa:\n------------------------\n\n"); printf("----------------------------------------\nDigite 1 para Inserir novas Matrizes:\n"); printf("Digite 2 para Somar:\n"); printf("Digite 3 para Subtrair:\n"); printf("Digite 4 para Multiplicar:\n"); printf("Digite 5 para Sair:\n----------------------------------------\n" ); scanf("%d", &opcao); switch(opcao) { case 1: tamMatriz = 0; printf("Digite o tamanho das matrizes quadradas:\n"); scanf("%d", &tamMatriz); if (tamMatriz > 0){//verificando se o nmero de matriz desejado vli do inicializa(m1, tamMatriz); inicializa(m2, tamMatriz); for(i = 0; i<tamMatriz; i++){ for(j = 0; j<tamMatriz; j++){ printf("Matriz 1[%d][%d]: ", i, j); scanf("%f", &valor1); if (valor1 != 0) { insere(m1, i, j, valor1); } printf("Matriz 2[%d][%d]: ", i, j); scanf("%f", &valor2); if (valor2 != 0) { insere(m2, i, j, valor2); } printf("\n"); } }

imprime(m1, tamMatriz); imprime(m2, tamMatriz); } break; case 2: inicializa(resultado, tamMatriz); somaMatriz (resultado, m1, m2, tamMatriz); imprime(resultado, tamMatriz); libera(resultado, tamMatriz); break; case 3: inicializa(resultado, tamMatriz); subtraiMatriz (resultado, m1, m2, tamMatriz); imprime(resultado, tamMatriz); libera(resultado, tamMatriz); break; case 4: inicializa(resultado, tamMatriz); multMatriz(resultado, m1, m2, tamMatriz); imprime(resultado, tamMatriz); libera(resultado, tamMatriz); break; case 5: libera(m1, tamMatriz); libera(m2, tamMatriz); break; default: printf("Digite uma opo vlida:"); break; } }while(opcao != 5); return 0; }

Você também pode gostar