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

[C] Preencher uma matriz.

Discussão em 'Programação' iniciada por Pontiac, 6 de Setembro de 2006. (Respostas: 24; Visualizações: 6845)

  1. Pontiac

    Pontiac Power Member

    Sinceramente isto parece impossivel, mas acho que ha aqui bruxedo...

    Preciso preencher a 1ª linha e a 1ª coluna de uma matriz para fazer uma tabela

    A matriz é sempre um N por N mas de tamanho variavel, o problema é que ao preencher a 1ª linha, não só me preenche essa linha da maneira que eu quero mas tambem a ultima e simplesmente não consigo encontrar uma explicação para tal.

    Código:
         mapa_distancias[0][0]=0;
         posicao=1;
         //printf("**> %d \n", mapa_distancias[0][3]);
         while(posicao<=tamanho_max)
         {
          mapa_distancias[posicao][0]=produtor[posicao-1].NIF;
           mapa_distancias[posicao][posicao]=0;
            posicao++;  
                                             
         }


    ** Codigo que me mostra a matriz**

    Código:
     for(linha=0;linha<=tamanho_max;linha++)
         {
           printf("\n");
           posicao=0;
           while(posicao<=tamanho_max)
           {                                             
          
          printf("%d ",mapa_distancias[posicao][linha]);                                  
            posicao++;
            }
              }

    Pus aqui este código pq não tenho ou não sei usar uma ferramente de debugging decente no DevC++
    Por tentativas e atraves de printfs sei que ao mesmo tempo que é preenchida no local certo tambem é preenchida na ultima linha, mas como e porquê?!!! já que eu estou a dizer expressamente mapa_distancias[posicao][0] <--- Na posição ZERO!!!

    Obrigado
     
  2. Hipnoted

    Hipnoted Power Member

    Vê lá se isto te ajuda:

    for(i=0;i<tamanholinha;i++){
    for(j=0;i<tamanhocoluna;j++){
    if(j ==0 || i ==0) {
    array[j] = "*";
    }
    }
    }
     
  3. HecKel

    HecKel The WORM

    Nem vale a pena tentar encontrar outra solução :P

    A escreveres para a matriz começas pela posição 1, a leres começas pela posição 0

    É este o teu problema :)

    Repara lá no valor do "position" no while e no valor da "linha" no for :)

    abraços, HecKel
     
  4. Pontiac

    Pontiac Power Member

    Pois essa é que eu não sabia...

    pensei que ambos começavam na posição 0, isso quer dizer que para escrever a posição [0][0] não existe.
    Vou tentar por isto certo.


    EDIT:

    Epah espera aí que eu percebi mal. :P

    é que esse posição=1 é porque quero uma matriz deste tipo:

    0 0 9 8 5
    0 0 0 0 0
    9 0 0 0 0
    5 0 0 0 0

    E no array onde vou buscar os NIF eles começam na posição 1, ou seja na posição 0 está a 0, assim posição 1=0, pos 2 =9 pos 3= 8...
     
    Última edição: 6 de Setembro de 2006
  5. Pontiac

    Pontiac Power Member




    Código:
     for(i=0;i<=tamanho_max;i++){
                                       
                for(j=0;j<=tamanho_max;j++){
                                           
                       if(j ==0 || i ==0) {
                            
                mapa_distancias[i][j] = produtor[i-1].NIF;
                }
                }
                }
    Dá-me exactamente o mesmo resultado.. :\
     
  6. HecKel

    HecKel The WORM

    Agora eu é que não percebi...

    Já vi o disparate que disse :P Não reparei que existia um posicao-1 no código de preenchimento...

    Faz-me um favor, diz-me que valores é suposto o produtor ter nas suas posições e qual é o resultado que queres que a matriz tenha no final, sff. É mais fácil de perceber com os dados todos.

    abraços, HecKel
     
  7. Hipnoted

    Hipnoted Power Member

    Mas já está certo ou dá-te mal como antes?
     
  8. Rui_Carlos

    Rui_Carlos 1st Folding then Sex

    se eu percebi a tua dúvida queres preencher a primeira linha e a primeira coluna, certo?

    Código:
    for(i=0;i<tamanho_max;i++)
    {
      mapa_distancias[0][i]=x;
      mapa_distancias[i][0]=x;
    }
    o que deve gerar a matriz

    x x x x x
    x ...
    x ...
    x ...
    x ...

    pelo menos comigo funcionou...
     
  9. Pontiac

    Pontiac Power Member


    Não tenho a certeza se é isto que queres.

    Eu tenho um array de estruturas:

    struct produtores{
    int NIF;
    char morada[100];
    int telefone;
    int capacidade;
    char nome[80];
    char lixo[1];
    }produtor[NUM_MAX];

    O produtor[0] está vazio, começa do 1.

    Quando está tudo devidamente lido e carregado na memória, quero ir percorrendo o array produtor[] para que o NIF de cada um seja escrito numa matriz tipo isto:

    [​IMG]

    De referir que antes disto preencho a matriz com "-1" (sinal que a distancia não está defenida) e nas posições com zero. Estas duas não é problema e consigo-as fazer sem dificuldade.

    Para simplificar tentei apenas preencher a 1ª linha, ou seja escrever colunas:

    mapa_distancias[0][0]=0;
    posicao=1;
    printf("**> %d \n", mapa_distancias[0][3]);
    while(posicao<=tamanho_max)
    {
    mapa_distancias[posicao][0]=produtor[posicao-1].NIF;

    //mapa_distancias[0][posicao]=produtor[posicao-1].NIF; //para escrever a coluna do lado esquerdo, desactivado.
    mapa_distancias[posicao][posicao]=0;
    printf("**> %d \n", mapa_distancias[1][3]);// só para ver os valores
    posicao++;

    Ao que tenho este resultado:

    [​IMG]

    O que interessa é a ultima matriz, a 1ª era para ver se estava preenchida com -1s e o 3 é o tamanho_max, ou seja dois produtores + a central.




    Dá-me com antes.



    Sim, se reparares no meu codigo é a mesma coisa, só que o resultado não é bem esse.

    De qualquer maneira preencher uma matriz é um no-brainer, por isso acho que deve ter a ver com o facto de envolver de estruturas ou um array de estruturas, qualquer coisa que me escapa e que sinceramente estou sem ideias..
     
    Última edição: 7 de Setembro de 2006
  10. HecKel

    HecKel The WORM

    Esse teu while apenas preenche a primeira linha e a diagonal, se é esse o objectivo está correcto.

    Para preencheres a coluna de facto deveria funcionar se descomentares aquela linha que tens comentada
    Código:
    //mapa_distancias[0][posicao]=produtor[posicao-1].NIF;
    Agora sinceramente não estou a perceber o que está a dar mal, se removeres aquele sinal de comentação ficarias com uma matriz cuja primeira linha e primeira coluna estão devidamente preenchidas, uma diagonal a 0 e restantes elementos a -1, é isto que pretendes?

    abraços, HecKel
     
  11. Pontiac

    Pontiac Power Member

    É exactamente isso que pretendo, não sei porque razão não esta a resultar, a mim parece-me uma coisa tão simples que isto chega a ser caricato...
     
  12. HecKel

    HecKel The WORM

    Podes mostrar o output deste código:

    Código:
    mapa_distancias[0][0]=0;
         posicao=1;
         //printf("**> %d \n", mapa_distancias[0][3]);
         while(posicao<=tamanho_max)
         {
          mapa_distancias[posicao][0]=produtor[posicao-1].NIF;
          mapa_distancias[posicao][posicao]=0;
          mapa_distancias[0][posicao]=produtor[posicao-1].NIF;
          posicao++;  
         }
    É exactamente o teu código, mas com aquela linha descomentada. Quero apenas ver o output gerado para tentar analizar o que se pode estar a passar..., é que isto tem toda a lógica de funcionar..., mas o compilador tem sempre razão :P

    abraços, HecKel
     
  13. Pontiac

    Pontiac Power Member

    Dá isto:

    0 54845414 12456841 54845414
    0 0 -1 -1
    12456841 -1 0 -1
    54845414 12456841 54845414 0



    Ou seja, agora a coluna da esquerda está com deveria estar, mas a 1ª linha substitui-me a posição 1 onde estava 0 para o NIF do segundo produtor. e claro a ultima linha está mal, só a posição [0][3] é que está correcta, alem do ultimo 0 tb.
     
  14. HecKel

    HecKel The WORM

    Pergunta estúpida: Tinhas a matriz toda a -1 antes desse pedaço de código?

    Não faço a minima ideia porque raio isso está a dar mal..., podes meter aqui o código da função toda? O problema pode nem ser daí...

    abraços, HecKel
     
  15. Hipnoted

    Hipnoted Power Member


    Sim também não percebo... Temos as soluções do Heckel, do Rui_Carlos, a minha e a tua. Ambas fazem o mesmo mas de maneiras diferente, o erro só pode estar em outra parte do código.
     
  16. Pontiac

    Pontiac Power Member

    Eu até vos dou o codigo fonte todo, O código está cheio de lixo, muito por causa que o comecei a fazer em Janeiro e nessa altura ainda mal sabia programar, o que não implica que agora ja seja grande mestre... :)

    Dá um warningzito que ainda n consegui resolver mas de certeza que não deve ter nada a ver com este problema.

    LINK

    Se não perceberem alguma coisa não pergutem á vontade, que isso não é propriamente um bom exemplo de bom código.
     
  17. Cesaria

    Cesaria Power Member

    Biba, tibe a ber mm agora por alto o prog e tenho a dizer ke akilo ja da o ke keres, deves ter visto mal, penso eu }> ... Agora so axo estranho conseguires compilar, sem teres alocado memória para o array, o visual 2005 queixou-se até mais não :004: ...Dps tens é de ter cuidado como tas a imprimir o array, pois tas a imprimir ao contrário (matriz ao contrario) mas ixo para aki não interessa pois os valores sao sempre os mesmos, pelo menos para já...Agora vou mas é dormir ke isto ja nao xao horas para se andar na net :lol: ...

    ah o ke dá é :
    0 0 12456841 54845414
    0 0 -1 -1
    12456841 -1 0 -1
    54845414 -1 -1 0

    :zzz:
     
  18. Hipnoted

    Hipnoted Power Member

    Olha eu vi o código assim por alto e não descortinei nada. Mas também é difícil porque não conheço o enunciado do problema...
     
  19. Pontiac

    Pontiac Power Member

    As alocações de memória nem foram dadas na cadeira para a qual estou a fazer isto, talvez por falta de tempo, foram dadas numa a que eu nem apareci.. portanto evitei-as embora esteja consciente da importancia.. :-D


    Mas o que fizeste ao código? é que é esse o resultado que eu quero!!
     
  20. Cesaria

    Cesaria Power Member

    Pois, o prob é ke nada fiz,lol, só o compilei e executei..Somente como o visual considera que não se reserva espaço para o array mapa_distancias tive de colocar por defeito
    int mapa_distancias[10][10]; para o conseguir compilar e executei e deu ixo...
     

Partilhar esta Página