Buscar

Aula06 Repetição por Contagem Python

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 51 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 51 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 9, do total de 51 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

Introdução à Computação com Python
Aula 06 – Estruturas de Repetição por 
Contagem
CNCCC 2016
Conteúdo
Estruturas de repetição 
por contagem
Problemas comuns 
envolvendo vetores
Conteúdo
Estruturas de repetição 
por contagem
Problemas comuns 
envolvendo vetores
Estruturas de Repetição
:: Critérios de repetição
Por condição 
(while)
• Repete um 
bloco de 
comandos 
enquanto uma 
condição for 
verdadeira.
Por contagem 
(for)
• Repete um 
bloco de 
comandos para 
cada elemento 
de um vetor.
Estruturas de Repetição
:: Exemplos
while
• Saída:
• 1
• 2
• 3
for
• Saída:
• 1
• 2
• 3
x = 1
while (x <= 3):
print(x)
x = x + 1
v = array[1,2,3]
for x in v:
print(x)
Lembrar de 
importar a numpy
Quando usar while ou for?
while
• Usamos quando não 
sabemos quantas 
vezes vamos repetir 
o laço.
• Exemplo: qual é e 
onde está o primeiro 
número negativo de 
um vetor?
for
• Usamos quando 
temos de processar 
todos os elementos 
de um vetor.
• Exemplo: qual é o 
maior elemento de 
um vetor?
Função range
 A função range simplifica a criação e contagem 
dos elementos de um vetor, pois gera uma 
sequência de números inteiros para serem usados 
por um laço do tipo for.
 A função range pode ser usada de três maneiras:
 Um argumento
 Dois argumentos
 Três argumentos
Função range
0, 1, 2, 3, 4
for i in range(5):
print(i)
Com 01 argumento, a sequência 
começa em 0. O argumento é o 
primeiro valor não incluído na 
sequência.
1, 2, 3, 4
for i in range(1, 5):
print(i)
Com 02 argumentos, a sequência 
começa com o primeiro argumento, 
mas termina antes do segundo.
0, 2, 4
for i in range(0,5,2):
print(i) Com 03 argumentos, o terceiro 
argumento é o passo.
Função range
:: Outros exemplos
11, 12, 13, 14, 15
for i in range(11, 16):
print(i)
3, 5, 7
for i in range(3, 9, 2):
print(i)
5, 4, 3, 2, 1
for i in range(5, 0, -1):
print(i)
Conteúdo
Estruturas de repetição 
por contagem
Problemas comuns 
envolvendo vetores
Problema 1
:: Cálculo da Média
 As notas das provas aplicadas a uma classe estão 
armazenadas em um vetor.
 Como calcular a média da classe?
8 4 2 60
[0] [1] [2] [3]
soma = 0
8 4 2 61
[0] [1] [2] [3]
soma = 8
i = 0
8 4 2 62
[0] [1] [2] [3]
soma = 12
i = 1
8 4 2 64
[0] [1] [2] [3]
soma = 20
i = 3
...
media = soma/(i+1)
Cálculo da Média
Tamanho da classe
Cálculo da Média
:: Script em Python – laço for
from numpy import *
# Atribui valores a um vetor 'v'
v = array([8, 4, 2, 6])
# Soma dos valores do vetor. Comeca em ZERO.
soma = 0
# Calcula a soma
for i in range(0, size(v)):
soma = soma + v[i]
# Divide a soma pelo numero de
# elementos do vetor, para determinar a media
media = soma / size(v)
print(media)
Cálculo da Média
:: Script em Python – laço while
from numpy import *
# Atribui valores a um vetor 'v'
v = array([8, 4, 2, 6])
soma = 0 # Iniciar acumulador
i = 0 # Iniciar contador
# Calcula a soma
while (i < size(v)):
soma = soma + v[i]
i = i + 1
# Divide a soma pelo numero de
# elementos do vetor, para determinar a media
media = soma / size(v)
print(media)
Problema 2
:: Inversão dos elementos de um vetor
 Inverter um vetor, de 
tamanho qualquer, 
trocando o 1º 
elemento com o 
último, o 2º com o 
penúltimo, e assim 
sucessivamente.
 Ao final, imprimir o 
vetor invertido.
Inversão dos elementos de um vetor
88 44 22 66 77 110
[0] [1] [2] [3] [4] [5]
88 44 22 66 77 111
[0] [1] [2] [3] [4] [5]
aux = v[0]
v[0] = v[5]
v[5] = aux
11 44 22 66 77 882
[0] [1] [2] [3] [4] [5]
aux = v[1]
v[1] = v[4]
v[4] = aux
11 77 22 66 44 883
[0] [1] [2] [3] [4] [5]
aux = v[2]
v[2] = v[3]
v[3] = aux
Inversão dos elementos de um vetor
:: Projetar algoritmo
 Qual o critério de parada?
 Vetor com tamanho par?
 Vetor com tamanho ímpar?
 Quais índices i e j devem ser trocados em uma 
iteração qualquer?
 Note que i + j = size(v) - 1
Inversão dos elementos de um vetor
:: Script em Python – laço for
from numpy import *
# Atribui valores a um vetor 'v'
v = array([88, 44, 22, 66, 77, 11])
# Inverte o vetor 'v'
for i in range(0, size(v)//2):
aux = v[i]
v[i] = v[size(v)-i-1]
v[size(v)-i-1] = aux
print(v)
Inversão dos elementos de um vetor
:: Script em Python – laço while
from numpy import *
# Atribui valores a um vetor 'v'
v = array([88, 44, 22, 66, 77, 11])
i = 0 # Iniciar contador
# Inverte o vetor 'v'
while (i < size(v)//2):
aux = v[i]
v[i] = v[size(v)-i-1]
v[size(v)-i-1] = aux
i = i + 1
print(v)
Contagem de ocorrências
Por condição
• Exemplos: quantos 
elementos são pares, 
quantos elementos são 
maiores, menores ou 
iguais a N.
• O resultado é guardado 
em uma variável 
simples.
Categorias 
‘nominais’
• Exemplo: contar 
quantas pessoas são de 
cada tipo sanguíneo A, 
B, AB, O.
• O resultado é guardado 
em um vetor, mas ainda 
é necessário testar uma 
condição dentro do 
laço.
Categorias 
‘ordinais’
• Exemplos: contar o 
número de ocorrências 
de cada face de um 
dado em diversos 
lançamentos.
• O resultado é guardado 
em um vetor, com base 
em uma função que 
converte o número que 
representa a categoria 
em um índice do vetor 
de contagem.
Problema 3
:: Contar por condição
 Considere um vetor 
de números inteiros 
quaisquer.
 Quantos números 
pares ele contém?
Contar por condição
:: Projetar algoritmo
 Qual o melhor tipo de laço (while ou for)?
 Laço for, pois todos os elementos devem ser 
verificados.
 Quais contadores envolvidos?
 i: contador do laço for
 npar: conta os números pares pertencentes ao vetor
 Quando os contadores são atualizados?
 i: automático dentro do laço for
 npar: somente quando o número lido for par (implica 
usar uma estrutura if dentro do laço for)
Contar por condição
:: Script em Python – versão 1
from numpy import *
from numpy.random import *
# Cria vetor com 20 valores aleatorios
a = randint(100, 1000, size = 20)
npar = 0 # Zera contador de nos. pares
for i in range(size(a)):
if (a[i] % 2 == 0):
npar = npar + 1
print(npar) Vetor é percorrido 
pelo índice do 
elemento
Contar por condição
:: Script em Python – versão 2
from numpy import *
from numpy.random import *
# Cria vetor com 20 valores aleatorios
a = randint(100, 1000, size = 20)
npar = 0 # Zera contador de nos. pares
for x in a:
if (x % 2 == 0):
npar = npar + 1
print(npar) Vetor é percorrido 
diretamente pelo 
valor do elemento
Contar por condição
:: Variações
 Contar ou somar:
 Elementos de valor 
par ou ímpar
 Elementos em 
posições pares ou 
ímpares do vetor
 Números menores, 
maiores ou iguais a X
Problema 4
:: Contar por ‘categorias nominais’
 Considere um vetor com os tipos sanguíneos (A, B, 
O e AB) de 10 pessoas.
 Qual o número de ocorrências de cada um dos 
tipos?
Generalização
 O resultado é guardado em um 
vetor, mas ainda é necessário 
testar condições dentro do laço.
 Dado um conjunto de N categorias {𝑐1, 𝑐2, … , 𝑐𝑁}, 
como contar o número de ocorrências de cada 
categoria?
 Em problemas de contagem por condição, 
contamos padrões encontrados em um vetor. Aqui, 
o vetor será usado para contar categorias não 
numéricas, ou seja, ‘nominais’.
Generalização
:: Solução
 Criar um vetor de contagem, do tipo inteiro, com 
tamanho igual a N (número de categorias possíveis 
no conjunto).
 Mapear as categorias possíveis em índices de um 
vetorde contagem.
Categorias
Índices
do vetor
c1
c2
cN
i0
i1
iN-1
Contagem de ocorrências
:: Projetar algoritmo
 Criar um vetor de contagem cont, de N = 4 
elementos, todos iguais a zero.
 Ler o tipo sanguíneo.
 Para cada tipo lido, incrementar em uma unidade o 
elemento de índice i do vetor, conforme 
correspondência pré-determinada.
Categorias Índices do vetor
(i)
A
B
AB
O
1
2
3
0
Contagem de ocorrências 
:: Script em Python – versão 1
from numpy import *
# Cria o vetor de 4 categorias com zeros
cont = zeros(4, dtype=int)
# Leitura do vetor de tipos sanguineos
# Separe o tipo de cada pessoa por virgula
vet = input("Digite os tipos: ").split(',')
# Contagem de ocorrencias
for i in range(size(vet)):
if (vet[i] == 'A'):
cont[0] = cont[0] + 1
elif (vet[i] == 'B'):
cont[1] = cont[1] + 1
elif (vet[i] == 'AB'):
cont[2] = cont[2] + 1
else: # Para o tipo O 
cont[3] = cont[3] + 1
# Imprime vetor de contagem
print(cont)
Vetor é percorrido 
pelo índice do 
elemento
Contagem de ocorrências 
:: Script em Python – versão 2
from numpy import *
# Cria o vetor de 4 categorias com zeros
cont = zeros(4, dtype=int)
# Leitura do vetor de tipos sanguineos
# Separe o tipo de cada pessoa por virgula
vet = input("Digite os tipos: ").split(',')
# Contagem de ocorrencias
for x in vet:
if (x == 'A'):
cont[0] = cont[0] + 1
elif (x == 'B'):
cont[1] = cont[1] + 1
elif (x == 'AB'):
cont[2] = cont[2] + 1
else: # Para o tipo O 
cont[3] = cont[3] + 1
# Imprime vetor de contagem
print(cont)
Vetor é percorrido 
diretamente pelo 
valor do elemento
Contar categorias ‘nominais’
:: Variações
 Contar classes que não 
tenham ordenação:
 Quantidade de 
animais de diferentes 
cores.
 Cor dos olhos, da pele, 
do cabelo, etc. de um 
grupo de pessoas.
Problema 5
:: Contar categorias ‘ordinais’
 Um dado não viciado 
de 6 faces é lançado 
6000 vezes.
 Quantas vezes ocorre 
cada face?
Generalização
 Dado um conjunto de N eventos {𝑒1, 𝑒2, … , 𝑒𝑁}, 
como contar o número de ocorrências de cada 
evento?
 Aqui o vetor será usado para contar eventos, 
utilizando uma função que converte o número que 
representa a categoria em um índice do vetor de 
contagem.
Generalização
:: Solução
 Criar um vetor de contagem, do tipo inteiro, com 
tamanho igual a N (número de eventos possíveis 
no conjunto).
 Mapear os eventos possíveis em índices de um 
vetor de contagem.
Eventos
Índices
do vetor
f(x)e1e2
eN
i1i2
iN
Contagem de ocorrências
:: Projetar algoritmo
 Criar um vetor de contagem freq, de N = 6 
elementos, todos iguais a zero.
 Jogar o dado.
 Para cada face face sorteada, incrementar em uma 
unidade o elemento de índice face-1 do vetor.
Eventos
(fc)
Índices do vetor
(i)
f(x)
1 2
3 4
5
6
1
23
4
5
0
i = fc-1
Contagem de ocorrências 
:: Script em Python
from numpy import *
from numpy.random import *
# Vetor de contagem
# Os 6 elementos comecam com zero
freq = zeros(6, dtype=int)
# Vetor aleatorio contendo os lancamentos do dado
lancamentos = randint(1, 7, size = 6000)
# Contagem de ocorrencias
for i in range(size(lancamentos)):
face = lancamentos[i]
freq[face-1] = freq[face-1] + 1
# Imprime vetor de frequencia
print(freq)
Faces do dado
:: Teste
0 1 2 3 4 5
freq
lancamentos 5 5 4 2 4 5 1 6 6 3 4 1
i
face
Contar categorias ‘ordinais’
:: Variações
 Contar classes de 
objetos que seguem 
uma ordem:
 O número de alunos 
que tiraram cada uma 
das notas (0 a 10).
 Quantidade de faltas 
de funcionários ao 
longo da semana 
(segunda a sábado).
Problema 5
:: Arte ASCII
 Escreva um script para 
imprimir vários 
caracteres asterisco
para formar o padrão 
ao lado.
Arte ASCII
:: Projetar algoritmo
1. Iniciar contador de linhas i
2. Para cada linha, imprimir i asteriscos
3. Repetir passo 1 até atingir o número de iterações
# Leitura do tamanho da base
base = eval(input("Tamanho da base: "))
for j in range(0, base):
for i in range(0, base - j):
print("*", end="")
print("\n", end="")
Limite do 2º laço não é mais 
constante. Passa a se basear 
no contador do 1º laço.
Arte ASCII
:: Script em Python – laço for
Termina a linha 
# Leitura do tamanho da base
base = eval(input("Tamanho da base: "))
j = 0
while (j < base):
i = 0
while (i < (base - j)):
print("*", end="")
i = i + 1
print("\n", end="")
j = j + 1
Arte ASCII
:: Script em Python – laço while
Contador do 2º laço não é 
mais constante. Passa a se 
basear no contador do 1º 
laço.
Termina a linha 
Problema 6
:: Frações contínuas
 Determine o valor de 
2 com base na 
expansão em frações 
contínuas.
2 = 1 +
1
2 +
1
2 +
1
2 +
1
⋯
O que são frações contínuas?
 Uma fração contínua 𝑓 é um número irracional que 
pode ser expresso através da seguinte forma:
onde 𝑎𝑖 , 𝑏𝑖 ∈ ℤ são coeficientes quaisquer.
 Note que a expressão acima é infinita.
 Como um algoritmo deve ser executado em tempo 
finito, devemos impor um limite à sequência.
𝑓 = 𝑎0 +
𝑏1
𝑎1 +
𝑏2
𝑎2 +
𝑏3
𝑎3 +
𝑏4
…
Frações contínuas
 Na expressão acima, 
𝑏𝑛
𝑎𝑛
é o ponto de partida 
(semente) no cômputo da fração contínua.
 O valor da fração deve ser calculado iterativamente de 
baixo para cima.
 Para um grande número de iterações, o valor da 
semente torna-se desprezível.
𝑎0 +
𝑏1
𝑎1 +
𝑏2
𝑎2 +
⋱
+
𝑏𝑛
𝑎𝑛
Problema 6
Projetar algoritmo – termo geral
2 = 1 +
1
2 +
1
2 +
1
2 +
1
⋯Não se repete
O que se repete?
1
2 +
Problema 6
Projetar algoritmo
1. Iniciar a semente
2. Iniciar o contador de laço
3. Atualizar o termo geral
4. Repetir passo 3 enquanto contador não atinge 
um número de repetições considerado grande 
(1000 seria um bom chute?)
5. Imprimir valor aproximado de 2
Problema 6
Codificar em Python
# Número de iteracoes
N = int(input("No. de iteracoes: "))
# Semente
x = 2
# Parte repetitiva da fracao continua
for i in range(N):
x = 1 / (2 + x)
# Soma parte repetitiva com parcela constante
print(x + 1)
# Comparacao com valor real de raiz de 2
print(2**0.5)
Referências bibliográficas
 Menezes, Nilo Ney Coutinho (2010). Introdução à 
Programação com Python. Editora Novatec.
 HETLAND, Magnus Lie (2008). Beginning Python: 
From Novice to Professional. Springer eBooks, 2ª 
edição. Disponível em: 
http://dx.doi.org/10.1007/978-1-4302-0634-7.
 Horstmann, Cay & Necaise, Rance D. (2013). 
Python for Everyone. John Wiley & Sons.
Dúvidas?

Outros materiais