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

duvida em C

Discussão em 'Programação' iniciada por MPalhas, 22 de Dezembro de 2007. (Respostas: 4; Visualizações: 606)

  1. MPalhas

    MPalhas Power Member

    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
    Código:
    #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:
    [​IMG]

    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:
    Código:
    printf("%4d %4d %4d %4d %4d\n", *(p++), *(p++), *(p++), *(p++), *(p++));
    mas ao por assim, vejma o que acontece ao resultado:
    [​IMG]

    porque é que da segunda maneira, cada linha fica na ordem inversa? não percebo mesmo...
     
  2. Porque a ordem com que cada argumento de uma função é avaliada não é determinística.
     
  3. MPalhas

    MPalhas Power Member

    não percebi muito bem a tua resposta, mas pesquisei um bocado, e pelo que percebi os parametros são avaliados da direita para esquerda, certo?

    então quer dizer que tenho mesmo que usar a primeira forma que mostrei, com os 5 printfs?
     
  4. Mais ou menos isso. O compilador assume que a ordem dos argumentos é irrelevante e optimiza o códiga tendo isso em conta. ;)

    Sim, tens de usar os cinco printfs.
     
  5. Tyran

    Tyran Power Member

    Boas
    No extremo, se quiseres mesmo tudo numa linha poderias fazer algo desta maneira
    Código:
    printf("%4d %4d %4d %4d %4d\n", *(p++)-4, *(p++)-2, *(p++), *(p++)+2, *(p++)+4);
    
    Deste modo, ele à direita avança no *p e dá mais 4 ao valor (sem interferir no valor apontado) de modo a conseguires os 5 ( 1 + 4 = 5) que queres ter à direta, depois no penúltimo como ele já antes tinha feito um *p++ e faz agora um novo somas apenas 2, isto é, (4-2), e assim sucessivamente...

    cumpzz
     
    Última edição: 22 de Dezembro de 2007

Partilhar esta Página