Você está na página 1de 27

Profa. Dra. Raquel C.

de Melo-Minardi
Departamento de Ciência da Computação
Instituto de Ciências Exatas
Universidade Federal de Minas Gerais

MÓDULO 2 - PROGRAMAÇÃO
Estruturas de repetição
MÓDULO 2 - PROGRAMAÇÃO - Estruturas de repetição 2

ESTRUTURAS DE REPETIÇÃO
▸ Você já se perguntou por que usamos programas de computadores?

▸ Em geral, usamos programas de computadores para automatizar tarefas que sabemos


fazer para ganharmos em escala

▸ Um computador é capaz de executar em tempo curto bilhões de comandos não é


mesmo?

▸ Então, implementamos algoritmos que formalizam as tarefas que precisamos e


sabemos em detalhes como executar para que elas possam ser executadas em larga
escala
MÓDULO 2 - PROGRAMAÇÃO - Estruturas de repetição 3

ESTRUTURAS DE REPETIÇÃO
▸ Para que essas tarefas possam ser executadas um certo número de vezes, precisamos
de estruturas das linguagens de programação que nos permitam realizar repetições
como por exemplo a do esquema abaixo

▸ Denominamos essas estruturas de repetição de laços (do inglês loops)

ENQUANTO UMA CONDIÇÃO


FOR VERDADEIRA

FAÇA ALGO
MÓDULO 2 - PROGRAMAÇÃO - Estruturas de repetição 4

CENÁRIOS
▸ Há algumas possibilidades de cenários nos quais podemos desejar expressar
repetições

▸ Definidos: sabemos previamente quantas vezes o laço irá executar

▸ Indefinidos: não sabemos previamente quantas execuções serão realizadas e


necessitamos testar a cada iteração (cada execução do laço) para decidirmos se o
mesmo continua ou interrompe. Essa verificação pode ocorrer em dois momentos

▸ Antes do laço: nesse caso, pode acontecer de o bloco


não ser executado nem uma vez (se a condição for falsa
na primeira execução)

▸ No fim do laço: garante que o laço será executado pelo


menos uma vez, já que o teste da condição só é realizado
ao término da primeira iteração
MÓDULO 2 - PROGRAMAÇÃO - Estruturas de repetição 5

WHILE (ENQUANTO)
▸ Os laços while (enquanto) são usados nos casos indefinidos, ou seja, naqueles em
que não se sabe quantas vezes esse laço será executado e a condição de continuidade
deve ser verificada a cada nova interação

▸ Com o laço while, podemos executar um conjunto de instruções, enquanto a condição


for verdadeira

num = 289
divisor = num - 1

while num % divisor != 0 and divisor > 1:


divisor -= 1

if divisor > 1:
print(num, 'não é primo: divisível por', divisor)
else:
print(num, ' é primo')
MÓDULO 2 - PROGRAMAÇÃO - Estruturas de repetição 6

WHILE (ENQUANTO)
▸ O laço while itera sobre o divisor e a condição de continuidade é que ambas as
seguintes condições sejam verdadeiras

▸ Não ter encontrado um divisor: num % divisor != 0 (resto da divisão inteira é diferente
de zero)

▸ Divisor é maior que 1

▸ O laço vai decrementando o divisor e para de testar em duas situações

▸ Encontrou um divisor do número

▸ Testou todos os possíveis divisores e nenhum foi divisor


exato
MÓDULO 2 - PROGRAMAÇÃO - Estruturas de repetição 7

FOR (PARA)
▸ Um loop for é usado para iterar em uma sequência (que é uma lista, uma tupla, um
dicionário ou uma sequência)

▸ O objetivo é executar um conjunto de instruções, uma vez para cada item da


estrutura de dados

nucleotideos = ['A', 'C', 'T', 'G']


for n in nucleotideos:
print(n)

▸ O código acima percorre toda a lista de nucleotídeos e


atribui cada valor à variável n que é impressa no interior do
laço

▸ Embora hajam apenas 4 nucleotídeos, o mesmo trecho de


código pode ser utilizado para listas de tamanho enorme
MÓDULO 2 - PROGRAMAÇÃO - Estruturas de repetição 8

FOR (PARA)
▸ Podemos iterar também sobre strings

for n in 'ACCAGGAGGCGATG':
print(n)
MÓDULO 2 - PROGRAMAÇÃO - Estruturas de repetição 9

FOR (PARA)
▸ Note que o laço for é um laço definido, ou seja, utilizado quando sabemos
previamente quantas vezes o laço irá executar
MÓDULO 2 - PROGRAMAÇÃO - Estruturas de repetição 10

O COMANDO BREAK (PARE)


▸ Com a instrução break, podemos parar o laço antes que ele tenha passado por todos
os itens:

for n in 'ACCAGGAGGCGATG':
print(n)
if n == 'X':
break
MÓDULO 2 - PROGRAMAÇÃO - Estruturas de repetição 11

O COMANDO BREAK (PARE)


▸ Qual a diferença de saída entre os dois programas abaixo?

for n in 'ACCAGGAGGCGATG':
for n in 'ACCAGGAGGCGATG':
if n == 'X':
print(n)
break
if n == 'X':
print(n)
break
MÓDULO 2 - PROGRAMAÇÃO - Estruturas de repetição 12

O COMANDO CONTINUE (CONTINUE)


▸ Com a instrução continue, podemos parar a iteração atual do laço e continuar com a
próxima interação:

for n in 'ACCAGGAGGCGATG':
if n == 'X':
continue # Não imprimirá em caso de um núcleotídeo X aparecer
print(n)
MÓDULO 2 - PROGRAMAÇÃO - Estruturas de repetição 13

A FUNÇÃO RANGE
▸ Para percorrer um bloco de código um número pré-definido de vezes, podemos usar a
função range()

▸ Retorna uma seqüência de números, iniciando em 0 (por padrão) e incrementa de 1


em 1 (por padrão) e termina com o número especificado

for i in range(256):
print(i) # Imprime de 0 a 255

▸ Observe que o range(10) não são os valores de 0 a 10, mas os


valores de 0 a 9

▸ 0 é o valor padrão inicial, no entanto é possível especificar o valor


inicial adicionando um parâmetro: range(1,10), que significa
valores de 1 a 10 (mas não incluindo 10):

for i in range(100, 256):


print(i) # Imprime de 100 a 255
MÓDULO 2 - PROGRAMAÇÃO - Estruturas de repetição 14

A FUNÇÃO RANGE
▸ Por padrão, a função range() incrementa o índice de 1 em 1 unidade

▸ Contudo, é possível passar o valor do incremento como terceiro argumento:

for i in range(100,256,2):
print(i) # Imprime de 100, 102, 104, 106, 108, …, 254
MÓDULO 2 - PROGRAMAÇÃO - Estruturas de repetição 15

USANDO O COMANDO ELSE NO LAÇO FOR !!??!!


▸ O comando else em um laço for especifica um bloco de código a ser executado
quando o laço for concluído:

for n in 'ACCAGGAGGCGATG':
print(n)
else:
print('Fim do laço')
MÓDULO 2 - PROGRAMAÇÃO - Estruturas de repetição 16

USANDO LAÇOS ANINHADOS


▸ Um laço aninhado é um laço dentro de um laço

▸ O laço interno será executado uma vez para cada iteração do laço externo

seq = 'ACCAGGAGGCGATG'
for n in seq:
for m in seq:
print(n,m)
MÓDULO 2 - PROGRAMAÇÃO - Estruturas de repetição 17

LAÇOS INFINITOS
▸ Há laços que nunca terminam de executar: laços infinitos

▸ Podem ocorrer:

▸ por um erro de lógica que não garante que uma condição de parada seja atingida

▸ propositalmente nos casos em que desejamos que o usuário encerre o programa


manualmente ou que ele execute indefinidamente

▸ Exemplo: um programa que fica rodando na rede monitorando algum


comportamento suspeito de usuários
MÓDULO 2 - PROGRAMAÇÃO - Estruturas de repetição 18

FOREACH
▸ Particularmente, a linguagem Perl possui um outro tipo de laço chamado “foreach” (para
cada)

▸ O trecho de código abaixo tem o mesmo resultado

@nucleotideos = ('A', 'C', 'T', 'G');


foreach $i (@nucleotideos) {
print "$i\n";
}
MÓDULO 2 - PROGRAMAÇÃO - Estruturas de repetição 19

OUTROS TIPOS DE LAÇOS NÃO EXISTENTES EM PYTHON


▸ Há diversos outros tipos de construções que implementam laços e não estão
disponíveis em Python:

▸ Foreach (para cada)

▸ Versão tradicional do For

▸ Do-While (Faça enquanto)

▸ Until (Até que)

▸ Do-Until (Faça até que)

▸ Mais uma vez, Python foi projetado de forma minimalista

▸ Não prejudica o poder de expressão: é possível


expressar os mesmo algoritmos usando while e for

▸ Simplifica o aprendizado e entendimento de códigos


MÓDULO 2 - PROGRAMAÇÃO - Estruturas de repetição 20

FOREACH (PARA CADA)


▸ As duas opções de laços envolvendo "for" e “foreach" anteriores iteram sobre
elementos de uma lista

▸ Os mesmos poderiam ser utilizados para iterar sobre elementos de um hash como no
exemplo abaixo

%AAs = (
"ALA" => 'A',
"CYS" => 'C',
"ASP" => 'D',
"GLU" => 'E'
);

foreach $i (values %AAs){


print $i;
}
MÓDULO 2 - PROGRAMAÇÃO - Estruturas de repetição 21

FOREACH (PARA CADA)


▸ Podemos ainda trocar a função “values” pela função “keys” para imprimir as chaves ao
invés dos valores

▸ Poderíamos ainda imprimir as chaves e valores do hash conforme código a seguir

foreach $i (sort keys %AAs){


print $i." ".$AAs[$i];
}
MÓDULO 2 - PROGRAMAÇÃO - Estruturas de repetição 22

VERSÃO "TRADICIONAL" DO FOR


▸ A versão mais tradicional do “for" e que está presente em inúmeras linguagens de
programação é um pouco mais complexa mas também bastante versátil

▸ Veja um exemplo abaixo

for ($i = 0; $i <= 20; $i++) {


print "$i\n";
}

▸ Três cláusulas (opcionais) separados por “;”

▸ Inicialização ($i = 0)

▸ Condição de continuidade ($i <= 20)

▸ Incremento ($i++)
MÓDULO 2 - PROGRAMAÇÃO - Estruturas de repetição 23

VERSÃO "TRADICIONAL" DO FOR


▸ Com exceção da condição, as outras duas cláusulas podem ser compostas usando
mais de uma expressão separadas por “,”

@palavra = ('A', 'R', 'A', 'R', 'A');

for ($i = 0, $j = $#palavra ; $i < $j ; $i++, $j--){


if ($palavra[$i] ne $palavra[$j]){
print "FALSO";
}
}
MÓDULO 2 - PROGRAMAÇÃO - Estruturas de repetição 24

DO-WHILE (FAÇA-ENQUANTO)
▸ Usando o comando "while", se a condição for falsa na primeira iteração, nenhum dos
comandos é executado

▸ Existe uma variação que é o “do-while” e a diferença é que a primeira iteração do laço
sempre será executada
$num = $divisor = 289;

do {
$divisor--;
} while ((($num % $divisor) != 0) && ($divisor > 1));

if ($divisor > 1){


print "$num não é primo: divisível por
$divisor\n";
} else {
print "$num é primo\n";
}
MÓDULO 2 - PROGRAMAÇÃO - Estruturas de repetição 25

UNTIL (ATÉ QUE)


▸ O “until“ (até que) é uma versão negadas do “while”

▸ Nos “while” temos uma condição de continuidade enquanto no “until" teremos uma
condição de parada

$num = 289;
$divisor = $num - 1;
until ((($num % $divisor) == 0) || ($divisor == 1)){
$divisor--;
}
if ($divisor > 1){
print "$num não é primo: divisível por
$divisor\n";
} else {
print "$num é primo\n";
}
MÓDULO 2 - PROGRAMAÇÃO - Estruturas de repetição 26

DO-UNTIL (FAÇA ATÉ QUE)


▸ O “do-until“ (faça-até que) é uma versão negada do “do-while”

$num = $divisor = 289;


do {
$divisor--;
until ((($num % $divisor) == 0) || ($divisor == 1));
if ($divisor > 1){
print "$num não é primo: divisível por
$divisor\n";
} else {
print "$num é primo\n";
}
MÓDULO 2 - PROGRAMAÇÃO - Estruturas de repetição 27

CONTROLE DE LAÇOS
▸ Apesar dos loops respeitarem às suas condições de continuidade ou de parada, há
comandos que nos permitem interferir no meio da execução desses laços e forçar
certos comportamentos

▸ Next: deixa a interação atual do laço e inicia a próxima

▸ Last: deixa imediatamente o laço

▸ Redo: retorna ao início do bloco sem testar novamente a condição do laço

▸ Goto: desvia para um rótulo específico

▸ Não existem em Python!!! Felizmente…

Você também pode gostar