1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

[Solved] Ler uma Matriz apartir dum ficheiro em C

Discussão em 'Programação' iniciada por zeguel, 28 de Março de 2009. (Respostas: 12; Visualizações: 2240)

  1. Boas! Na faculdade foi me pedido para fazer uma trabalho em que além de muitas outras tarefas é pedido que na prompt se digite ./(nome) [taxa de extinçao][matriz ds ventos ][ area florestal]

    como já devem ter alguma noção, o trabalho pretende que faça mos a simulação do "alastramento" de um incendio numa dada area florestal...

    O meu problema é que ao ler o ficheiro dos ventos, a matriz que o programa guarda é igual á que está no ficheiro mas depois ao calcular a probabilidade de incendio, a representação gráfica nao é igual á representação que me aparece se eu definir a matriz directamente no trabalho...

    Código:
    char *nomef = argv[i];
                FILE *f = fopen(nomef, "r");    
                    if (i>1)
                    {
                        if(f == NULL)
                        {
                            fprintf(stderr, "Erro ao abrir o ficheiro '%s'\n", nomef); /* Estamos a escrever na saída de erros e não no stdout */
                        }
                        else 
                        {
                            a=1;
                            b=1;
                            fscanf(f, "%d", &num); 
                                for(i = 0; i < num; i++)
                            {
                                    fscanf(f, "%f", &val);
                                    tab_ventos[a][b]=val;
                                    if (a==5)
                                    {
                                        b+=1;
                                        a=1;
                                    }
                                    else if (a!=6)
                                        a+=1;
                                    
                            }            
                        }
                    }
    
    Este é o meu código para atribuir á variavel global tab_ventos[5][5], depois é só chamar a função que calcula as probabilidades mas aí é que está o problema..em vez de se alastrar para toda a area apenas se alastra numa direção , e como já disse em cima tem que se alastrar pra todo o lado...

    Desd já obrigado...qqr duvida just ask!
     
    Última edição: 28 de Março de 2009
  2. S0ul

    S0ul Power Member

    Isso só pode ser porque a forma que estás a usar para ler o fcheiro, não está de acordo com a forma que inseres manualmente :). Eu agora não tenho tempo para ohar para o código, senão até te via o problema. Pode ser que mais alguém te diga o que estás a fazer de mal.
     
  3. Nao sei se percebi bem o que tu dissest mas, se queres dizer que a leitura da matriz tá a ser mal feita nomeadamente trocar linha por colunas, não é isso... pk eu coloquei uma matriz pa teste que tem exactamente os mesmos elementos nas linha e colunas para assim nao me enganar...só depois de colocar a funcionar correctament é que vou alterar isso...nao sei se me fiz entender correctament...

    Thanks btw
     
  4. S0ul

    S0ul Power Member

    Estive a dar uma vista de olhos por alto no teu código de leitura do ficheiro, e está tudo nos conformes.
    Já agora, já experimentaste fazer a escrita da matriz que criaste com a leitura do ficheiro?
     
    Última edição: 28 de Março de 2009
  5. Fazer os printfs? isso tb é uma boa questão... eu coloco printf("%f", tab_ventos[a]) e nao aparece nada na prompt...o estranho é que ontem aparecia, mas eu apaguei esse bocado de código e já nao me lembro se tinha mais cenas...mas lembro m que quando fazia os printfs tava tudo nos conformes...

    Btw, já tive a alterar o código mas dá o mesmo...

    Código:
    
    void ler_matriz(FILE *m) {
        int i,j;
        for(i=0;i<5;i++){
            for(j=0;j<5;j++) {
                fscanf(m, "%f", &tab_ventos[i][j]);
            }
        }
        fclose(m);
    }
    int main (int argc, char **argv)
    {
        if (argc!=4) {
            printf("Uso: ./demo [prob. extincao] [ventos] [floresta]\n");
            return 0;
        }
        else {
            int i,j;
            for(i = 0; i < argc; i++) {
                char *nomef = argv[i];
            }
            char *matriz = argv[2];
            FILE *m = fopen(matriz, "r");
            if (m==NULL) {
                fprintf(stderr, "Erro ao abrir o ficheiro '%s'\n", matriz);
            }
            else {
                ler_matriz(m);
            }
            taxa_extin= atof(argv[1]);
            }
    (...)
    
     
  6. S0ul

    S0ul Power Member

    Mas quando fazes a escrita, deves usar 2 fors, tipo:
    Código:
    for(i=0;i<5;i++){
      printf("\n");
      for(j=0;j<5;j++){
          printf("%f",tab_ventos[i][j]);
      }
    }
    
    
    Até devias de ter feito através de 2 for na leitura, mas fizeste esse jogo com o if ;) e as duas variaveis auxiliares a e b ;).
     
    Última edição: 28 de Março de 2009
  7. Eish... o output é estranho..:S
    Só aparecem 20 "casas" qnd deveriam aparecer 25... acho que os For's garantem isto...

    Já tou a 1 dia a olhar pro mesmo erro e nada..fogo
     
  8. S0ul

    S0ul Power Member

    Deviam de aparecer 25 casas, os for tanto em linha como em coluna vai de 0 a 4 ou seja 5 posições :s!
     
  9. S0ul

    S0ul Power Member

    Bem vou de ter de me ausentar, se até logo à noute ninguém te ajudar eu dou-te um empurrão ;).
     
  10. Thanks eu té á noite esper ter isto resolvido... depois coloco aqui se tiver resolvido o prob...

    Thanks again
     
  11. Lol, se colocar
    Código:
    for(i=0;i<5;i++){
      printf("\n");
      for(j=0;j<5;j++){
          printf("%f [B]\n[/B]",tab_ventos[i][j]);
      }
    }
    
    
    já aparecem os 25...nao é aqui o erro...:smilliex:
     
  12. SOLVED... ainda nao percebi o que mudei...só sei que estive a alterar a ordem dos for's ( onde era linha meti coluna e vice-versa) e já faz o que eu quero...

    Thanks SOul
     
  13. S0ul

    S0ul Power Member

Partilhar esta Página