Laços de repetição
Laços de repetição são formas de controlar o fluxo de execução, de forma que uma parcela de código possa ser executada novamente, é muito comum que as pessoas se refiram a eles pelo nome inglês “loop”.
Ao aliar laços de repetição com a modificação de variaveis, podemos efetivamente ter um comportamento diferente mesmo repetindo os mesmos comandos.
Da mesma forma que o if, as palavras chave while, do while e for, podem executar um único statement sem a necessidade de usar chaves ({}) ou vários statements ao colocar eles entre chaves.
Controle de fluxo dos laços de repetição
Ao executar laços de repetição, existem duas palavras chave usadas para controlar o fluxo em um laço.
Uma delas é o break, no português “quebrar”, usada para sair do laço de repetição forçadamente.
A segunda é o continue, no português “continuar”, usada para pular para a próxima iteração.
O termo iteração se refere a uma das execuções da repetição, de forma que executar 3 vezes o conteúdo de um loop sejam “3 iterações”, ou acessar todos elementos de uma lista em um laço de repetição seja normalmente dito como “iterar uma lista”.
While
A palavra chave while, no português “enquanto”, é de certa forma similar ao if, porém ao final de cada execução, o fluxo de execução novamente volta a antes da condição ser checada.
Portanto, o while repete a execução do código enquanto sua condição for Verdadeira, e a condição é avaliada uma vez por iteração.
Abaixo um programa que calcula tabuada, usando while :
#include <stdlib.h>
#include <stdio.h>
int lerNumero(const char *texto)
{
char linha[1024];
fgets(linha, sizeof(linha), stdin);
return (int) strtol(linha, NULL, 10);
}
int main()
{
int valor = lerNumero("Digite um número de 1 a 10:");
if(valor < 1 || valor > 10) {
puts("Digitou um valor inválido");
return 1; //Finaliza o programa
}
int n = 1;
while(n <= 10) {
printf("%d x %d = %d\n", valor, n, valor * n);
n++;
}
}
Lembrando que é possível realizar um laço de repetição infinito utilizando while(1) por exemplo, nesses casos o normal é que haja uma condição com break para sair do loop.
Do While
O do while é bastante similar ao while, a diferença é que a condição do laço é checada no final, sendo mais eficiente/ideal para casos onde a condição naturalmente se encaixa no fim.
A ordem para escrita do do while é do conteudo while(condição), de forma que do x++; while(x < 10); seja uma forma válida para escrever, mas o mais comum é usando chaves no lugar do conteudo.
Exemplo de uso do do while :
#include <stdio.h>
int main()
{
int i = 0;
do {
printf("%d\n", i);
i++;
} while (i < 5);
}
For
A palavra chave for, no português “para”, é normalmente utilizada para iterar sobre listas, arrays, strings (textos), etc.
Porém o for é separado em 3 campos:
for(pre-execução; condição; pós-iteração)
- O campo de pre-execução, que pode ser vazio, inclui um único statement que é executado antes de checar o campo
condiçãopela primeira vez, ele também pode conter uma declaração de variável (que só vai existir dentro dofor). - O campo de condição, é similar ao campo de condição de um
while, porém quando este campo está vazio, considera-se um loop infinito (similar awhile(1)). - O campo da pós-iteração, que pode ser vazio, é um único statement (que não deve ter
;) que é executado após cada iteração do laço, geralmente utilizado para modificar alguma variável usada dentro do laço.
Lembrando que no for, os statements não devem ter ;, e o ; é meramente o separador entre os campos e deve estar incluso, mesmo se o campo estiver vazio.
Dessa forma, um loop infinito com for pode ser feito utilizando for(;;).
Exemplo do laço de repetição for usado para escrever todos valores de um array :
//Esta é uma "macro" que calcula o tamanho do array
#define ARRAY_SIZE(X) (sizeof(X)/sizeof(*X))
int main()
{
//Este é um array, uma variável que indica uma lista de valores sequenciais
//Vamos falar mais sobre ele mais tarde
int numeros[5] = {53,37,84,28,39};
//É muito comum o uso do nome "i" para criar um indice ao iterar
//sobre arrays, o padrão (criar indice; checar faixa; incrementar) é muito comum
for(int i = 0; i < ARRAY_SIZE(numeros); i++) {
printf("%d\n", numeros[i]);
}
}