MPalhas
22-12-2007, 11:28
comecei a pouco tempo a aprender a linguagem C, e estava hoje a ler um tutorial que tenho seguido. terminei a secção de ponteiros e estava a fazer um exercicio que lá tinha, que consiste em, numa matriz bidimensional 10x10, colocar todos os valores a 0, depois preencher a matriz com números de um a 100, e depois mostrar esses mesmos valores, tudo isto usando ponteiros.
aqui está o código que eu fiz para o exercicio
#include <stdio.h>
int main()
{
int mtz[10][10], *p, x;
/* poe a zero todos os valores da matriz */
p=mtz[0];
for (x=0;x<100;x++)
{
*p=0;
p++;
}
/* preenche a matriz com nºs de 1 a 100 */
p=mtz[0];
x=0;
for(x=0;x<100;x++)
{
*p=x+1;
p++;
}
/* mostra os nºs da matriz (5 por linha) */
p=mtz[0];
for(x=0;x<20;x++)
{
printf("%5d", *(p++));
printf("%5d", *(p++));
printf("%5d", *(p++));
printf("%5d", *(p++));
printf("%5d\n", *(p++));
}
}e aqui está um printscreen do resultado ao executar este programa:
http://img156.imageshack.us/img156/3778/resultado1xj9.th.jpg (http://img156.imageshack.us/my.php?image=resultado1xj9.jpg)
ora como talvez já tenham reparado, no ultimo ciclo FOR eu tenho 5 vezes seguidas a função printf. eu sei que posso juntar tudo isso num só printf, mas ai e que está o problema. se fizesse isso, então era só substituir todos esses printfs por isto:
printf("%4d %4d %4d %4d %4d\n", *(p++), *(p++), *(p++), *(p++), *(p++));mas ao por assim, vejma o que acontece ao resultado:
http://img156.imageshack.us/img156/9112/resultado2pv6.th.jpg (http://img156.imageshack.us/my.php?image=resultado2pv6.jpg)
porque é que da segunda maneira, cada linha fica na ordem inversa? não percebo mesmo...
aqui está o código que eu fiz para o exercicio
#include <stdio.h>
int main()
{
int mtz[10][10], *p, x;
/* poe a zero todos os valores da matriz */
p=mtz[0];
for (x=0;x<100;x++)
{
*p=0;
p++;
}
/* preenche a matriz com nºs de 1 a 100 */
p=mtz[0];
x=0;
for(x=0;x<100;x++)
{
*p=x+1;
p++;
}
/* mostra os nºs da matriz (5 por linha) */
p=mtz[0];
for(x=0;x<20;x++)
{
printf("%5d", *(p++));
printf("%5d", *(p++));
printf("%5d", *(p++));
printf("%5d", *(p++));
printf("%5d\n", *(p++));
}
}e aqui está um printscreen do resultado ao executar este programa:
http://img156.imageshack.us/img156/3778/resultado1xj9.th.jpg (http://img156.imageshack.us/my.php?image=resultado1xj9.jpg)
ora como talvez já tenham reparado, no ultimo ciclo FOR eu tenho 5 vezes seguidas a função printf. eu sei que posso juntar tudo isso num só printf, mas ai e que está o problema. se fizesse isso, então era só substituir todos esses printfs por isto:
printf("%4d %4d %4d %4d %4d\n", *(p++), *(p++), *(p++), *(p++), *(p++));mas ao por assim, vejma o que acontece ao resultado:
http://img156.imageshack.us/img156/9112/resultado2pv6.th.jpg (http://img156.imageshack.us/my.php?image=resultado2pv6.jpg)
porque é que da segunda maneira, cada linha fica na ordem inversa? não percebo mesmo...