Nos primórdios da computação, ao escrever um trecho de código que deveria ser repetido algumas vezes, utilizava-se muito a instrução “goto”. Traduzindo ao pé da letra significa “vá para”, ou seja, partindo do ponto atual do programa, o programador escrevia um salto para outra parte do programa.
Imagine uma analogia simples. Você está lendo um livro muito chato ou está muito sonolenta(o), de tal forma que ao chegar ao final da página, não se recorda de praticamente nada do que leu. Então decide iniciar a leitura da página novamente pelo primeiro parágrafo. Você acabou de utilizar uma instrução “goto” para o início da página.
Como é possível imaginar, isso gerava muitos problemas. Em programas extensos e/ou complexos, haviam tantos “gotos” que tornava extremamente difícil a manutenção e a correção de erros. Quando o programador se dava conta, já havia passado por tantos “gotos” que nem se lembrava mais de onde havia partido ou para onde deveria voltar. Assim, ficou evidente a necessidade de algo que substituísse o terrível “goto”.
Goto pra lá. Goto pra ká. Goto de lá. Goto de ká. Goto pra todo lado.
Fonte: https://tenor.com/view/conspiracy-theory-explaining-gif-13403485
Assim surgiram os blocos de instruções para repetir alguma tarefa uma quantidade definida de vezes ou enquanto alguma condição for satisfeita. Hoje veremos a instrução do tipo “for”, que pode ser traduzida literalmente como “para”. Logo logo ficará claro o por quê.
Para fazer uso da instrução “for” precisamos saber exatamente quantas vezes um determinado trecho de código deve ser executado. Se esta informação não for conhecida, então deve-se utilizar uma outra instrução de repetição que será apresentada em uma outra oportunidade.
Para ilustrar nosso exemplo, imagine que escreveremos um pequeno trecho de código para imprimir na tela a média aritmética de 3 notas que serão informadas pelo teclado. Perceba que a ação a ser executada é a mesma: ler nota 1; ler nota 2; ler nota 3, e por fim, calcular e imprimir a média na tela. O código utilizado será o mesmo, apenas a nota será diferente. Perceba também que, para ler as notas precisamos saber quantas são.
Apenas para frisar. Sim, há várias maneiras de escrever um pequeno trecho de código para realizar a tarefa proposta. Apresentaremos aqui uma maneira que ajuda a entender o uso da instrução “for”.
Perceba que n é um número conhecido, a quantidade de notas. Se desejamos que algo seja feito n vezes, precisamos então contar cada execução. Perceba que estamos trabalhando em alto nível de abstração, dizendo exatamente cada coisa que o computador deve fazer. Assim, se você deseja que uma instrução seja executada 30 vezes, por exemplo, e não contar cada execução, o computador nunca saberá quando parar.
Isso nos leva a conclusão de que precisamos de uma variável que será utilizada para contar. Apenas isso. Em outras palavras podemos dizer: para n iniciando em 1; até menor ou igual a 3; sendo incrementado de 1 em 1; faça…
Se você têm dúvidas sobre o que são variáveis e como utilizá-las, talvez este artigo aqui ajude.
Perceba que há várias coisas acontecendo na frase dita anteriormente: uma variável contadora chamada n está sendo inicializada com o valor numérico 1; um teste está sendo feito para verificar se o valor de n é menor ou igual a 3 e, por fim, está sendo incrementada de 1 em 1, ou seja, a cada execução, será somado 1 ao valor atual da variável n.
Dê uma boa olhada no trecho de código a seguir e verifique quais linhas você não compreende. Baseado no que você leu até aqui, tende imaginar o que cada linha faz. Esta habilidade de abstração é importantíssima.
#include <stdio.h> int main() { float nota, media, soma = 0; int i, n = 3; for(i = 1; i <= n; i++){ printf("Nota %d: ", i); scanf("%f", ¬a); soma += nota; } media = soma/n; printf("Media: %.2f\n", media); return 0; }
Entendendo seu programa C linha a linha
Na linha 1 estamos incluindo em nosso programa uma biblioteca da linguagem C. Neste caso a biblioteca stdio.h. Praticamente todos os programas em C precisam desta biblioteca pois, todas as funções e procedimentos de entrada e saída estão definidos nesta biblioteca. Por isso o nome “stdio”, i de entrada (input) e o de saída (output).
Na linha 3 temos a função principal de nosso pequeno programa. Todo programa em C precisa desta função. É por onde o nosso programa começa a ser executado. Qualquer outra função ou procedimento que precisamos deve ser chamado aqui dentro.
Nas linhas 4 e 5 apenas criamos algumas variáveis. Variáveis do tipo float na linha 4 e variáveis do tipo int na linha 5. Perceba que a diferença entre elas deve ser considerada. É extremamente importante.
A quantidade de notas sempre será inteira, nunca teremos uma fração de nota, e usaremos a variável n para armazenar esta quantidade. Como dito acima, se queremos que um determinado trecho de código seja executado uma quantidade finita de vezes, precisamos contar a cada execução. Lembre-se, o computador não faz nada se você não mandar ele fazer. Assim, vamos utilizar a variável i para contar a quantidade de execuções.
Por outro lado, notas podem possuir parte decimal, por isso precisamos então de variáveis do tipo float. Mais especificamente usaremos 3: nota, para receber a nota que será digitada no teclado; soma, que acumulará a soma das notas; e media, que receberá a médias das notas informadas.
Em seguida, queremos pedir ao usuário n notas. Contudo, não queremos escrever n linhas de código para pedir uma nota e ler uma nota do teclado. Perceba que, ao fazer isso, se um aluno entrar ou sair da turma, a quantidade de alunos é alterada. Consequentemente, teríamos de escrever ou apagar linhas de código referente a este aluno.
Aqui entra a magia da instrução “for”. Ela está sendo utilizada na linha 7 com a variável contadora i. Perceba que ela possui 3 partes separadas por ponto e vírgula:
→ a primeira é o valor com que a variável contadora inicia, neste caso o valor 1;
→ a segunda é o teste que deve ser feito para então decidir se executa mais uma vez ou não, neste caso, se a variável contadora é menor ou igual a n, que é a quantidade de alunos. Este detalhe é importante. Caso a comparação entre i e n seja falsa, ou seja, se i for maior que n, então a instrução “for” termina e a execução do programa continua a partir da linha 12. Caso a comparação seja verdadeira, ou seja, caso i seja menor ou igual a n, então as instruções dentro da instrução “for” serão executadas, neste caso as linhas 8, 9 e 10.
→ a terceira parte apenas é executada após a execução de todas as instruções presentes dentro da instrução “for”. Como mencionado anteriormente, o computador não sabe das coisas. Se desejamos que algo seja feito exatamente 3 vezes, por exemplo, então precisamos contar. É exatamente isto que acontece a terceira parte. É adicionado, ou incrementado 1 ao valor da variável contadora i.
Dentro da instrução “for”, na linha 8, utilizamos um procedimento de saída para imprimir uma mensagem na tela, pedindo ao usuário uma nota. Na linha 9, utilizamos um procedimento de entrada para ler o que foi digitado no teclado e salvar em nossa variável nota. Na linha 10, estamos acumulando a nota digitada na variável soma, que foi inicializada com o valor 0.
É muito importante inicializar com 0 variáveis acumuladoras como a variável soma. Quando criamos uma variável, uma região de memória qualquer é separada para nosso programa. Não sabemos o que há naquela região de memória. Ela pode estar limpa, mas também pode conter o que chamamos de lixo de memória, dados de outros programas que já foram fechados e não limparam adequadamente a memória. Assim, inicializar a variável com o valor 0 garante que, caso exista algum lixo naquela região de memória, tudo será apagado.
Por fim, na linha 12, temos uma atribuição. A variável media está recebendo a média das notas informadas. Na linha 13 temos outra instrução de saída, imprimindo na tela a média das notas apenas com duas casas decimais, por isso a presença do .2 entre o %.2f.
Por fim, a linha 16 apenas diz para o sistema operacional que nosso programa finalizou com sucesso, sem erros.
Instrução for (para) invertida
É importante perceber que a instrução “for” não é rígida. É uma instrução flexível, permitindo diferentes formas de utilização.
Apresentamos a seguir uma nova versão do programa para o cálculo da média. A contagem agora é decrescente. Perceba que a variável contadora i é inicializada com o valor de n. A condição de parada agora é i ser igual a zero e, por fim, não temos mais um incremento de 1 unidade, mas um decremento de 1 unidade.
#include <stdio.h> int main() { float nota, media, soma = 0; int i, n = 3; for(i = n; i > 0; i--){ printf("Nota %d: ", i); scanf("%f", ¬a); soma += nota; } media = soma/n; printf("Media: %.2f\n", media); return 0; }
Incremento diferente de 1
Outro ponto importante a ser entendido é que o incremento ou decremento também é flexível e pode ser utilizado de forma a facilitar a resolução de um problema.
Apresentamos a seguir uma nova versão do programa para o cálculo da média, contudo o incremento agora é feito de 2 em 2. Assim, percebe que, se desejamos a media de 3 notas e o incremento ocorre de 2 em 2, então o nosso ponto de parada não será mais n, mas 2 * n.
#include <stdio.h> int main() { float nota, media, soma = 0; int i, n = 3; for(i = 1; i <= 2 * n; i += 2){ printf("Nota %d: ", i); scanf("%f", ¬a); soma += nota; } media = soma/n; printf("Media: %.2f\n", media); return 0; }
Obviamente isso torna a simples tarefa de calcular a média de 3 notas um pouco mais complicada. Perceba que o objetivo aqui foi apresentar de forma simples algumas das possibilidades de utilização da instrução “for”.
Imagine que por algum motivo, você precise calcular a soma de todos os números ímpares entre 1 e 100. Isso pode ser feito de forma muito simples e eficiente como apresentado no programa a seguir, com a variável contadora iniciando em 1, que é ímpar, e incrementando de 2 em 2.
#include <stdio.h> int main() { int i, soma = 0, n = 100; for(i = 1; i <= n; i += 2) { printf("%d ", i); soma += i; } printf("\nSoma numeros impares ate 100: %d\n", soma); return 0; }
Se ficou alguma dúvida, compartilhe nos comentários que faremos o possível para esclarecer. Um grande abraço, bons estudos e até o próximo.