Baixe o app para aproveitar ainda mais
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?
Compartilhar