Estruturas de Repetição

Last updated: September 2nd, 2018

Introdução

Computadores são especialmente bons em realizar tarefas repetitivas. Nesta aula, veremos como codificar estruturas de repetição, que permitem que um conjunto de comandos seja executado em sequência mais de uma vez.

Uma estrutura de repetição permite que um conjunto de comandos sejam executados enquanto uma condição for verdadeira. As estruturas de repetição também são chamadas de laços ou loops.

Cada vez que o conjunto de ações do laço é repetido, acontece uma iteração. Portanto, veremos as estruturas de repetição iterativas nesta aula.

As estruturas deste tipo mais comuns são:

  • Repetição contada
  • Condicional com teste no início
  • Condicional com teste no final

Laço for

O laço for é a estrutura de repetição contada. Utilizamos ele quando sabemos de antemão quantas repetições serão feitas.

Este número de repetições pode ser um valor fixo, por exemplo, mostrar os primeiros 10 números pares; ou pode ser um valor informado pelo usuário ou calculado pelo programa.

O importante é que, ao entrar no laço, o computador já sabe quantas iterações serão feitas. Os laços for são construídos conforme mostrado abaixo.

...
int idx; /* variavel de indice */
for(idx = <inicio>; idx <teste> <parada>; idx <incremento>){
    /* comandos */
}
  • inicio é o valor inicial do índice, geralmente 0 ou 1.
  • teste é a condição a ser testada, i.e. <, <=, =, >, >=, !=
  • parada é o valor de parada.
  • incremento é o valor a ser atribuído ao índice ao final de uma iteração.

A ordem em que cada parte do laço for é executada acontece da seguinte maneira:

  1. O valor de início é atribuído à variável índice.
  2. A condição de parada é testada.
  3. Os comandos do laço for são executados.
  4. O incremento é feito.
  5. Repete do passo 2, até que a condição seja avaliada como falsa.

Exemplo 1

Listar os primeiros 10 números inteiros de maneiras diferentes.

Execução
  int idx = 0;
  printf("Ordem crescente\n");
  for(idx = 1; idx <= 10; idx++){
      printf("%d ", idx);
  }
  printf("\nOrdem decrescente\n");
  /* Ordem decrescente */
  for(idx = 10; idx > 0; idx--){
      printf("%d ", idx);
  }
  printf("\nCrescente, somente pares.\n");
  for(idx = 2; idx <= 10; idx += 2){
      printf("%d ", idx);
  } 
  printf("\nCrescente, somente impares.\n");
  for(idx = 1; idx <= 10; idx += 2){
      printf("%d ", idx);
  }

Exemplo 2

Média de uma quantidade de números informada pelo usuário.

printf("Quantidade de numeros:\n");
int n, i;
scanf("%d", &n);
float total = 0;
/* ler todos os numeros */
for(i = 0; i < n; i++){
    float f;
    scanf("%f", &f);
    total += f; /* Armazenando a soma total */
}
float media = total / n;
printf("Media eh %f\n", media); 

Exemplo 3

Mostrar o valor ASCII das letras minúsculas.

Execução
int i;
/* i recebe o valor do caractere 'a', e eh comparado ao valor do caractere 'z' */
for(i = 'a'; i <= 'z'; i++){
    printf("%d - %c\n", i, i);
}

Laços for aninhados

É possível ter laços aninhados, isto é, um laço de repetição dentro do outro.

Quando isso acontece, o laço interno é repetido por completo todas as vezes que o laço externo for executado. Veja o exemplo.

Atenção!

Lembre-se de usar variáveis diferentes para guardar o índice dos laços diferentes!

Exemplo

Execução
int i, j;
for(i = 0; i < 3; i++){
    printf("Loop externo %d\n", i);
    for(j = 0; j < 3; j++){
        printf("Loop interno %d\n", j);
    }
}
                                    

Teoricamente não existe um limite de laços aninhados permitidos. Na prática, no entanto, laços aninhados não são muito eficiêntes. Existem ocasiões em que são necessários, mas muito dificilmente você precisará mais do que 3 laços aninhados.

Exercícios Recomendados (1064 ~ 1165 URI)