domingo, 3 de agosto de 2014

Algoritmo e Programação - For

  Olá a todos. Vamos dar sequência a nossa série de programação estudando um novo comando: o for.

  O comando for é um dos comandos de laço existentes na linguagem C. A função de um comando de laço é repetir múltiplas vezes o mesmo trecho de código, até que uma certa condição seja atendida. Esse comando é extremamente flexível e, por isso, estudaremos ele inicialmente. Como exemplo, vamos analisar o seguinte trecho de código.

int main()
{
     unsigned char i;
     for(i = 0; i < 5; i++)
     {
          printf("O valor de i: %d.\n",i);
     }
}


  O que esse trecho de código fará? Primeiramente criará uma variável do tipo char com o nome "i". Perceba que essa variável é local (sua existência se limita ao interior da função main()) e foi criada sem a definição de um valor inicial. Enquanto as variáveis globais são criadas com valor igual a 0, as variáveis locais não são necessariamente criadas com algum valor inicial, podendo conter qualquer valor de "lixo". É necessário tomar cuidado com essas regras pois elas podem variar conforme o compilador usado (problema especialmente verificado em compiladores para microcontroladores, que nem sempre seguem à risca as regras de C ANSI).

  Após criada a variável "i", cujo valor, à priori, não sabemos, há o comando for. O comando for recebe três argumentos (e aqui argumentos é somente uma forma de falar, pois o comando for não é uma função) separados por ponto e vírgula. Primeiramente colocamos as condições de inicialização. Essas condições atribuem valores as variáveis antes que o laço de repetição comece a ser executado. Neste caso foi atribuído a variável i o valor 0. Também tenha em mente que é possível inicializar o valor de múltiplas variáveis, como, por exemplo:

for(i = 0, j = 3; i < 5; i++)
{
     //Qualquer coisa aqui dentro!
}

  Neste trecho de código foi atribuído a variável i o valor 0 e a variável j o valor 3 na mesma inicialização do for. Atente para o fato de que as variáveis i e j devem ser declaradas antes do comando for.

  Após a inicialização vem a condição, que é uma expressão que determinará quando o laço deve ser encerrado. No nosso exemplo temos a condição (i < 5). Isso significa que o laço se repetirá enquanto o valor da variável i for menor que 5. Se ao final de uma iteração (onde uma iteração é a execução de todos os comandos internos a um laço de repetição) o valor de i for igual ou maior que 5, o laço for não será executado mais e o programa seguirá executando os comandos posteriores ao for.

  Na condição devemos ter apenas um teste, mas esse teste pode envolver mais de uma variável. Vejamos os seguintes exemplos:

for(i = 0, j = 2; i+j<10 i="" p="">{
     //Qualquer coisa aqui.
}

for(i = 0, j = 0; (i<2 amp="" i="" j="" p="">{
     //Qualquer coisa aqui.
}

  No primeiro exemplo estamos testando a soma da variável i e da variável j. Enquanto o resultado dessa soma for menor que 10 o laço continuará a ser repetido. No segundo exemplo estamos testando se o valor da variável i é menor que 2 e se, ao mesmo tempo, o valor da variável j é menor que 1. Enquanto ambas condições forem verdadeiras simultaneamente, o laço de repetição continuará a ser executado.

  Vamos voltar ao nosso exemplo inicial. Após o segundo ponto e vírgula temos o incremento. No incremento vamos determinar quais variáveis terão seu valor alterado. No nosso exemplo inicial temos a expressão mais comum, que é i++. Essa expressão, como já sabemos, incrementam em 1 o valor atual da variável i. Mas nem sempre temos que incrementar em 1 o valor da variável. Vejamos outro exemplo:

for(i = 100; i > 40; i-=5)
{
     //Qualquer coisa aqui.
}

  Nesse último exemplo a variável i é decrementada por um valor de 5. Ou seja, ao final dos comandos contidos pelo laço for a variável i tem seu valor diminuído por 5.

  Também é possível alterar o valor de mais de uma variável. Vejamos o próximo exemplo.

for(i = 100, j = 50; i+j > 40; i-=5, j-=10)
{
     //Qualquer coisa aqui.
}

  Neste último exemplo estamos alterando o valor de duas variáveis, que são i e j. A variável i tem seu valor decrementado por 5, enquanto a variável j tem seu valor decrementado por 10.

  No nosso exemplo inicial, o laço é executado 5 vezes, e o valor de i é incrementado 1 unidade, passando pelos valores 0, 1, 2, 3 e 4. Quando o valor de i é igual a 5, o laço for é encerrado, e os comandos não são executados com i igual a 5. O programa então mostra as seguintes mensagens na tela:

O valor de i: 0.
O valor de i: 1.
O valor de i: 2.
O valor de i: 3.
O valor de i: 4.

  Devemos porém prestar atenção nas possíveis armadilhas que existem quando utilizamos laços de repetição. A mais famosa (e mais perigosa) é o laço infito. Esse problema ocorre quando criamos um laço sem condição de encerramento, ou cuja condição nunca possa ser alcançada. Vamos a um exemplo.

for(i = 0; i != 3; i +=2)
{
     //Qualquer comandos aqui, desde que não alterem o valor de i;
}

  A implementação acima consiste de um laço infinito. Analisando esse trecho, percebe-se que o valor de i foi inicializado com 0, e que o laço será executado enquanto o valor de i for diferente de 3. Porém, no incremento, definimos que o valor de i é sempre incrementado por um valor de 2. Se temos um número par, e sempre incrementamos por um número par, nunca teremos um número ímpar como 3. Dessa forma, a condição de encerramento do laço nunca poderá ser atingida e, portanto, o laço executará para sempre. Hoje em dia isso causa "apenas" o travamento completo de seu programa. Porém, antigamente, o sistema operacional (SO) não conseguia tomar o controle da máquina. Então cabia aos programas terem comandos que devolviam ao sistema operacional o controle do processador. Em um sistema assim (chamado de processamento cooperativo) se o programa entrava em um laço infinito e não conseguia devolver ao SO o controle da máquina, todo o computador ficava travado e precisava ser reiniciado. Não havia Ctrl+Alt+Del para finalizar a tarefa. Então perceba o quanto um laço infinito é perigoso para um sistema. E, levando em conta que a maioria das aplicações microcontroladas não possui SO, os laços infinitos continuam travando completamente esse tipo de sistema. Portanto, esteja sempre atento!

  E por hoje era isso. Seguindo nosso ritual tradicional de final de post, digo que qualquer dúvida, sugestão ou crítica deixem comentários. Cumprido os procedimentos protocolados, um abraço a todos e continuem estudando.

Nenhum comentário:

Postar um comentário