Buscar

Aula 06 - Repetição por Contagem


Continue navegando


Prévia do material em texto

ICC901 – Introdução à Programação de Computadores
IEC081 – Introdução à Ciência dos Computadores
IEC037 – Introdução à Programação de Computadores
Aula 06 – Estruturas de Repetição por Contagem
Atualização: 6/mar/20
Fonte da imagem: https://www.codeschool.com/courses/forging-ahead-with-asp-net-core
Você tem a liberdade de:
Compartilhar: copiar, distribuir e transmitir esta obra.
Remixar: criar obras derivadas.
Sob as seguintes condições:
Atribuição: você deve creditar a obra da forma especificada 
pelo autor ou licenciante (mas não de maneira que sugira que 
estes concedem qualquer aval a você ou ao seu uso da obra).
Uso não comercial: você não pode usar esta obra para fins 
comerciais.
Compartilhamento pela mesma licença: se você alterar, 
transformar ou criar em cima desta obra, poderá distribuir a 
obra resultante apenas sob a mesma licença, ou sob uma 
licença similar à presente.
Conserve o laboratório
3
Não mexa nos cabos
Não consuma alimentos ou bebidas. 
Mantenha sua garrafa de água 
tampada.
Os equipamentos são frágeis: 
use-os com cuidado
Antes de começar...
4
Este módulo tem Peso 3 
na avaliação
Está atento ao calendário?
Como está sua tática de estudo?
Como lidar com erros de 
programação?
Não se pergunte: “por que o 
programa não funciona?”
Em vez disso, pergunte-se:
“por que o programa está 
funcionando deste jeito?”
Estratégias:
Não se limite ao exemplo: teste 
vários casos
Imprima resultados intermediários
Tente explicar o problema para 
outra pessoa
Dê um tempo e tente de novo 
mais tarde
5
Conteúdo
Estruturas de repetição 
por contagem
Problemas comuns 
envolvendo vetores
6
Conteúdo
Estruturas de repetição 
por contagem
Problemas comuns 
envolvendo vetores
7
Estruturas de Programação
Qualquer programa de computador pode ser escrito 
combinando-se os três tipos básicos de estruturas de 
programação:
Sequencial Condicional Repetição
8
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 todos os 
elementos de 
uma sequência 
de valores.
9
Formato do comando for
for Variável :in Sequência
Sinal de 
dois 
pontos!
Comandos a serem 
repetidos
Se Sequência tem 
tamanho n, então o laço 
é repetido n vezes
A cada repetição, a 
variável assume um 
elemento da Sequência
Devem estar 
indentados em 
relação ao for
Restante do programa
Quando todos os elementos 
da Sequência forem 
testados, o laço acaba
Equivale ao operador 
∈, na matemática de 
conjuntos
10
Laço for
:: Exemplos
P
y
t
h
o
n
for ch in "Python":
print(ch)
1 
2
3
for i in [1,2,3]:
print(i)
11
Laço while × for
while for
x = 1
while (x <= 3):
print(x)
x = x + 1
1
2
3
for x in [1,2,3]:
print(x)
1
2
3
12
Quando usar while ou for?
while
• Útil 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
• Útil quando temos de 
processar todos os 
elementos de um 
vetor.
• Exemplo: qual a 
média dos valores de 
um vetor?
13
Atenção
Embora permitidas pelo Python, as 
seguintes práticas NÃO serão 
estudadas, pois não são formas de 
programação estruturada:
Comando else como 
alternativa aos comandos 
while e for.
Comando break.
Comando continue.
14
Função range
A função range cria uma sequência de números inteiros 
para serem usados no laço for.
A função range pode ser usada de três maneiras:
Um argumento
Dois argumentos
Três argumentos
15
Função range
:: Um argumento
A sequência:
Começa com zero 
(implícito)
Termina antes do valor 
informado como 
argumento
Cresce de um em um
0 
1 
2
3
4
for i in range(5):
print(i)
16
Função range
:: Dois argumentos
A sequência:
Começa com o 
primeiro argumento
Termina antes do valor 
informado no segundo 
argumento
Cresce de um em um
for i in range(1,5):
print(i)
1 
2
3
4
17
Função range
:: Três argumentos
A sequência:
Começa com o 
primeiro argumento
Termina antes do valor 
informado no segundo 
argumento
O terceiro argumento 
é o passo de 
crescimento
for i in range(0,5,2):
print(i)
0 
2
4
18
Função range não gera vetor!
from numpy import *
v = arange(5)
print(v)
[0 1 2 3 4]
v = range(5)
print(v)
range(0, 5)
Não cria um vetor, mas 
apenas uma sequência
de controle do laço for.
19
Conteúdo
Estruturas de repetição 
por contagem
Problemas comuns 
envolvendo vetores
20
Problema 1
:: Cálculo da Média
As notas que uma turma obteve em uma avaliação estão 
armazenadas em um vetor.
Determine a média da turma.
Problema 1
2 – Identifique as entradas e saídas
22
Grandeza Unidade de medida Faixa de valores
Entradas
Saídas
Grandeza Unidade de medida Faixa de valores
Entradas Vetor de notas --- [ [0, 10] ]
Saídas Média (escalar) --- [0, 10]
Verifique se as grandezas envolvidas 
são vetores (coleção de valores) ou 
escalares (valor único)
Vamos usar colchetes 
duplos para indicar 
um vetor
8 4 2 60
[0] [1] [2] [3]
soma = 0
8 4 2 61
[0] [1] [2] [3]
i = 0
soma = 8
8 4 2 62
[0] [1] [2] [3]
i = 1
soma = 12
8 4 2 64
[0] [1] [2] [3]
i = 3
soma = 20
...
media = soma/size(v)
Problema 1
3 – Projete o script
Tamanho da turma
23
Problema 1
4 – Codifique em Python – laço for
from numpy import *
# Atribui valores a um vetor 'v'
notas = array(eval(input("Informe as notas: ")))
# Soma dos valores do vetor. Comeca em ZERO.
soma = 0
# Calcula a soma
for i in range(size(notas)):
soma = soma + notas[i]
# Divide a soma pelo numero de
# elementos do vetor, para determinar a media
media = soma / size(notas)
print(round(media, 2))
24
Problema 1
4 – Codifique em Python – laço while
from numpy import *
# Atribui valores a um vetor 'v'
notas = array(eval(input("Informe as notas: ")))
soma = 0 # Iniciar acumulador
i = 0 # Iniciar contador
# Calcula a soma
while (i < size(notas)):
soma = soma + notas[i]
i = i + 1
# Divide a soma pelo numero de
# elementos do vetor, para determinar a media
media = soma / size(notas)
print(round(media, 2))
25
Problema 1
5 – Teste o script
Use valores fáceis, que você 
conheça a resposta antes de 
executar o script
Notas: [1, 2, 3, 4, 5]
Média: 3,0
26
Teste outro vetor, com 
tamanho diferente
Notas: [1, 2, 3, 4]
Média: 2,5
Problema 2
:: Inversão dos elementos de um vetor
Inverta a ordem dos 
elementos de um vetor, 
de tamanho qualquer, 
trocando o 1º elemento 
com o último, o 2º com o 
penúltimo, e assim 
sucessivamente.
Ao final, imprima o vetor 
invertido.
27
Problema 2
2 – Identifique as entradas e saídas
28
Grandeza Unidade de medida Faixa de valores
Entradas
Saídas
Grandeza Unidade de medida Faixa de valores
Entradas Vetor de inteiros --- [ℤ]
Saídas Vetor de inteiros --- [ℤ]
Problema 2
3 – Projete o script 1/2
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 29
Problema 2
3 – Projete o script 2/2
Qual o critério de parada?
Vetor com tamanho par?
Vetor com tamanho ímpar?
Quais índices i e j devem ser trocados numa dada 
iteração?
Note que i + j = size(v) – 1
Logo: j = size(v) – 1 - i
30
Problema 2
4 – Codifique em Python – laço for
from numpy import *
# Atribui valores a um vetor 'v'
v = array(eval(input("v: ")))
# Inverte o vetor 'v'
for i in range(size(v)//2):
j = size(v) – 1 - i
aux = v[i]
v[i] = v[j]
v[j] = aux
print(v)
31
Problema 2
5 – Teste o script
Teste 1: vetor de tamanho par
Teste 2: vetor de tamanho ímpar
11 22 33 44 55 66
11 22 33 44 55
32
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
acumuladora simples.
Categorias 
‘nominais’
• Exemplo:ücontar quantas 
pessoas são de cada 
tipo sanguíneo A, B, 
AB, O.
• O resultado é guardado 
em um vetor de 
categorias.
• Cada categoria é 
testada por uma 
condição if-elif.
Categorias 
‘ordinais’
• Exemplo:
ücontar o número de 
ocorrências de cada 
face de um dado.
• O resultado é guardado 
em um vetor de 
categorias.
• Cada categoria é 
mapeada em um índice 
do vetor de contagem.
33
Problema 3
:: Contar por condição
Leia um vetor de 
números inteiros.
Quantos números pares
há no vetor?
34
Contar por condição
2 – Identifique as entradas e saídas
35
Grandeza Unidade de medida Faixa de valores
Entradas
Saídas
Grandeza Unidade de medida Faixa de valores
Entradas Vetor de inteiros --- [ℤ]
Saídas
Qtde. de números 
pares (escalar)
--- ≥ 0
Contar por condição
3 – Projete o script 1/3
Qual o melhor tipo de laço, while ou for?
Laço for, pois todos os elementos devem ser 
verificados.
36
Contar por condição
3 – Projete o script 2/3
Quais contadores devo usar?
Dois contadores:
• i: contador do laço for, que 
percorre o vetor
• npar: conta os números pares 
existentes no vetor
37
Contar por condição
3 – Projete o script 3/3
Em que ponto do programa devo 
atualizar cada contador?
• i: automático dentro do laço for
• npar: somente quando o número lido 
for par. Isso implica que devemos usar 
um if dentro do laço for.
38
Contar por condição
4 – Codifique em Python – versão 1
from numpy import *
vet = array(eval(input("Vetor: ")))
# Contador de nos. pares
npar = 0
for i in range(size(vet)):
if (vet[i] % 2 == 0):
npar = npar + 1
print(npar)
No laço for, o vetor vet é 
percorrido pelo índice de 
seus elementos
39
Contar por condição
4 – Codifique em Python – versão 2
from numpy import *
vet = array(eval(input("Vetor: ")))
# Contador de nos. pares
npar = 0
for x in vet:
if (x % 2 == 0):
npar = npar + 1
print(npar)
No laço for, o vetor vet é 
percorrido pelo valor de 
cada elemento
40
Contar por condição
5 – Teste o script
Teste 1: todos pares
Teste 2: nenhum valor par
Teste 3: pares e ímpares
22 44 66 88
41
4
11 33 55 77 99 0
22 33 44 2
Teste também diferentes tamanhos de vetores
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
42
Problema 4
:: Contar por ‘categorias nominais’
Leia uma string contendo os tipos sanguíneos (A, B, O e AB) 
de N pessoas. Exemplo:
Quantas pessoas têm cada tipo de sangue?
43
Contar por ‘categorias nominais’ 
2 – Identifique as entradas e saídas
44
Grandeza Unidade de medida Faixa de valores
Entradas
Saídas
Grandeza Unidade de medida Faixa de valores
Entradas
Tipo sanguíneo 
(string)
--- [ {‘A’, ‘B’, ‘AB’, ‘O’} ]
Saídas
Vetor de contagem
(04 posições)
--- [≥ 0]
Contar por ‘categorias nominais’
3 – Projete o script 1/3
Transformar string em vetor de eventos:
0 1 2 3 4 5 6 7 8 ...
A A AB B A B O O AB ...Vetor de 
eventos:
Entrada:
.split(',')
Divide uma string usando 
o argumento como 
separador de elementos.
45
Contar por ‘categorias nominais’
3 – Projete o script 2/3
Cada evento lido leva ao incremento da posição 
correspondente no vetor de contagem:
0 1 2 3 4 5 6 7 8 ...
A A AB B A B O O AB ...Vetor de 
eventos:
Tamanho 
indefinido
0
A
1
B
2
O
3
AB
Vetor de 
contagem:
Tamanho igual ao 
nº de categorias
46
Contar por ‘categorias nominais’
3 – Projete o script 3/3
1. Crie um vetor de contagem cont, de N = 4 elementos, todos 
iguais a zero.
2. Leia o tipo sanguíneo.
3. Para cada tipo lido, incremente em uma unidade o elemento 
de índice i do vetor (cont[i]), pela correspondência acima.
vet
Índices do vetor
(i)
A
B
AB
O
1
3
2
0 cont
47
48
from numpy import *
# Cria o vetor de 4 categorias com zeros
cont = zeros(4, dtype=int)
# Leitura do vetor de tipos sanguineos
vet = input("Tipos de sangue: ").upper().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] == 'O'):
cont[2] = cont[2] + 1
elif (vet[i] == 'AB'):
cont[3] = cont[3] + 1
print(cont)
Contar por ‘categorias nominais’
4 – Codifique em Python – versão 1
Vetor é percorrido pelo 
índice dos elementos
Divide uma string
usando o argumento 
como separador de 
elementos.
49
from numpy import *
# Cria o vetor de 4 categorias com zeros
cont = zeros(4, dtype=int)
# Leitura do vetor de tipos sanguineos
vet = input("Tipos de sangue: ").upper().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 == 'O'):
cont[2] = cont[2] + 1
elif (x == 'AB'):
cont[3] = cont[3] + 1
print(cont)
Contar por ‘categorias nominais’
4 – Codifique em Python – versão 2
Vetor é percorrido pelo 
valor de cada elemento
Divide uma string
usando o argumento 
como separador de 
elementos.
Contar por ‘categorias nominais’
5 – Teste o script
A,A,A,A,A Tudo ‘A’
50
A B O AB
5 o o o
Entrada Saída
A,B,AB,O Um de cada
A B O AB
1 1 1 1
Contar por ‘categorias nominais’
:: Variações
¨ Contar grupos sem 
ordenação:
Quantidade de 
animais.
Quantidade de cores 
de um objeto.
Cor dos olhos, da pele, 
do cabelo, etc. de um 
grupo de pessoas.
51
Problema 5
:: Contar por ‘categorias ordinais’
Um dado não viciado de 
6 faces é lançado 6000 
vezes.
Quantas vezes ocorre 
cada face?
52
Contar por ‘categorias ordinais’ 
2 – Identifique as entradas e saídas
53
Grandeza Unidade de medida Faixa de valores
Entradas
Saídas
Grandeza Unidade de medida Faixa de valores
Entradas Vetor de inteiros --- [ {1, 2, 3, 4, 5, 6} ]
Saídas Vetor de contagem --- [≥ 0]
Contar por ‘categorias ordinais’
3 – Projete o script
Crie um vetor de contagem cont, de N = 6 elementos, todos 
inicialmente iguais a zero.
Converta o valor do evento (face) em índice do vetor:
Para cada face sorteada, incrementar o elemento de índice 
i=face-1 do vetor cont.
0 1 2 3 4 5
cont
i
face
54
Contar por ‘categorias ordinais’
4 – Codifique em Python – versão 1
from numpy import *
from numpy.random import *
# Vetor aleatorio contendo os lancamentos do dado
dado = randint(1, 7, size = 6000)
# Vetor de contagem com 6 elementos
cont = zeros(6, dtype=int)
# Contagem de ocorrencias
for i in range(size(dado)):
face = dado[i]
cont[face-1] = cont[face-1] + 1
# Imprime vetor de frequencia
print(cont)
O valor do elemento 
do vetor contado 
(dados) ajuda a 
encontrar o índice do 
vetor de contagem
55
Contar por ‘categorias ordinais’
4 – Codifique em Python – versão 2
from numpy import *
from numpy.random import *
# Vetor aleatorio contendo os lancamentos do dado
dado = randint(1, 7, size = 6000)
# Vetor de contagem com 6 elementos
cont = zeros(6, dtype=int)
# Contagem de ocorrencias
for x in dado:
face = x
cont[face-1] = cont[face-1] + 1
# Imprime vetor de frequencia
print(cont)
O valor do elemento 
do vetor contado 
(dados) ajuda a 
encontrar o índice do 
vetor de contagem
56
Contar por ‘categorias ordinais’
5 – Teste o script
Teste 1: somente uma das faces foi sorteada
Teste 2: todas as faces foram sorteadas uma vez, exceto uma
5 5 5 5 5 5 5
o o o o 7 o
57
dado
cont
1 2 3 4 5 6 6
1 1 1 1 1 2
dado
cont
Contar por ‘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 em 
cada dia da semana 
(segunda a sábado).
58
Referências bibliográficas
MENEZES, Nilo Ney Coutinho (2014). Introdução à 
Programação com Python, 2 ed. 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.
59
Dúvidas?