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?