none
Ajuda C# iniciante Laços whre/for RRS feed

  • Pergunta

  • Olá pessoal, estou estudando c# e gostaria que alguém me ajuda-se em algumas dúvidas.´
    No código abaixo informa que o laço repete 8x

    int p =2;
    for (int q 2; q < 32;
               q = q * 2)
    {
          while (p < q)
          {
               p = p * 2;
      }
      q = p - q;
    }


    Gostaria de entender melhor como funciona o contador, o pq que ele executa 8x.


    Exemplo:

    int p = 2;  //informa que o valor de p = 2
    for (int q 2; q < 32; 
          q = q * 2)
    {
          while (p < q)
          {
               p = p * 2;
      }
      q = p - q;
    }
    quinta-feira, 18 de fevereiro de 2010 14:37

Respostas

  • **Demorei demais para responder :). Bem de qualquer jeito deixo a explicação abaixo se for útil**


    Ok. Vou tentar explicar.

    Primeiro é importante entender bem a sintaxe do while e do for.

    while(expr){} significa que o código irá repetir até o momento que expr se tornar falso. while(p < q), por exemplo, significa que o laço vai repetir até que p seja maior ou igual a p.

    for(expr1;expr2;expr3){} é um pouco mais complicado. expr1 é um código que rodará antes da repetição, ou seja a inicialização do laço. expr2 é o teste de repetição, assim como no for. expr3 é um código que rodará sempre que repetir o laço, ou seja a atualização do laço.
    for (int q = 2; q < 32; q = q * 2) significa que o valor inicial de q será 2, o laço irá repetir até que q seja maior ou igual a 32 e a cada repetição o valor de q será dobrado.


    Pronto, agora vamos ver com calma o seu código.


    1 int p = 2;
    2 for (int q = 2; q < 32; q = q * 2)
    3 {
    4       while (p < q)
    5       {
    6            p = p * 2;
    7       }
    8       q = p - q;
    9 }


    Vamos começar com o laço da linha 2. O valor inicial de q é 2, ou seja, menor que 32. Portanto o laço irá rodar pelo menos uma vez. O valor de q é atualizado tanto dentro do for quanto na linha 8. A atualização da linha 8 depende do laço while da linha 4, o qual depende do valor atual do q.
    Esse tipo de laço dentro de laço onde os valores das variáveis mudam é muito difícil de explicar. É preciso pegar lápis e papel e seguir cada iteração dos laços.

    Coloque alguns Console.Write para entender o que acontece:


                int p = 2; 
                Console.WriteLine(String.Format("linha1 - p={0}",p));
                for (int q = 2; q < 32; q = q * 2)
                {
                    Console.WriteLine(String.Format("linha3 - q={0} p={1}", q, p));
                    while (p < q)
                    {
                        p = p * 2;
                        Console.WriteLine(String.Format("linha6 - q={0} p={1}", q, p));
                    }
                    q = p - q;
                    Console.WriteLine(String.Format("linha8 - q={0} p={1}", q, p));
                }


    Henri Nusbaum - Itelios do Brasil Informática Ltda
    quinta-feira, 18 de fevereiro de 2010 15:13
  • Exatamente como o Tiago colocou.
    Só complementando, ele não vai para o nono loop pq a condição de parada do loop é q< 32: for (int q 2; q < 32 ; q = q * 2)
    quinta-feira, 18 de fevereiro de 2010 15:08

Todas as Respostas

  • Amigo,

    Faça um teste de mesa:

    loop=1 p=2
    loop=1 p=2, q=2
    loop=1 p=2, q=0

    loop=2 p=2, q=0
    loop=2 p=2, q=2

    loop=3 p=2, q=4
    loop=3 p=4, q=4
    loop=3 p=4, q=0

    loop=4 p=4, q=0
    loop=4 p=4, q=4

    loop=5 p=4, q=8
    loop=5 p=8, q=8
    loop=5 p=8, q=0

    loop=6 p=8, q=0
    loop=6 p=8, q=8

    loop=7 p=8, q=16
    loop=7 p=16, q=16
    loop=7 p=16, q=0

    loop=8 p=16, q=0
    loop=8 p=16, q=16

    Se houvesse o loop 9 o valor seria:
    loop=9 p=16, q=32

     

    []´s

    quinta-feira, 18 de fevereiro de 2010 14:53
  • Exatamente como o Tiago colocou.
    Só complementando, ele não vai para o nono loop pq a condição de parada do loop é q< 32: for (int q 2; q < 32 ; q = q * 2)
    quinta-feira, 18 de fevereiro de 2010 15:08
  • **Demorei demais para responder :). Bem de qualquer jeito deixo a explicação abaixo se for útil**


    Ok. Vou tentar explicar.

    Primeiro é importante entender bem a sintaxe do while e do for.

    while(expr){} significa que o código irá repetir até o momento que expr se tornar falso. while(p < q), por exemplo, significa que o laço vai repetir até que p seja maior ou igual a p.

    for(expr1;expr2;expr3){} é um pouco mais complicado. expr1 é um código que rodará antes da repetição, ou seja a inicialização do laço. expr2 é o teste de repetição, assim como no for. expr3 é um código que rodará sempre que repetir o laço, ou seja a atualização do laço.
    for (int q = 2; q < 32; q = q * 2) significa que o valor inicial de q será 2, o laço irá repetir até que q seja maior ou igual a 32 e a cada repetição o valor de q será dobrado.


    Pronto, agora vamos ver com calma o seu código.


    1 int p = 2;
    2 for (int q = 2; q < 32; q = q * 2)
    3 {
    4       while (p < q)
    5       {
    6            p = p * 2;
    7       }
    8       q = p - q;
    9 }


    Vamos começar com o laço da linha 2. O valor inicial de q é 2, ou seja, menor que 32. Portanto o laço irá rodar pelo menos uma vez. O valor de q é atualizado tanto dentro do for quanto na linha 8. A atualização da linha 8 depende do laço while da linha 4, o qual depende do valor atual do q.
    Esse tipo de laço dentro de laço onde os valores das variáveis mudam é muito difícil de explicar. É preciso pegar lápis e papel e seguir cada iteração dos laços.

    Coloque alguns Console.Write para entender o que acontece:


                int p = 2; 
                Console.WriteLine(String.Format("linha1 - p={0}",p));
                for (int q = 2; q < 32; q = q * 2)
                {
                    Console.WriteLine(String.Format("linha3 - q={0} p={1}", q, p));
                    while (p < q)
                    {
                        p = p * 2;
                        Console.WriteLine(String.Format("linha6 - q={0} p={1}", q, p));
                    }
                    q = p - q;
                    Console.WriteLine(String.Format("linha8 - q={0} p={1}", q, p));
                }


    Henri Nusbaum - Itelios do Brasil Informática Ltda
    quinta-feira, 18 de fevereiro de 2010 15:13
  • Muito obrigado a todos em especial ao henri nusbaum pela esplicação
    sábado, 27 de fevereiro de 2010 01:24