Ir para conteúdo
Fórum Script Brasil
  • 0

Problema Matrizes e ponteiros


Caiobrito

Pergunta

Olá pessoal, tudo bem? Estou fazendo uma adaptação de um programa que resolve sistemas lineares pelo método de eliminação de gauss e estou com problema para adaptá-lo.

O programa original escrevia a matriz dentro da própria função, mas agora preciso que ele utilize uma matriz retornada por uma outra função. A parte comentada era o programa original. O executável trava logo após matriz ser recebida, e eu consegui concluir que ele dá pau quando chega em *term = fabs(mat[k]);* (fui comentando as outras linhas e compilava e executava) . O que estou fazendo errado?

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

#define NMAX 50
double** inicia_matriz(int*,int*);
void main()
{
    int nLinhas, nColunas;
    int    i, j, k, l;
    int    last, rev;
    double  **mat, x[NMAX+1]; 
    float  coef, big, term, temp, pivot, nextr, cnt, y;
    mat=inicia_matriz(&nLinhas,&nColunas);

    //scanf("%d", &nLinha);
    //for (i = 1; i <=nLinhas; i++) {
//        nColunas =nLinha+1;
//        printf("");
//        for (j = 1; j <=nColunas; j++) {
//            scanf("%f", &coef);
//            a[i][j] = coef;
//        }
//    }
    
    last =nLinhas- 1;
    for (i = 1; i <= last; i++) {
        big = 0.f;
        for (k = i; k <=nLinhas; k++) {
            
            term = fabs(mat[k][i]);
            if ((term - big) > 0.f) {
                big = term;
                l = k;
            }
        }
        if (i != l) {
            for (j = 1; j <=nColunas; j++) {
                temp = mat[i][j];
                mat[i][j] = mat[l][j];
                mat[l][j] = temp;
            }
        }
        pivot = mat[i][i];
        nextr = i + 1;
        for (j = nextr; j <=nLinhas; j++) {
            cnt = mat[j][i] / pivot;
            for (k = i; k <=nColunas; k++) {
                mat[j][k] = mat[j][k] - cnt*mat[i][k];
            }
        }
    }

    for (i = 1; i <=nLinhas; i++) {
        rev =nLinhas+ 1 - i;
        y = mat[rev][nColunas];
        if (rev !=nLinhas) {
            for (j = 2; j <= i; j++) {

                k =nLinhas+ 2 - j;
                y -= mat[rev][k]*x[k];
            }
        }
        x[rev] = y / mat[rev][rev];
    }

    //solução
    for (i = 1; i <=nLinhas; i++) {
        printf("\n");
        printf("   x( %d ) = %f\n", i, x[i]);
    }
    printf("\nPrograma terminado. Tecle algo para encerrar.");
    getch();
}

double** inicia_matriz(int *nLinhas, int *nColunas){

    int i, j,mult;
    double** mat;


    //numero de linhas
    scanf("%d",nLinhas);
    mat=(double**) calloc(*nLinhas,sizeof(double*));

    if(mat==NULL){
        exit(1);
    }

    srand (time (NULL));


    //número de colunas
    scanf("%d",nColunas);

    for( i=0; i<*nLinhas; i++){
        mat[i]= (double *) calloc(*nColunas,sizeof(double));

        if(mat[i]==NULL){
           exit(1);
        }

        for(j=0; j<*nColunas;j++){
            //entrada dos coeficientes
            scanf("%lf",&mat[i][j]);

        }
    }
    return mat;
}

o

Link para o comentário
Compartilhar em outros sites

1 resposta a esta questão

Posts Recomendados

  • 0

Boa tarde!

Existem alguns problemas no seu código:

1- Primeiro um "warning"... :)

Sempre antes usar o scanf, use um printf para avisar o usuário o que deve ser digitado. Sem avisar o usuário não sabe o que tem que digitar e com certeza não vai entender nada do que está acontecendo!

2- Os índices para um vetor iniciam de 0. Se o vetor tem 3 elementos, os índices são 0, 1 e 2. No seu programa, todo for usa índices iniciando por 1 e indo até o maior elemento. No exemplo seria 1, 2 e 3. Isso é errado e gera o erro que você está recebendo.

3- Existe for que corre de 1 até nLinhas e você usa o índice para acessar um campo de coluna. Se a matriz não for simétrica (3x3, 4x4, etc.) vai dar problema também

4- No código abaixo:

pivot = mat[i][i];

Você também usa o índice de linha em coluna

Resolvendo esses problemas seu programa já deve funcionar!

A função que inicia a matriz está correta, o problema não está nela!

Abraços,

Marcelo Utikawa da Fonseca

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...