Contato

  • Jean Paulo Martins (jeanmartins utfpr edu br)
  • Sala 105, Bloco S (UTFPR - Campus Pato Branco)

Conteúdo

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:

  1. Ao calcular o total de cada item estamos sujeitos a erro no cálculo,
  2. A soma total nos exige efetuar a soma do total de cada item, novamente sujeitos a erro de cálculos,
  3. 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.

  1. Repetir enquanto uma condição for verdadeira: while (enquanto)
  2. 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.

  1. para cada deverá ser escrito como for
  2. em deverá ser escrito como in
  3. faça deverá ser escrito como :
  4. 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()