Introdução ao comando de repetição for
Nesta seção examinaremos um novo comando de repetição, bastante útil quando o número de passos (cada repetição de um bloco de comandos) é conhecido à priori, ou seja, conhecido ao iniciar o laço.
Em várias linguagens de programação (com C e em Python) esse comando recebe o nome de for (para). Além disso ele deve sempre dispor de um enumerador (ou iterador), ou seja, uma variável que será utilizada para controlar o número de repetições do bloco de comandos subordinado ao for. Esse enumerador pode ser usado em comandos do bloco.
Comando for em CEm C a sintaxe do comando é:
| Comando for | Equivalente usando while |
|---|---|
for (varint=valorIni, condicao, incremento) comandoSubordinado; |
varint = valorIni;
while (condicao) {
comandoSubordinado;
incremento; // geralmente algo como: varint += passo;
} |
Por exemplo, o programa abaixo que imprime a soma dos n primeiros naturais, mas somando-os em ordem invertida, começando com o n, depois somando-se n-1 e, assim por diante, até o 1.
#include <stdio.h>
int main (void) {
int n, i; // declarando o indexador i do comando for e o tamanho do laco n
int soma = 0;
scanf("%d", &n); // ler a quantia desejada de naturais
for (i=n; i>0; i--) {
soma += i; // acumula o atual natural em i
printf("%d : %d\n", i, soma); // imprime contador e a soma parcial
// apos ultimo comando subordinado ao for, executa-se o incremento do contador (ou seja, i <- i-1, entao
// a execucao retorna ao inicio do for e testa se continua (i>0),
// se for repete-se os comandos subordinados, senao finaliza o for
}
printf("Soma dos %d primeiros naturais eh igual a %d\n", n, soma);
return 1; // se foi algum outro programa que invocou este, devolva o valor 1
}
Comando for em Python
Em Python é necessário usar um iterador, isso pode ser feito com a função range(...) que pode ter 1, 2 ou 3 parâmetros do tipo número natural. Se tiver apenas um parâmetro significa que deve gerar os n primeiros naturais. Se tiver dois parâmetros naturais, neste caso significa os naturais entre ambos, mas também pode ter três parâmetros e neste caso o último é o tamanho do passo. Abaixo a forma geral do comando for, com um exemplo de range(...) usando apenas um parâmetro.
Também pode-se fazer o i ter outro valor inicial e tamanho de passo diferente, mesmo passos "negativos". Por exemplo, para imprimir os n/2 primeiros ímpares pode fazer:
| for i in range(1, n, 2) : print("%d " % i, end=""); | |
| print(); |
Por exemplo, o programa abaixo que imprime a soma dos n primeiros naturais, mas somando-os em ordem invertida, começando com o n, depois somando-se n-1 e, assim por diante, até o 1.
def main () :
#inteiros: n, i; :: usaremos como indexador i para o comando for e o tamanho do laco n
soma = 0;
n = int(input()); # ler a quantia desejada de naturais
for i in range(n, 0, -1) :
soma += i; # acumula o atual natural em i
print("%d : %d" % (i,soma)); # imprime contador e a soma parcial
# desse ponto, incrementa-se i (ou seja, i <- i-1, entao a execucao retorna ao inicio do for e se i>0,
# repete-se os comandos subordinados ao for
print("Soma dos %d primeiros naturais eh igual a %d" % (N,soma));
main()
Note que no exemplo acima usamos o marcador %d dentro da função print, isso significa que no lugar do primeiro %d deverá ser impresso o valor da primeira variável, encontrada após fechar aspas e após o caractere % (i.e., i) e no lugar do %d deverá ser impresso o valor da segunda variável (i.e., soma). O %d está associado à inteiros, se precisar de caractere deve-se usar o formator %c, se precisar de ponto flutuante deve-se usar o %f e se for usar uma variável que guarda caracteres (string), deve-se usar o formatador %s.
Exercitando a compreensão: simulando o códigoÉ interessante usar simulações para melhor compreender o desenvolvimento dos algoritmos, mais ainda se você detectar algum erro em seu código, que portanto precisa ser corrigido. Adotaremos o seguinte esquema de simulação: usaremos uma tabela com as variáveis do código e registraremos cada alteração em uma linha, seguindo o fluxo de execução de cima para baixo, de modo que o último valor de uma variável (em qualquer ponto/linha) será o primeiro valor, na coluna da variável, encontrado "olhando" para "cima". Indicaremos as atribuições com ":=".
n | soma | i impressoes
---+------+--- ----------
soma := 0 ? | 0 | ?
* leitura para inteiro n 3 | |
i := 0 (primeiro da lista (0,1,2) | | 0
* entra no laco "for" pois 0=i<n=3 | |
soma := 0 (pois: soma recebe soma+i=0+1) | 0 |
* saida: 0 : 0 | | 0 : 0
i := 1 (segundo da lista (0,1,2)) | | 1
* entra no laco "for" pois 1=i<n=3 | |
soma := 1 (pois: soma recebe soma+i=0+1) | 1 |
* saida: 1 : 1 | | 1 : 1
i := 2 (terceiro da lista (0,1,2)) | | 2
* entra no laco "for" pois 2=i<n=3 | |
soma := 3 (pois: soma recebe soma+i=1+2) | 3 |
* saida: 2 : 3 | | 2 : 3
* nao tem elemento na lista (0,1,2) apos o 2 | |
* final do laco "for" (sem mais elementos) | |
* executa primeira instrucao apos laco "for" | |
* saida: Soma dos 3 primeiros naturais eh igual a 3 | | Soma dos 3 primeiros naturais eh igual a 3
|
Em relação à função range(...) existe uma diferença interessante entre o Python 2 e o Python 3. No 2 ao usar por exemplo, range(10) é gerada uma lista com os 10 primeiros naturais, assim imediatamente após invocar a função é necessário alocar espaço de memória para os 10 elemento. Já no Python 3 os elementos são gerados a medida que se precisa deles.
Vejamos como funcionam os parâmetros em range:
| # parâmetros | função | resultado |
|---|---|---|
| 1 parâmetro | lst = range(10) | Gera uma lista com os naturais 0,1,2,3,4,5,6,7,8,9 |
| 2 parâmetros | lst = range(0,10) | Gera uma lista com os naturais 0,1,2,3,4,5,6,7,8,9 |
| 2 parâmetros | lst = range(1,10) | Gera uma lista com os naturais 1,2,3,4,5,6,7,8,9,10 |
| 3 parâmetros | lst = range(0,10,2) | Gera uma lista com os naturais 0,2,4,6,8 |
Leônidas de Oliveira Brandão
http://line.ime.usp.br
Alterações:
2020/08/15: novo formato, pequenas revisões
2019/07/28: Versão 1.2 (vários acertos)
2019/03/31: Versão 1.1
2017/05/03: versão 1.0