Você está na página 1de 55

IEC081 - Introduo Cincia dos Computadores

IEC037 - Introduo Programao de


Computadores

Aula 06 Estruturas de Repetio por


Contagem

2016/1
Atualizado em 11/08/2016

Contedo

Estruturas de repetio
por contagem
Problemas comuns
envolvendo vetores

Contedo

Estruturas de repetio
por contagem
Problemas comuns
envolvendo vetores

Estruturas de Programao

Qualquer programa de computador pode ser


escrito combinando-se os trs tipos bsicos de
estruturas de programao:

Sequencial

Condicional

Repetio

Estruturas de Repetio
:: Critrios de repetio
Por condio
(while)

Por contagem
(for)

Repete um
bloco de
comandos
enquanto uma
condio for
verdadeira.

Repete um
bloco de
comandos para
cada elemento
de um vetor.

Estruturas de Repetio
:: Exemplos
while

for

x = 1
while (x <= 3):
print(x)
x = x + 1

1
2
3

from numpy import *


v = array([1,2,3])
for x in v:
print(x)

1
2
3

Quando usar while ou for?


while

for

Usamos quando no
sabemos quantas
vezes vamos repetir
o lao.
Exemplo: qual e
onde est o primeiro
nmero negativo de
um vetor?

Usamos quando
temos de processar
todos os elementos
de um vetor.
Exemplo: qual a
mdia dos valores de
um vetor?

Ateno

Embora permitidas pelo


Python, as seguintes prticas
NO sero aceitas, pois no
so formas de programao
estruturada:
else como
alternativa aos comandos
while e for.
Comando break.
Comando continue.
Comando

Funo range

A funo range simplifica a criao e contagem


dos elementos de um vetor, pois gera uma
sequncia de nmeros inteiros para serem usados
por um lao do tipo for.
A funo range pode ser usada de trs maneiras:
Um

argumento
Dois argumentos
Trs argumentos

Funo range
:: Um argumento

A sequncia:
for i in range(5):
print(i)

Comea

com 0
Termina antes do valor
informado como
argumento
Cresce de um em um

0
1
2
3
4

Funo range
:: Dois argumentos

A sequncia:
for i in range(1,5):
print(i)

Comea

com o
primeiro argumento
Termina antes do valor
informado no segundo
argumento
Cresce de um em um
1
2
3
4

Funo range
:: Trs argumentos

A sequncia:
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)

Comea

0
2
4

Funo range
:: Outros exemplos
for i in range(3,9,2):
print(i)

3
5
7

for i in range(5,0,-1):
print(i)

5
4
3
2
1

Contedo

Estruturas de repetio
por contagem
Problemas comuns
envolvendo vetores

Problema 1
:: Clculo da Mdia

As notas das provas aplicadas a uma classe esto


armazenadas em um vetor.
Como calcular a mdia da classe?

Clculo da Mdia
[0] [1] [2] [3]

[0] [1] [2] [3]


1

soma = 0

soma = 8
i=0
[0] [1] [2] [3]

...

[0] [1] [2] [3]


4

soma = 12
i= 1

soma = 20
i= 3

media = soma/(i+1)
Tamanho da classe

Clculo da Mdia
:: Script em Python lao 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)

Clculo da Mdia
:: Script em Python lao while
from numpy import *
# Atribui valores a um vetor 'v'
v = array([8, 4, 2, 6])
soma = 0
i = 0

# Iniciar acumulador
# 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
:: Inverso dos elementos de um vetor

Inverter um vetor, de
tamanho qualquer,
trocando o 1
elemento com o
ltimo, o 2 com o
penltimo, e assim
sucessivamente.

Ao final, imprimir o
vetor invertido.

Inverso dos elementos de um vetor


[0] [1] [2] [3] [4] [5]
0

88 44 22 66 77 11
[0] [1] [2] [3] [4] [5]

88 44 22 66 77 11

[0] [1] [2] [3] [4] [5]


2

11 44 22 66 77 88
[0] [1] [2] [3] [4] [5]

11 77 22 66 44 88

aux = v[0]
v[0] = v[5]
v[5] = aux

aux = v[1]
v[1] = v[4]
v[4] = aux
aux = v[2]
v[2] = v[3]
v[3] = aux

Inverso dos elementos de um vetor


:: Projetar algoritmo

Qual o critrio de parada?


Vetor

com tamanho par?


Vetor com tamanho mpar?

Quais ndices i e j devem ser trocados em uma


iterao qualquer?
Note

que i + j = size(v) - 1

Inverso dos elementos de um vetor


:: Script em Python lao 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)

Inverso dos elementos de um vetor


:: Script em Python lao 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 ocorrncias

Por condio
Exemplos: quantos
elementos so pares,
quantos elementos so
maiores, menores ou
iguais a N.
O resultado guardado
em uma varivel
acumuladora simples.

Categorias
nominais

Categorias
ordinais

Exemplo: contar
quantas pessoas so de
cada tipo sanguneo A,
B, AB, O.
O resultado guardado
em um vetor.
Cada categoria deve ser
testada por uma
condio composta
(if/elif) dentro do lao.

Exemplos: contar o
nmero de ocorrncias
de cada face de um
dado em diversos
lanamentos.
O resultado guardado
em um vetor.
Cada categoria deve ser
mapeada em um ndice
do vetor de contagem.

Problema 3
:: Contar por condio

Considere um vetor
de nmeros inteiros
quaisquer.
Quantos nmeros
pares ele contm?

Contar por condio


:: Projetar algoritmo

Qual o melhor tipo de lao (while ou for)?


for, pois todos os elementos devem ser
verificados.

Lao

Quais contadores envolvidos?


i:

contador do lao for


npar: conta os nmeros pares pertencentes ao vetor

Quando os contadores so atualizados?


i:

automtico dentro do lao for


npar: somente quando o nmero lido for par (implica
usar uma estrutura if dentro do lao for)

Contar por condio


:: Script em Python verso 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 condio


:: Script em Python verso 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 condio


:: Variaes

Contar ou somar:
Elementos

de valor
par ou mpar
Elementos em
posies pares ou
mpares do vetor
Nmeros menores,
maiores ou iguais a X

Problema 4
:: Contar por categorias nominais

Considere um vetor com os tipos sanguneos (A, B,


O e AB) de 10 pessoas.
Qual o nmero de ocorrncias de cada um dos
tipos?

Generalizao

Criar um vetor de contagem, do tipo inteiro, com


tamanho igual a N (nmero de categorias possveis
no conjunto).
Mapear as categorias possveis em ndices de um
vetor de contagem.

c1
Categorias

c2
cN

i1

i0

iN-1

ndices
do vetor

Contagem de ocorrncias
:: Categorias nominais
Vetor de
eventos:

...

...

Tamanho
indefinido

Vetor de
contagem:

Tamanho igual ao
n de categorias
0
A

1
B

2
C

3
D

Contagem de ocorrncias
:: Projetar algoritmo
A
Categorias

AB

1
3

ndices do vetor
(i)

Criar um vetor de contagem cont, de N = 4


elementos, todos iguais a zero.
Ler o tipo sanguneo.
Para cada tipo lido, incrementar em uma unidade o
elemento de ndice i do vetor, conforme
correspondncia pr-determinada.

Contagem de ocorrncias
:: Script em Python verso 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)):
Os elementos do
if (vet[i] == 'A'):
vetor devem ser
cont[0] = cont[0] + 1
separados por
elif (vet[i] == 'B'):
vrgula, sem espao.
cont[1] = cont[1] + 1
elif (vet[i] == 'AB'):
cont[2] = cont[2] + 1
else:
# Para o tipo O
Vetor percorrido
cont[3] = cont[3] + 1
pelo ndice do
# Imprime vetor de contagem
elemento
print(cont)

Contagem de ocorrncias
:: Script em Python verso 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
Vetor percorrido
cont[3] = cont[3] + 1
diretamente pelo
# Imprime vetor de contagem
valor do elemento
print(cont)

Contar categorias nominais


:: Variaes

Contar classes que no


tenham ordenao:
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 no viciado
de 6 faces lanado
6000 vezes.
Quantas vezes ocorre
cada face?

Generalizao

Dado um conjunto de N eventos {1 , 2 , , },


como contar o nmero de ocorrncias de cada
evento?
Aqui o vetor ser usado para contar eventos,
utilizando uma funo que converte o nmero que
representa a categoria em um ndice do vetor de
contagem.

Generalizao
:: Soluo

Criar um vetor de contagem, do tipo inteiro, com


tamanho igual a N (nmero de eventos possveis
no conjunto).
Mapear os eventos possveis em ndices de um
vetor de contagem.

Eventos

e2
eN

e1

f(x)

i2
iN

i1

ndices
do vetor

Contagem de ocorrncias
:: Projetar algoritmo
Eventos
(fc)

1 2
3 4
5
6

f(x)
i = fc-1

2
3
4
5

ndices do vetor
(i)

Criar um vetor de contagem cont, de N = 6


elementos, todos iguais a zero.
Para cada face sorteada, incrementar o elemento
de ndice face-1 do vetor cont.

Contagem de ocorrncias
:: Script em Python
from numpy import *
from numpy.random import *

# Vetor aleatorio contendo os lancamentos do dado


lancamentos = randint(1, 7, size = 6000)
# Vetor de contagem
# Os 6 elementos comecam com zero
cont = zeros(6, dtype=int)
# Contagem de ocorrencias
for i in range(size(lancamentos)):
face = lancamentos[i]
cont[face-1] = cont[face-1] + 1
# Imprime vetor de frequencia
print(cont)

Faces do dado
:: Teste
lancamentos

freq
face

Contar categorias ordinais


:: Variaes

Contar classes de
objetos que seguem
uma ordem:
O

nmero de alunos
que tiraram cada uma
das notas (0 a 10).
Quantidade de faltas
de funcionrios ao
longo da semana
(segunda a sbado).

Problema 5
:: Arte ASCII

Escreva um script para


imprimir vrios
caracteres asterisco
para formar o padro
ao lado.
Entrada: n de
asteriscos da base do
tringulo

Arte ASCII
:: Projetar algoritmo
1.
2.
3.
4.

Ler N, n de asteriscos na base


Iniciar contador de linhas j
Para cada linha j, imprimir i asteriscos
Repetir passos 1 e 2 por N vezes

Arte ASCII
:: Script em Python lao for
# Leitura do tamanho da base
base = eval(input("Tamanho da base: "))
# Controla linha
for j in range(base):
# Controla asteriscos numa linha
for i in range(j + 1):
Limite do 2 lao no mais
print("*", end="")
constante. Passa a se basear
no contador do 1 lao.
# Pula linha
print("")

Arte ASCII
:: Script em Python lao while
# Leitura do tamanho da base
base = eval(input("Tamanho da base: "))
j = 0
# Controla linha
while (j < base):
i = 0
# Controla asteriscos numa linha
while (i < j + 1):
Contador do 2 lao no mais
print("*", end="") constante. Passa a se basear no
contador do 1 lao.
i = i + 1
# Pula linha
print("")
j = j + 1

Problema Extra
:: Fraes contnuas

Determine o valor de
2 com base na
expanso em fraes
contnuas.
1

2=1+

2+

2+

1
2+

O que so fraes contnuas?

Uma frao contnua um nmero irracional que


pode ser expresso atravs da seguinte forma:
1
= 0 +
2
1 +
3
2 +
4
3 +

onde , so coeficientes quaisquer.


Note que a expresso acima infinita.
Como um algoritmo deve ser executado em tempo
finito, devemos impor um limite sequncia.

Fraes contnuas
0 +

1
1 + +
2

Na expresso acima, o ponto de partida (semente)


no cmputo da frao contnua.
O valor da frao deve ser calculado iterativamente de
baixo para cima.
Para um grande nmero de iteraes, o valor da
semente torna-se desprezvel.

Problema Extra
Projetar algoritmo termo geral
1

2=1+

2+
2+
No se repete

O que se repete?

1
1
2+

1
2+

Problema Extra
Projetar algoritmo
1.
2.
3.
4.

Iniciar a semente
Iniciar o contador de lao
Atualizar o termo geral
Repetir passo 3 enquanto contador no atinge
um nmero de repeties considerado grande
(1000 seria um bom chute?)

5. Imprimir valor aproximado de 2

Problema Extra
Codificar em Python
# Nmero 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)

Referncias bibliogrficas

Menezes, Nilo Ney Coutinho (2010). Introduo


Programao com Python. Editora Novatec.
HETLAND, Magnus Lie (2008). Beginning Python:
From Novice to Professional. Springer eBooks, 2
edio. Disponvel em:
http://dx.doi.org/10.1007/978-1-4302-0634-7.
Horstmann, Cay & Necaise, Rance D. (2013).
Python for Everyone. John Wiley & Sons.

Dvidas?

Você também pode gostar