Você está na página 1de 21

Disciplina: Informática para Engenharia

Aula 7: Estruturas de Repetição

Apresentação
Em diversas situações cotidianas, realizamos tarefas repetitivas, como realizar um
número determinado de movimentos ao nos exercitarmos, saber o total em dinheiro
ao contar uma a uma as cédulas (ou moeda) disponíveis, entre outras.

Na Programação, existem situações em que você precisa repetir uma única instrução
ou um grupo de instruções até que alguma condição seja atendida, tais como ler
todos os arquivos de um diretório, enviar e-mail a todos os funcionários etc. Essas
tarefas na Programação são tratadas por instruções em loop.

Objetivos
Examinar problemas que envolvem repetição de comandos;
Analisar o uso das estruturas de repetição de maneira a evitar a duplicação e a
redundância de códigos;
Avaliar o uso em conjunto com outras estruturas já vistas, de modo a
representar situações que envolvem a contagem e soma de valores.
Estruturas de Repetição
Vamos considerar o exemplo do cálculo de média tratado até aqui. Imagine se
você quiser lançar a nota de 3 alunos.

Bem, você pode pensar “vou executar o programa 3 vezes”, não é?

>>> print(“Informe a nota do Aluno 1”)

>>> nota1 = float(input(“Digite a nota 1: ”))

>>> nota2 = float(input(“Digite a nota 2: ”))

>>> media = (nota 1 + nota 2) / 2

>>> print(“Informe a nota do Aluno 2”)

>>> nota1 = float(input(“Digite a nota 1: ”))

>>> nota2 = float(input(“Digite a nota 2: ”))

>>> media = (nota1 + nota2) / 2

>>> print(“Informe a nota do Aluno 3”)

>>> nota1 = float(input(“Digite a nota 1: ”))

>>> nota2 = float(input(“Digite a nota 2: ”))

>>> media = (nota 1 + nota 2) / 2


 (Fonte: Doidam 10 / Shutterstock)
No entanto, o que acontece se a turma for formada por 35 alunos? Irá
“copiar e colar” o código acima mais 32 vezes? E se tiver, 40? 50?

Não parece uma boa ideia ficar “copiando e colando” (e contando!) inúmeras
vezes o código.

Uma boa estratégia seria você obter (automaticamente) o número de alunos,


e o próprio computador se encarregar de controlar a quantidade de vezes que
você tem de lançar a nota, não é? Poderíamos pensar em algo assim:

1 ENQUANTO o número de alunos for menor do que 50, FAÇA

2 Leia a nota 1

3 Leia a nota 2

4 Calcule a média

5 Escreva a média calculada

Ou seja, as ações após a linha 2 serão repetidas até que a condição (linha 1)
seja satisfeita. A esses trechos do algoritmo que são repetidos damos o nome
de laços de repetição.

Podemos observar o funcionamento dessa estrutura analisando o fluxograma


a seguir.

Atenção

Uma importante questão é que esses laços (ou loops), apesar de


poderem ser grandes e/ou indeterminados, são finitos! Após a repetição
do bloco de comandos, a condição é testada e, caso seja falsa, o
programa segue seu fluxo normal.

Repetição com Teste no Início


As estruturas de repetição com teste no início fim tem como característica a
execução de todos os comandos pertencentes ao bloco antes da verificação.
Assim, no pior caso, poderíamos nunca executar o bloco de código dentro
dessa estrutura.
Poderíamos fazer uma analogia com um restaurante fast food, onde, no início,
verificamos se temos condição ($$$) de pagar e, em caso positivo,
escolhemos o prato do menu, pedimos e comemos. O fluxograma anterior
ilustra esse tipo de estrutura.

A seguir, são apresentadas as sintaxes em pseudocódigo e Python.

Pseudocódigo

ENQUANTO (<condição>) FAÇA

bloco de comandos;

FIMENQUANTO

Python

while (<condição>):

bloco de comandos;

Observe o exemplo que trata a simples validação de uma senha digitada.


Perceba que o bloco de código responsável pela leitura de senha irá repetir-se
até que o usuário acerte a senha.

Pseudocódigo

senha ← ‘0’;

ENQUANTO (senha <> ‘123’) FAÇA

ESCREVA(‘Digite sua senha: ‘);

LEIA(senha);

FIMENQUANTO

Python

senha=‘0’

while (senha !=‘123’):

senha = input(‘Digite sua senha: ’)


Repetição com Teste no Fim
As estruturas de repetição com teste no fim têm como característica a
execução de todos os comandos pertencentes ao bloco antes da verificação.
Nesse caso, executaremos o bloco de código, no mínimo, uma vez.

Poderíamos fazer uma analogia com um restaurante à la carte, em que


escolhemos o prato do menu, pedimos, comemos e, ao final, vemos se temos
condição ($$$) de pagar!

A seguir, são apresentadas as sintaxes em pseudocódigo e Python.

Pseudocódigo

REPITA

bloco de comandos;

ATÉ (<condição>);
Python

while True:

bloco de comandos;

if (<condição>):

break;


Dica

Diferentemente do pseudocódigo e até mesmo de outras linguagens, no


Python não existe uma estrutura explícita do repita...até. A estratégia
para representar esse tipo de repetição consiste na verificação de uma
condição (if (<condição>)) no final do bloco do código do while. Caso a
condição seja satisfeita, utiliza-se o comando break para interromper o
loop.

Observe novamente o problema de validação de senha. Perceba que,


inicialmente, a estrutura não faz nenhum tipo de verificação. Assim, não é
necessário “inicializar” a variável senha com um valor qualquer (senha ← 0),
conforme observado no exemplo da estrutura anterior (teste no início).

Pseudocódigo

REPITA

ESCREVA(‘Digite sua senha: ’);

LEIA(senha);

ATÉ (senha==‘123’)

Python

while True:
senha = input(‘Digite sua senha: ’)

if (senha == ‘123’)

break;

Repetição Contável
Até agora, as estruturas apresentadas não possibilitam determinar a
quantidade de vezes que o bloco será executado. Ou eles irão repetir-se
enquanto uma condição for satisfeita ou que se repita até que a condição
seja satisfeita. No caso em que precisamos determinar o número de vezes (ou
seja, ela é contável!) em que certos comandos devem ser repetidos, a
estrutura utilizada é o para.

A seguir, são apresentadas as sintaxes em pseudocódigo e Python.

Pseudocódigo

PARA <variável> DE <valor_inicial> ATÉ <valor_final> PASSO <p> FAÇA

bloco de comandos;

FIM PARA

Python

for <variável> in (<faixa de valores>):

bloco de comandos

Observe que a sintaxe no Python é bem mais simples que em portugol. Em


pseudocódigo temos que definir explicitamente a variável de controle (x), o
início (DE 1), o fim (ATÉ 10) e o incremento (PASSO 1). De modo contrário, o
início, o fim o e incremento são reunidos em um só comando Python: o
range. O exemplo para a leitura de 10 valores numéricos do teclado é
ilustrado em pseudocódigo e Python.

Pseudocódigo

PARA x DE 1 ATÉ 10 PASSO 1 FAÇA


ESCREVA(‘Digite um número: ’)

LEIA(num)

FIM PARA

Python

for x in range(10):

num = int(input (‘Digite um número: ’)

No Python, tais faixas de valores podem ser:

Listados explicitamente

# print(x) será repetido 5 vezes, uma para cada valor

# especificado entre parênteses no comando for

>>> for x in (0,1,2,3,4):

>>> print(x)

Especificados como um intervalo com início, fim e


incremento, usando range

# Outra forma de resolver o problema anterior

# especificado entre parênteses no comando for

>>> for x in range(0,5,1):

>>> print(x)

Como podemos perceber, o comando range tem três parâmetros, dos quais
ele:

01

Determina o valor inicial. Quando omitido, início = 0;

02
Determina o valor final (obrigatório);

03

Determina o incremento (opcional). Quando omitido, incremento = 1.


Exemplo

Outra forma de usar o range no problema anterior é:

>>> for x in range(5):

>>> print(x)

Imprimir números pares até 10…

>>> for x in range(2,10,2):

>>> print(x)

Imprimir números pares até 10 de forma invertida…

>>> for x in range(10,2,-2):

>>> print(x)
 (Fonte: Marina Pousheva / Shutterstock)

Contadores e Somadores
Em muitas situações, estamos interessados em contar coisas como, por
exemplo, a quantidade de carros que passam em um pedágio, o número de
pessoas em uma fila etc. Em outros, podemos estar interessados em realizar
cálculos estatísticos, como obter a média de notas de uma turma, calcular a
velocidade média de carros trafegando em uma via em determinado instante
de tempo, entre outros.

Nesses casos, temos de declarar variáveis para se comportarem como


contadores ou acumuladores (ou somadores). Dependendo do problema,
podemos ter de utilizar estruturas condicionais para atender às regras de
negócio!

Considere o seguinte problema: você tem de desenvolver um programa que


tem por objetivo ler números digitados por um usuário. A leitura deve
encerrar quando for digitado o número 0 (zero).

>>> num = 1

>>> while (num!=0):

>>> num = int(input(‘Informe um número (0 para sair): ’))

Se quiséssemos informar a quantidade de números digitados, como


faríamos? Simples!
Devemos criar uma variável chamada cont, inicialmente com valor 0 (zero), e
a cada loop devemos incrementar a própria variável em uma unidade. O
código a seguir ilustra o processo:

>>> cont = 0

>>> num = 1

>>> while (num!=0):

>>> num = int(input(‘Informe um número (0 para sair): ’))

>>> cont = cont + 1

>>>

>>> print(cont)

Imagine agora o problema do cálculo da velocidade média de automóveis em


uma via. O usuário informaria a velocidade aferida, finalizando o cadastro com
o valor 0 (zero).

Bem, a contagem nós já sabemos fazer! Mas, para a média, além da


quantidade de carros, precisamos da soma das velocidades, correto? A
solução então seria criar outra variável que iria ‘acumular’ (somar) as
velocidades.

>>> cont = 0

>>> velocidade = 1

>>> soma = 0

>>> while (velocidade!=0):

>>> velocidade = int(input(‘Informe a velocidade (km/h): ’))

>>> cont = cont + 1

>>> soma = soma + velocidade

>>> media = soma / (cont-1)

>>> print(media)

Comentário

Vamos prestar a atenção em duas situações na penúltima linha:


primeiro, temos de desconsiderar o 0 (zero) digitado para a finalização
do programa, daí o cont-1; em segundo lugar, precisamos ter cuidado de
fazer essa operação primeiro e, depois, a divisão. Ou seja, temos de
priorizar a subtração com uso dos parênteses.

Seguindo o problema do cálculo de velocidade média, imagine que a chefia


pediu que emitisse um relatório dos carros que trafegaram acima de 100
km/h. Bem, podemos perceber que devemos separar a amostra em dois
subconjuntos distintos. Em outras palavras, devemos contar os carros e
acumular a respectiva velocidade caso ela seja superior ou igual a 100 km/h.

>>> cont, velocidade, soma = 0,1,0

>>> while (velocidade!=0):

>>> velocidade = int(input(‘Informe a velocidade (km/h): ’))

>>> if (velocidade>=100):

>>> cont = cont + 1

>>> soma = soma + velocidade

>>> media = soma / cont

>>> print(media)
 (Fonte: Kichigin / Shutterstock)

Como, nesse exemplo, a variável cont somente irá incrementar se a


velocidade for maior do que 0 (zero), não precisamos daquele recurso (cont-
1) utilizado anteriormente. Vimos assim que podemos mesclar as estruturas
repetitivas com as condicionais, e vice-versa.

As aplicações de contadores e somadores não se limitam ao uso de estruturas


de repetição com verificação no início e/ou fim, ou seja, o while.


Exemplo

Por exemplo, considere que determinado problema necessite calcular


N
∑ = 1
j, em que N é informado pelo usuário. Caso o usuário forneça
j

um valor negativo, o programa deve apresentar a mensagem: “Digite


apenas valores maiores ou iguais a zero”.

O código em Python resultante seria:

>>> sum=0

>>> n = int(input(‘Informe um valor para N: ’))


>>> for j in range(0,n):

>>> sum=sum+j

Considere agora o problema para calcular a integral definida de determinada


função. O usuário deve fornecer os limites de integração da função
considerada. Divida o intervalo em 10.000 partições e faça um somatório,
avaliando a função e somando todos os resultados.


Exemplo

Por exemplo, calcule a integral da função f (x) = 2x no intervalo de 0 a


1, cujo resultado é 1. A função deve ser definida de forma explícita no
código, e os intervalos devem ser fornecidos pelo usuário. O programa
deve dividir o intervalo em 10.000 partes e atribuir a x o valor do limite
inferior, ou seja, 0.

A função deve ser avaliada para x = 0 e, depois disso, para cada uma das
10.000 partições feitas. Todas as vezes que x for avaliado, o resultado deve
ser armazenado em um somatório. Esse somatório é o resultado da integral.

>>> limInf=int(input('Informe o limite inferior: '))

>>> limSup=int(input('Informe o limite superior: '))

>>> particoes=(limSup-limInf) / 10000;

>>> integral=0.0

>>> x,y=limInf,0

>>> while (x<limSup):


>>> y=2*x

>>> integral+=particoes*y;

>>> x+=particoes

>>> print(integral)
Atividade
1. Observe os trechos dos algoritmos a seguir:

ALGORITMO questao1a

x,y,z: inteiro;

INÍCIO

x ← 10;

z ← 0;

ESCREVA(‘Informe um número: ’)

LEIA(y);

ENQUANTO (z<y) FAÇA

z ← z + 1;

x ← x + y;

FIM ENQUANTO

ESCREVA(x)

FIM ALGORITMO.

ALGORITMO questao1b

x,y,z: inteiro;

INÍCIO

x ← 10;

z ← 0;

ESCREVA(‘Informe um número: ’)

LEIA(y);

REPITA
z ← z + 1;

x ← x + y;

ATÉ (z>y);

ESCREVA(x)

FIM ALGORITMO.

Em um primeiro momento, foi digitado o número 5 para a variável y em


ambos programas (questao1a e questao1b). Na segunda execução, o
valor 0 foi digitado para a variável y. Quais serão as saídas da primeira e
da segunda execução?

a) 35 e 15; 10 e 10.
b) 35 e 15; 10 e loop infinito.
c) loop infinito em ambos; 10 e 10.
d) 35 e loop infinito; 5 e 5.
e) 25 e 10; loop infinito.
2. Implemente os seguintes algoritmos em Python:

ALGORITMO questao2a

ALGORITMO questao1a;

x,y,z: inteiro;

INÍCIO

x ← 10;

z ← 0;

ESCREVA(‘Informe um número: ’)

LEIA(y);

ENQUANTO (z<y) FAÇA

z ← z + 1;

x ← x + y;

FIM ENQUANTO

ESCREVA(x)

FIM ALGORITMO.

ALGORITMO questao2b

ALGORITMO questao1b;

x,y,z: inteiro;

INÍCIO

x ← 10;

z ← 0;

ESCREVA(‘Informe um número: ’)

LEIA(y);

REPITA
z ← z + 1;

x ← x + y;

ATÉ (z>y);

ESCREVA(x)

FIM ALGORITMO.

3. Dado um número inteiro positivo informado pelo usuário, desenvolva


um programa em Python que calcule seu fatorial. Dica: o cálculo só deve
ser realizado se o número for válido. Utilize a estrutura for.

Referências

GRUS, J. Data science from scratch: first principles with Python. Beijing: O’Reilly,
2015.

MENEZES, N.N.C. Introdução à programação com Python: algoritmos e lógica de


programação para iniciantes. 1 ed. São Paulo: Novatec, 2017.

MUELLER, J.P. Começando a programar em Python para leigos. Alta Books,


2016.

PERKOVIC, L. Introduction to computing using Python: an application


development focus. 2 ed. [s.l.] Wiley Publishing, 2015.

Próximos Passos

Códigos desenvolvidos, de maneira a aplicar as técnicas de modularização de


programas;
Recursos avançados de desenvolvimento de programas com uso de estruturas
condicionais e repetitivas;
Tarefa de refinamentos sucessivos no código, de maneira a obter códigos de
maior qualidade.
Explore mais

Assista aos vídeos:

23 - Python - Loop While (Estrutura de Repetição) e instrução break


<https://www.youtube.com/watch?v=oUXUVVP2_6E> ;
24 - Python - Loop FOR - Estruturas de Repetição - Função RANGE()
<https://www.youtube.com/watch?v=55rOjj6kEck> .

Você também pode gostar