Estruturas de repetição
Contato
- Jean Paulo Martins (jeanmartins utfpr edu br)
- Sala 105, Bloco S (UTFPR - Campus Pato Branco)
Conteúdo
- Conteúdo
- Ambiente de programação
- Estruturas de repetição
- Repetir enquanto:
while
- Exercício 1: complete o código
- Exercício 2: números pares
- Exercício 3: números impares
- Exercício 4: soma total da sequência
- Exercício 5: soma dos pares em uma sequência
- Exercício 6: média da sequência
- Exercício 7: média dos divisíveis por 3 na sequência
- Exercício 8: senha
- Exercício 9: senha com limite de tentativas
- Repetir enquanto:
- Prática de programação: lista de compras
- Exercício extra: média e máximo das notas
- Revisão: estrutura de repetição
while
- Alternativa: repetir para cada elemento (
for
) - Exercícios:
for
Ambiente de programação
Para seguir os exemplos aqui descritos sugiro a utilização do ambiente de programação online »repl.it. Mais adiante no curso veremos ferramentas mais apropriadas para programação.
Estruturas de repetição
Os programas vistos e implementados até então apresentam duas possíveis características. Nos primeiros exemplos, todo programa era uma sequência de linhas (operações) a serem executadas uma-a-uma até que o fim fosse atingido e a resposta (saída) computada. A seguir, introduzimos a ideia de condicionais (if/else/elif
) por meio dos quais se tornou possível definirmos que certas linhas do código-fonte (blocos de código) seriam executadas apenas se determinadas condições fossem verdadeiras. A adição de condicionais nos permite o tratamento de erros, a identificação de características nos dados e diversas outras condições que necessariamente precisamos considerar mesmo nos menores programas (códigos-fonte), no entanto, nossos programas continuam sendo sequenciais.
A partir de agora introduziremos uma das principais estruturas em linguagens de programação as estruturas de repetição. É fácil perceber que dentre os principais atrativos para que automatizemos certas tarefas por meio de programação é a velocidade com que computadores podem efetuar operações repetitivas. Por exemplo, suponha que tivéssemos uma lista de compras composta pelo nome dos itens e os seus respectivos preços e a quantidade, para sabermos qual o valor total da compra precisaríamos multiplicar o preço de cada item pela quantidade e somar os resultados. Nesse cenário simples, temos três possíveis dificuldades:
- Ao calcular o total de cada item estamos sujeitos a erro no cálculo,
- A soma total nos exige efetuar a soma do total de cada item, novamente sujeitos a erro de cálculos,
- Uma lista de compras grande pode tornar o trabalho bem tedioso, mesmo com uma calculadora em mãos.
Cada um desses itens é um atrativo para que essa tarefa fosse automatizada por meio de programação. As estrutura que nos permitem programar esse tipo de tarefas repetitivas são chamadas loops.
Repetir enquanto: while
A estrutura de repetição while
nos permite repetir um bloco de código enquanto
uma expressão lógica seja verdadeira. Essas expressões são do mesmo tipo daquelas que utilizamos nas estruturas condicionais if/else/elif
. Estruturas while
seguem sempre o seguinte formato:
while expressao_logica:
# bloco de código
#
Todo código que estiver interno à estrutura while
será repetido enquanto
(while
) a expressao_logica
seja verdadeira, portanto, é natural que o bloco de código altere alguma variável que esteja presente na expressao_logica
. Por exemplo, podemos utilizar uma estrutura de repetição para contar até dez.
numero = 1
while numero <= 10:
print(numero)
numero = numero + 1
Neste pequeno exemplo a expressão lógica é numero <= 10
e será verdadeira enquanto a variável numero
não ultrapasse o valor 10
, como cada vez que o bloco de código é repetido (iteração) a variável numero
é incrementada, em algum momento numero <= 10
se tornará falsa e a repetição finalizará.
Exercício 1: complete o código
Usando o exemplo acima como referência escreva um programa que imprima todos os números de 10 até 1. Complete o código abaixo:
numero = 10
while _______________:
print(numero)
numero = ____________
Exercício 2: números pares
Usando o exemplo acima como referência escreva um programa que imprima todos os números pares de 0 até 10. Complete o código abaixo:
numero = 0
while _______________:
if ______________:
print(numero)
numero = _____________
Exercício 3: números impares
Escreva um programa que imprima todos os números ímpares de 0 até 10.
Exercício 4: soma total da sequência
Escreva um programa que compute a soma de todos os números entre 0 e 100
Exercício 5: soma dos pares em uma sequência
Escreva um programa que compute a soma de todos os números pares entre 0 e 100
Exercício 6: média da sequência
Escreva um programa que compute a média de todos os números entre 965 e 5888
Exercício 7: média dos divisíveis por 3 na sequência
Escreva um programa que compute a média de todos os números divisíveis por 3 entre 5678 e 15098
Exercício 8: senha
Escreva um programa em Python que receba como entrada uma senha na forma de string. Seu programa deverá verificar se essa senha está correta e escolher uma dentre duas opções:
- Imprimir: “Acesso garantido.”
- Imprimir “Senha incorreta, tente novamente.”.
- Assuma que a senha correta seja “LP31M”.
Em caso de senha incorreta, um novo par de e-mail e senha devem ser lidos novamente, até que valores corretos sejam digitados.
# Defina a senha e e-mail correto abaixo, substituindo os valores atuais
email_correto = "jean@utfpr.br"
senha_correta = "LP31M"
# Complete com seu código-fonte
Exercício 9: senha com limite de tentativas
Escreva um programa em Python que receba como entrada uma senha na forma de string. Seu programa deverá verificar se essa senha está correta e escolher uma dentre duas opções:
- Imprimir: “Acesso garantido.”
- Imprimir “Senha incorreta, tente novamente.”.
- Assuma que a senha correta seja “LP31M”.
Em caso de senha incorreta, um novo par de e-mail e senha devem ser lidos novamente, até que valores corretos sejam digitados. No entanto, se o número de tentativas exceder 3, o programa deverá terminar.
# Defina a senha e e-mail correto abaixo, substituindo os valores atuais
email_correto = "jean@utfpr.br"
senha_correta = "LP31M"
# Complete com seu código-fonte
Prática de programação: lista de compras
Consideremos a construção de um programa para que, dada uma lista de compras, calcule o valor total por item e o total a ser pago.
Formato de entrada do programa
Cada item na lista de compras é recebido como entrada de três valores, exemplo:
chocolate 3 2.99
arroz 1 10.54
café 2 5.87
Para que a nossa entrada de dados “lista de compras” esteja completa, no entanto, definiremos que o primeiro valor em seu cabeçalho seja a quantidade de itens na lista. O exemplo acima se torna então:
3
chocolate 3 2.99
arroz 1 10.54
café 2 5.87
O que fazer primeiro?
O ponto principal é que gostaríamos de calcular o valor total das compras, mas para isso temos que calcular o preço total de cada item. Assumndo que os items da lista de compras serão dados como entrada complete o código abaixo para calcular o valor de um item:
# Este trecho de código lê um item da lista de compras e calcula seu valor total.
nome_item = input()
quantidade = int(intput())
preco_por_item = float(input())
total_item = _________________
print("Total em", nome_item, "= R$", total_item)
Introduzindo a repetição: ler todos os itens da lista
O trecho de código acima serve para ler um item de lista de compras e calcular seu total. O que queremos fazer agora é que esse trecho de código seja repetido para todos os itens da lista de compras.
Quantas os itens a lista de compras contém?
O primeiro valor da lista de compras indica a quantidade de items na lista.
# Quantidade de itens na lista de compras
num_itens = int(input())
Implemente o restante do programa para que o valor total por item e o valor total da lista de compras sejam computados e impressos.
Exemplo de entrada 1: Qual o valor total das compras?
5
leite
3
2.99
arroz
1
10.54
café
2
5.87
sal
1
0.98
Sabão
5
2.99
Exemplo de entrada 2: Qual o valor total das compras?
15
leite
3
2.99
arroz
1
10.54
café
2
5.87
sal
1
0.98
Sabão
5
2.99
leite
3
2.99
arroz
1
10.54
café
2
5.87
sal
1
0.98
Sabão
5
2.99
leite
3
2.99
arroz
1
10.54
café
2
5.87
sal
1
0.98
Sabão
5
2.99
Exercício extra: média e máximo das notas
Analisamos diferentes exemplos em que a função input()
é utilizada dentro de uma estrutura de repetição (while
) para que diversos dados de entrada possam ser recebidos e processados.
Neste exercício, teremos novamente uma sequência de dados de entrada, referentes às notas da Prova 1
Formato de entrada
Os dados de entrada estão no arquivo notas.txt, esse arquivo inicia como:
34
1979850
0.00
2062240
0.10
1882112
0.00
...
Onde a primeira linha indica a quantidade de alunos, 34 neste caso. Cada par de linhas subsequente corresponde então ao RA e a nota de um determinado aluno.
Objetivo
Escreva um programa na linguagem Python, que leia os dados de entrada e responda as seguintes perguntas:
-
Qual o RA com a maior nota?
-
Qual a média das notas?
Resultado esperado
Como saída seu programa deverá imprimir:
print("O aluno de RA", ra, "obteve a maior nota (", nota,").")
print("A média das notas foi igual a ", media)
Revisão: estrutura de repetição while
A estrutura de repetição while
utilizada até então nos permite descrever processos repetitivos para os quais o fim está definido por meio de uma condição (um condicional). No exemplo abaixo, o condicional que delimita o fim da repetição é numero >= 0
.
numero = 5
while numero >= 0:
print(numero)
numero = numero - 1
Como no exemplo acima a variável numero
foi inicializada como 5
, a condição numero >= 0
será sempre verdadeira a menos que alteremos o valor da variável número, o que está sendo feito pela expressão
numero = numero - 1
Para melhor compreendermos o processamento que ocorre durante a execução do código-fonte acima, devemos observar cada uma das etapas envolvidas em sua execução. Cada linha da tabela abaixo descreve uma iteração. O termo iterar é de uso comum na literatura sobre programação e apenas se refere às operações que ocorrem durante uma etapa da repetição.
número | Condição | Operação | Atualização |
---|---|---|---|
numero = 5 | numero >= 0 (Sim) | print(numero) | numero = numero - 1 |
numero = 4 | numero >= 0 (Sim) | print(numero) | numero = numero - 1 |
numero = 3 | numero >= 0 (Sim) | print(numero) | numero = numero - 1 |
numero = 2 | numero >= 0 (Sim) | print(numero) | numero = numero - 1 |
numero = 1 | numero >= 0 (Sim) | print(numero) | numero = numero - 1 |
numero = 0 | numero >= 0 (Sim) | print(numero) | numero = numero - 1 |
numero = -1 | numero >= 0 (Não) |
O ponto crucial para compreendermos estruturas de repetição como um todo é identificar primeiro, o bloco de código sendo repetido, que neste exemplo é
# Bloco de código da repetição (espaçado à direita)
print(numero)
numero = numero -1
Esse bloco, no entanto, somente será executado se a condição que controla a repetição for verdadeira. Neste exemplo, a condição é definida na linha abaixo
# Enquanto numero for maior ou igual a zero
while numero >= 0:
Por fim, para que o bloco de código não seja repetido indefinidamente, devemos garantir que seja possível em algum momento que a condição deixe de ser verdadeira. A única forma de atingirmos esse objetivo, é alterando a variável numero
durante o processo.
Se a cada iteração (repetição) diminuirmos o valor contido na variável numero
em uma unidade, em algum momento ela deixará de ser positiva (>=0
) e, portanto, a repetição chegará ao final. Observe que na última linha da tabela acima, a variável numero
possui o valor -1
, e portanto, o bloco de código da repetição não será executado, visto que nesse caso a condição numero >= 0
será falsa.
Alternativa: repetir para cada elemento (for
)
Por meio da estrutura de repetição while
(enquanto), é possível representar qualquer tipo de repetição. No entanto, em algumas situações existe uma forma mais conveniente para definirmos repetições.
- Repetir enquanto uma condição for verdadeira:
while
(enquanto) - Repetir uma quantidade de vezes predefinida:
for
(para cada)
Essa forma alternativa de representarmos repetições segue um padrão diferente. A ideia que ela representa poderia ser interpretada como
- para cada item em uma sequência, faça algo.
Vejamos como traduzir a sentença acima para a linguagem de programação Python, etapa por etapa. As partes em negrito são as que devemos dar maior atenção.
- para cada deverá ser escrito como for
- em deverá ser escrito como in
- faça deverá ser escrito como :
- algo será um bloco de código
Portanto, a sentença descrita acima se tornaria equivalente ao código-fonte abaixo:
# para cada item em uma sequência, faça algo.
for item in uma sequencia:
#algo
Obviamente, este código ainda não é funcional, precisamos definir o que “uma sequencia” se refere, e também definir o que “algo” se refere. Tomemos um exemplo simples, em que a sequência seja $5,4,3,2,1,0$, e que o o bloco de código que queiramos repetir seja apenas print(item)
. Dados esses detalhes o código-fonte acima se tornará.
- para cada item em 5,4,3,2,1,0:
- imprima item.
for item in [5,4,3,2,1,0]:
print(item)
Temos agora um exemplo completo equivalente ao visto na seção anterior (ver abaixo) porém muito mais simples.
numero = 5
while numero >= 0:
print(numero)
numero = numero - 1
Geradores de sequências: a função range()
É importante notar que a quantidade de iterações em um laço for
é predefinida em sua criação. Isto é, sabemos desde o início que após percorrer toda a sequência [5,4,3,2,1,0]
a repetição terá fim. Suponhamos, no entanto, a seguinte questão:
- Escreva um programa que imprima todos os número de zero a dois mil.
Não é prático escrevermos toda sequência de números de forma explícita [0,1,...,2000]
, e também não será prático para qualquer outra sequência de tamanho razoável. Deste modo, a linguagem Python nos oferece uma ferramenta para abreviar a escrita dessas sequências: a função range()
A função range()
pode ser utilizada de diferentes formas, as quais estão exemplificadas na tabela abaixo:
Formato | Descrição | Exemplo | Resultado |
---|---|---|---|
range(n) |
Gera uma sequência de $0$ a $n-1$ | range(6) |
[0,1,2,3,4,5] |
range(i,f) |
Gera uma sequência de $i$ a $f-1$ | range(5,11) |
[5,6,7,8,9,10] |
range(i,f,s) |
Gera a seq. | range(5,11,2) |
[5,7,9] |
Utilizando como referência esses exemplos de uso da função range()
, podemos de forma fácil imprimir todos os números em um intervalo. É imporante, no entanto, lembrar que o último número gerado será sempre um valor a menos que o valor passado para range. A seguir temos alguns exemplos, os execute, verifique os resultados, altere os valores das sequências, experimente com o uso dessas funcionalidades.
Exemplo 1: sequência de 0 a n
Assuma que recebemos como entrada um inteiro $n$ e desejamos imprimir todos os números de $0$ a $n$. O código-fonte a seguir faz o esperado, onde a notação range(n+1)
define automaticamente o início como $0$ e o final explicitamente como $n$.
n = int(input())
for item in range(n+1):
print(item)
Exemplo 2: sequência de n a 0
Assuma que recebemos como entrada um inteiro $n$ e desejamos imprimir todos os números de $n$ a $0$. O código-fonte a seguir faz o esperado, onde a notação range(n, -1, -1)
define explicitamente o início como $n$, o final como $0$ (um número antes de -1) e o terceiro campo, $-1$, indica a quantidade que será subtraída para gerar a sequência.
n = int(input())
for item in range(n,-1,-1):
print(item)
Exemplo 3: sequência de números pares de 0 a n
Assuma que recebemos como entrada um inteiro $n$ e desejamos imprimir todos os números pares de $0$ a $n$. O código-fonte a seguir faz o esperado, onde a notação range(0, n+1, 2)
define explicitamente o início como $0$, o final como $n$ e o incremento como $2$.
n = int(input())
for item in range(0, n+1, 2):
print(item)
Exercícios: for
Para consolidar o conteúdo descrito nesta seção, refaça todos exercícios definidos nas seções anteriores, mas agora utilizando a estrutura for
e a função range()