[C] Preencher uma matriz.

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
 
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
 
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:
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] = "*";
}
}
}



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.. :\
 
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...

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
 
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...
 
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


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:

Distancias.JPG


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:

Resultado1.JPG


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.




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

Dá-me com antes.



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...

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:
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
 
É 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...
 
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
 
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.
 
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
 
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


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.
 
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.
 
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:
 
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:

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!!
 
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...
 
Back
Topo