O diagrama abaixo exemplifica uma estrutura de repetição condicional. De forma similar à estrutura de seleção, há uma condição que direciona o fluxo de ações a serem executadas em seguida, sendo que as <Ações caso verdade> são executadas no caso da condição resultar num valor loǵico verdade (True). Após a execução desse conjunto de ações, a condição volta a ser avaliada, repetindo-se o processo enquanto a condição for verdadeira. Quando a avaliação da condição resultar num valor falso (False), o processo de repetição é encerrado, passando a ser executadas as ações subsequentes.
Esta estrutura é classicamente conhecida como estrutura while, sendo condificada em Python como:
while <condição>:
<ações caso verdade>
Para exemplificar, considere o problema de calcular a média de 5 valores inteiros obtidos via comando input(), cujo algoritmo é apresentado no diagrama abaixo.
Em Python este algoritmo pode ser codificado conforme abaixo.
# Cálculo da média de 5 valores inteiros lido via input
contador = 1
soma = 0
while contador <= 5:
soma += int(input())
contador += 1
print(soma / 5)
Este mesmo problema descrito acima pode ser implementado utilizando a estrutura for em conjunto com a função range, conforme mostrado abaixo.
# Cálculo da média de 5 valores inteiros lido via input
soma = 0
for _ in range(5):
soma += int(input())
print(soma / 5)
A cláusula range(5) implica a série [0, 1, 2, 3, 4], de forma que a variável contador assume cada um desses valores em sequência, nessa ordem, a cada repetição (iteração) da estrutura for. O resultado é que a linha 4 é executa 5 vezes, resultando na leitura de cinco valores inteiore e consequente acumulação na variável soma.
A cláusula range tem algumas variações, sendo sua forma mais genérica dada por: range(start, stop, step). Veja alguns exemplos:
range | equivalente | sequência |
---|---|---|
range(5) | range(0, 5, 1) | [0, 1, 2, 3, 4] |
range(3, 7) | range(3, 7, 1) | [3, 4, 5, 6] |
range(3, 10, 2) | range(3, 10, 2) | [3, 5, 7, 9] |
range(10, 3, -2) | range(10, 3, -2) | [10, 8, 6, 4] |
# Sequência crescente de valores
for i in range(3, 15, 3):
print(i)
# Sequência decrescente de valores
for i in range(10, 3, -2):
print(i)
Considere que tenhamos uma sequência de números reais correspondentes às notas (números reais positivos) obtidas por um conjunto de candidatos numa prova de seleção e desejamos calcular a sua média. Não sabemos quantos candidatos há, mas sabemos que o último valor da sequência é o valor -1 (um negativo), o qual está ali apenas para indicar que a sequência chegou ao fim, ou seja, não deve fazer parte do cálculo em si.
como não sabemos o tamanho da sequência mas sabemos qual é o último valor (-1), vamos utilizar o comando de repetição "while" para definir a repetição. Esta tarefa pode ser executado pelo programa abaixo:
soma = 0 # iniciamos a variável soma com o elemento neutro da adição
# nela vamos progressivamente acumulando a soma dos valores para no final calcular a média
contador = 0 # precisamos contar quantos números foram lidos para no final calcular a média
nota = float(input()) # lemos a primeira nota da sequência
while nota != -1: # verificamos se o valor lido é o último; se for, paramos o processo de leitura
soma += nota # acumulamos a nota lida na variável soma
contador += 1 # incrementamos o contador em 1 unidade de forma a contarmos quantos candidatos há
nota = float(input()) # lemos a próxima nota da sequência (da 2º em diante)
media = soma / contador # cálculamos a média
print(media) # apresentamos a média
soma = 0 # iniciamos a variável soma com o elemento neutro da adição
# nela vamos progressivamente acumulando a soma dos valores para no final calcular a média
contador = 0 # precisamos contar quantos números foram lidos para no final calcular a média
while True: # verificamos se o valor lido é o último; se for, paramos o processo de leitura
nota = float(input()) # lemos a nota da sequência
if nota == -1:
break # causa a parada do processo de repetição
soma += nota # acumulamos a nota lida na variável soma
contador += 1 # incrementamos o contador em 1 unidade de forma a contarmos quantos candidatos há
media = soma / contador # cálculamos a média
print(media) # apresentamos a média
Considere a mesma descrição do exemplo 1), porém desejamos saber qual é nota máxima obtida pelos candidatos. Em outras palavras, desejamos a maior nota dentre aquelas que foram obtidas pelos candidatos. Esta tarefa pode ser executado pelo programa abaixo:
maior_nota = -math.inf # consideramos, no início, que maior nota é absurdamente baixa, inferior a qualquer nota possível.
# ao lermos as notas vamos progressivamente melhorando esta hipótese inicial
nota = float(input()) # lemos a primeira nota da sequência
while nota != -1: # verificamos se o valor lido é o último; se for, paramos o processo de leitura
if nota > maior_nota: # a condição é verdadeira caso a nota lida seja superior à estimativa anterior
maior_nota = nota # neste caso, substituimos a estimativa anterior pela nova
nota = float(input()) # lemos a próxima nota da sequência (da 2º em diante)
print(maior_nota) # apresentamos a maior nota
Considere um problema similar ao descrito no exemplo 2), porém considere que nos seja fornecida uma lista contendo o nome de cada candidato e sua correspondente nota. Os dados que nos foram fornecidos estão conforme exemplo abaixo, sendo que na primeira linhá há um número inteiro indicando o número de candidos, seguida de uma sequência de linhas (uma para cada candidato) nas quais estão anotados o nome do candidato e a correspondente nota obtida. Em cada linha é utilizado o caracter ";" para separar os dois dados.
23 João Carlos;5.8 Maria da Luz;7.1 Pedro Ernesto;5.3 ...
Desejamos, agora, saber qual o nome do candidato e a nota obtido pelo candidato que obteve a maior nota, sabendo que não há notas repetidas. Esta tarefa pode ser realizada por meio do programa abaixo:
n = int(input()) # lê a primeira linha, a qual contém o número de candidatos
maior_nota = -1 # consideramos, no início, que maior nota é absurdamente baixa, inferior a qualquer nota possível.
melhor_candidato = "" # consideramos um nome inicial fantasma (em branco) para o candidato com maior nota.
# na medida que vamos melhorando a estimativa para a melhor nota vamos também guardando o nome do candidato
for _ in range(n): # como sabemos quantos candidatos há, utilizamos o comando 'for' e a função 'range' para ler as linhas
nome, nota = input().split(";") # lemos uma linha e
# a dividimos em partes (duas, neste caso) utilizando o caracter ";" como separador
# as duas partes são atribuídas às variaveis "nome" e "nota", respectivamente
nota = float(nota) # transformamos a nota (até então um string) no correspondente valor real (float)
if nota > maior_nota: # verificamos se a nota lida representa uma estimativa melhor do que a que tínhamos antes
maior_nota = nota # como é melhor, substituimos a estimativa anterior pela nova
melhor_candidato = nome # e guardamos o nome deste candidato
print(melhor_candidato, maior_nota) # apresentamos o nome do melhor candidato e sua nota