Baixe o app para aproveitar ainda mais
Prévia do material em texto
Disciplina: Informática para Engenharia Aula 7: Estruturas de Repetição Apresentação Em diversas situações cotidianas, realizamos tarefas repetitivas, como realizar um número determinado de movimentos ao nos exercitarmos, saber o total em dinheiro ao contar uma a uma as cédulas (ou moeda) disponíveis, entre outras. Na Programação, existem situações em que você precisa repetir uma única instrução ou um grupo de instruções até que alguma condição seja atendida, tais como ler todos os arquivos de um diretório, enviar e-mail a todos os funcionários etc. Essas tarefas na Programação são tratadas por instruções em loop. Objetivos Examinar problemas que envolvem repetição de comandos; Analisar o uso das estruturas de repetição de maneira a evitar a duplicação e a redundância de códigos; Avaliar o uso em conjunto com outras estruturas já vistas, de modo a representar situações que envolvem a contagem e soma de valores. Estruturas de Repetição Vamos considerar o exemplo do cálculo de média tratado até aqui. Imagine se você quiser lançar a nota de 3 alunos. Bem, você pode pensar “vou executar o programa 3 vezes”, não é? >>> print(“Informe a nota do Aluno 1”) >>> nota1 = float(input(“Digite a nota 1: ”)) >>> nota2 = float(input(“Digite a nota 2: ”)) >>> media = (nota 1 + nota 2) / 2 >>> print(“Informe a nota do Aluno 2”) >>> nota1 = float(input(“Digite a nota 1: ”)) >>> nota2 = float(input(“Digite a nota 2: ”)) >>> media = (nota1 + nota2) / 2 >>> print(“Informe a nota do Aluno 3”) >>> nota1 = float(input(“Digite a nota 1: ”)) >>> nota2 = float(input(“Digite a nota 2: ”)) >>> media = (nota 1 + nota 2) / 2 (Fonte: Doidam 10 / Shutterstock) No entanto, o que acontece se a turma for formada por 35 alunos? Irá “copiar e colar” o código acima mais 32 vezes? E se tiver, 40? 50? Não parece uma boa ideia ficar “copiando e colando” (e contando!) inúmeras vezes o código. Uma boa estratégia seria você obter (automaticamente) o número de alunos, e o próprio computador se encarregar de controlar a quantidade de vezes que você tem de lançar a nota, não é? Poderíamos pensar em algo assim: 1 2 3 4 5 ENQUANTO o número de alunos for menor do que 50, FAÇA Leia a nota 1 Leia a nota 2 Calcule a média Escreva a média calculada Ou seja, as ações após a linha 2 serão repetidas até que a condição (linha 1) seja satisfeita. A esses trechos do algoritmo que são repetidos damos o nome de laços de repetição. Podemos observar o funcionamento dessa estrutura analisando o fluxograma a seguir. Atenção Uma importante questão é que esses laços (ou loops), apesar de poderem ser grandes e/ou indeterminados, são finitos! Após a repetição do bloco de comandos, a condição é testada e, caso seja falsa, o programa segue seu fluxo normal. Repetição com Teste no Início As estruturas de repetição com teste no início fim tem como característica a execução de todos os comandos pertencentes ao bloco antes da verificação. Assim, no pior caso, poderíamos nunca executar o bloco de código dentro dessa estrutura. Poderíamos fazer uma analogia com um restaurante fast food, onde, no início, verificamos se temos condição ($$$) de pagar e, em caso positivo, escolhemos o prato do menu, pedimos e comemos. O fluxograma anterior ilustra esse tipo de estrutura. A seguir, são apresentadas as sintaxes em pseudocódigo e Python. Pseudocódigo ENQUANTO (<condição>) FAÇA bloco de comandos; FIMENQUANTO Python while (<condição>): bloco de comandos; Observe o exemplo que trata a simples validação de uma senha digitada. Perceba que o bloco de código responsável pela leitura de senha irá repetir-se até que o usuário acerte a senha. Pseudocódigo senha ← ‘0’; ENQUANTO (senha <> ‘123’) FAÇA ESCREVA(‘Digite sua senha: ‘); LEIA(senha); FIMENQUANTO Python senha=‘0’ while (senha !=‘123’): senha = input(‘Digite sua senha: ’) Repetição com Teste no Fim As estruturas de repetição com teste no fim têm como característica a execução de todos os comandos pertencentes ao bloco antes da verificação. Nesse caso, executaremos o bloco de código, no mínimo, uma vez. Poderíamos fazer uma analogia com um restaurante à la carte, em que escolhemos o prato do menu, pedimos, comemos e, ao final, vemos se temos condição ($$$) de pagar! A seguir, são apresentadas as sintaxes em pseudocódigo e Python. Pseudocódigo REPITA bloco de comandos; ATÉ (<condição>); Python while True: bloco de comandos; if (<condição>): break; Dica Diferentemente do pseudocódigo e até mesmo de outras linguagens, no Python não existe uma estrutura explícita do repita...até. A estratégia para representar esse tipo de repetição consiste na verificação de uma condição (if (<condição>)) no final do bloco do código do while. Caso a condição seja satisfeita, utiliza-se o comando break para interromper o loop. Observe novamente o problema de validação de senha. Perceba que, inicialmente, a estrutura não faz nenhum tipo de verificação. Assim, não é necessário “inicializar” a variável senha com um valor qualquer (senha ← 0), conforme observado no exemplo da estrutura anterior (teste no início). Pseudocódigo REPITA ESCREVA(‘Digite sua senha: ’); LEIA(senha); ATÉ (senha==‘123’) Python while True: senha = input(‘Digite sua senha: ’) if (senha == ‘123’) break; Repetição Contável Até agora, as estruturas apresentadas não possibilitam determinar a quantidade de vezes que o bloco será executado. Ou eles irão repetir-se enquanto uma condição for satisfeita ou que se repita até que a condição seja satisfeita. No caso em que precisamos determinar o número de vezes (ou seja, ela é contável!) em que certos comandos devem ser repetidos, a estrutura utilizada é o para. A seguir, são apresentadas as sintaxes em pseudocódigo e Python. Pseudocódigo PARA <variável> DE <valor_inicial> ATÉ <valor_final> PASSO <p> FAÇA bloco de comandos; FIM PARA Python for <variável> in (<faixa de valores>): bloco de comandos Observe que a sintaxe no Python é bem mais simples que em portugol. Em pseudocódigo temos que definir explicitamente a variável de controle (x), o início (DE 1), o fim (ATÉ 10) e o incremento (PASSO 1). De modo contrário, o início, o fim o e incremento são reunidos em um só comando Python: o range. O exemplo para a leitura de 10 valores numéricos do teclado é ilustrado em pseudocódigo e Python. Pseudocódigo PARA x DE 1 ATÉ 10 PASSO 1 FAÇA ESCREVA(‘Digite um número: ’) LEIA(num) FIM PARA Python for x in range(10): num = int(input (‘Digite um número: ’) No Python, tais faixas de valores podem ser: Listados explicitamente # print(x) será repetido 5 vezes, uma para cada valor # especificado entre parênteses no comando for >>> for x in (0,1,2,3,4): >>> print(x) Especificados como um intervalo com início, fim e incremento, usando range # Outra forma de resolver o problema anterior # especificado entre parênteses no comando for >>> for x in range(0,5,1): >>> print(x) Como podemos perceber, o comando range tem três parâmetros, dos quais ele: 01 Determina o valor inicial. Quando omitido, início = 0; 02 Determina o valor final (obrigatório); 03 Determina o incremento (opcional). Quando omitido, incremento = 1. Exemplo Outra forma de usar o range no problema anterior é: >>> for x in range(5): >>> print(x) Imprimir números pares até 10… >>> for x in range(2,10,2): >>> print(x) Imprimir números pares até 10 de forma invertida… >>> for x in range(10,2,-2): >>> print(x) (Fonte: Marina Pousheva / Shutterstock) Contadores e Somadores Em muitas situações, estamos interessados em contar coisas como, por exemplo, a quantidade de carros que passam em um pedágio, o número de pessoas em uma fila etc. Em outros, podemos estar interessados em realizar cálculos estatísticos, como obter a média de notas de uma turma, calcular a velocidade média de carros trafegando em uma via em determinado instante de tempo, entre outros. Nesses casos, temos de declarar variáveis para se comportarem como contadores ou acumuladores (ou somadores).Dependendo do problema, podemos ter de utilizar estruturas condicionais para atender às regras de negócio! Considere o seguinte problema: você tem de desenvolver um programa que tem por objetivo ler números digitados por um usuário. A leitura deve encerrar quando for digitado o número 0 (zero). >>> num = 1 >>> while (num!=0): >>> num = int(input(‘Informe um número (0 para sair): ’)) Se quiséssemos informar a quantidade de números digitados, como faríamos? Simples! Devemos criar uma variável chamada cont, inicialmente com valor 0 (zero), e a cada loop devemos incrementar a própria variável em uma unidade. O código a seguir ilustra o processo: >>> cont = 0 >>> num = 1 >>> while (num!=0): >>> num = int(input(‘Informe um número (0 para sair): ’)) >>> cont = cont + 1 >>> >>> print(cont) Imagine agora o problema do cálculo da velocidade média de automóveis em uma via. O usuário informaria a velocidade aferida, finalizando o cadastro com o valor 0 (zero). Bem, a contagem nós já sabemos fazer! Mas, para a média, além da quantidade de carros, precisamos da soma das velocidades, correto? A solução então seria criar outra variável que iria ‘acumular’ (somar) as velocidades. >>> cont = 0 >>> velocidade = 1 >>> soma = 0 >>> while (velocidade!=0): >>> velocidade = int(input(‘Informe a velocidade (km/h): ’)) >>> cont = cont + 1 >>> soma = soma + velocidade >>> media = soma / (cont-1) >>> print(media) Comentário Vamos prestar a atenção em duas situações na penúltima linha: primeiro, temos de desconsiderar o 0 (zero) digitado para a finalização do programa, daí o cont-1; em segundo lugar, precisamos ter cuidado de fazer essa operação primeiro e, depois, a divisão. Ou seja, temos de priorizar a subtração com uso dos parênteses. Seguindo o problema do cálculo de velocidade média, imagine que a chefia pediu que emitisse um relatório dos carros que trafegaram acima de 100 km/h. Bem, podemos perceber que devemos separar a amostra em dois subconjuntos distintos. Em outras palavras, devemos contar os carros e acumular a respectiva velocidade caso ela seja superior ou igual a 100 km/h. >>> cont, velocidade, soma = 0,1,0 >>> while (velocidade!=0): >>> velocidade = int(input(‘Informe a velocidade (km/h): ’)) >>> if (velocidade>=100): >>> cont = cont + 1 >>> soma = soma + velocidade >>> media = soma / cont >>> print(media) (Fonte: Kichigin / Shutterstock) Como, nesse exemplo, a variável cont somente irá incrementar se a velocidade for maior do que 0 (zero), não precisamos daquele recurso (cont- 1) utilizado anteriormente. Vimos assim que podemos mesclar as estruturas repetitivas com as condicionais, e vice-versa. As aplicações de contadores e somadores não se limitam ao uso de estruturas de repetição com verificação no início e/ou fim, ou seja, o while. Exemplo Por exemplo, considere que determinado problema necessite calcular , em que é informado pelo usuário. Caso o usuário forneça um valor negativo, o programa deve apresentar a mensagem: “Digite apenas valores maiores ou iguais a zero”. O código em Python resultante seria: >>> sum=0 >>> n = int(input(‘Informe um valor para N: ’)) =∑Nj j1 N >>> for j in range(0,n): >>> sum=sum+j Considere agora o problema para calcular a integral definida de determinada função. O usuário deve fornecer os limites de integração da função considerada. Divida o intervalo em 10.000 partições e faça um somatório, avaliando a função e somando todos os resultados. Exemplo Por exemplo, calcule a integral da função no intervalo de 0 a 1, cujo resultado é 1. A função deve ser definida de forma explícita no código, e os intervalos devem ser fornecidos pelo usuário. O programa deve dividir o intervalo em 10.000 partes e atribuir a o valor do limite inferior, ou seja, 0. A função deve ser avaliada para x = 0 e, depois disso, para cada uma das 10.000 partições feitas. Todas as vezes que x for avaliado, o resultado deve ser armazenado em um somatório. Esse somatório é o resultado da integral. >>> limInf=int(input('Informe o limite inferior: ')) >>> limSup=int(input('Informe o limite superior: ')) >>> particoes=(limSup-limInf) / 10000; >>> integral=0.0 >>> x,y=limInf,0 >>> while (x<limSup): f (x) = 2x x >>> y=2*x >>> integral+=particoes*y; >>> x+=particoes >>> print(integral) Atividade 1. Observe os trechos dos algoritmos a seguir: ALGORITMO questao1a x,y,z: inteiro; INÍCIO x ← 10; z ← 0; ESCREVA(‘Informe um número: ’) LEIA(y); ENQUANTO (z<y) FAÇA z ← z + 1; x ← x + y; FIM ENQUANTO ESCREVA(x) FIM ALGORITMO. ALGORITMO questao1b x,y,z: inteiro; INÍCIO x ← 10; z ← 0; ESCREVA(‘Informe um número: ’) LEIA(y); REPITA z ← z + 1; x ← x + y; ATÉ (z>y); ESCREVA(x) FIM ALGORITMO. Em um primeiro momento, foi digitado o número 5 para a variável y em ambos programas (questao1a e questao1b). Na segunda execução, o valor 0 foi digitado para a variável y. Quais serão as saídas da primeira e da segunda execução? a) 35 e 15; 10 e 10. b) 35 e 15; 10 e loop infinito. c) loop infinito em ambos; 10 e 10. d) 35 e loop infinito; 5 e 5. e) 25 e 10; loop infinito. 2. Implemente os seguintes algoritmos em Python: ALGORITMO questao2a ALGORITMO questao1a; x,y,z: inteiro; INÍCIO x ← 10; z ← 0; ESCREVA(‘Informe um número: ’) LEIA(y); ENQUANTO (z<y) FAÇA z ← z + 1; x ← x + y; FIM ENQUANTO ESCREVA(x) FIM ALGORITMO. ALGORITMO questao2b ALGORITMO questao1b; x,y,z: inteiro; INÍCIO x ← 10; z ← 0; ESCREVA(‘Informe um número: ’) LEIA(y); REPITA z ← z + 1; x ← x + y; ATÉ (z>y); ESCREVA(x) FIM ALGORITMO. 3. Dado um número inteiro positivo informado pelo usuário, desenvolva um programa em Python que calcule seu fatorial. Dica: o cálculo só deve ser realizado se o número for válido. Utilize a estrutura for. Referências GRUS, J. Data science from scratch: first principles with Python. Beijing: O’Reilly, 2015. MENEZES, N.N.C. Introdução à programação com Python: algoritmos e lógica de programação para iniciantes. 1 ed. São Paulo: Novatec, 2017. MUELLER, J.P. Começando a programar em Python para leigos. Alta Books, 2016. PERKOVIC, L. Introduction to computing using Python: an application development focus. 2 ed. [s.l.] Wiley Publishing, 2015. Próximos Passos Códigos desenvolvidos, de maneira a aplicar as técnicas de modularização de programas; Recursos avançados de desenvolvimento de programas com uso de estruturas condicionais e repetitivas; Tarefa de refinamentos sucessivos no código, de maneira a obter códigos de maior qualidade. Explore mais Assista aos vídeos: 23 - Python - Loop While (Estrutura de Repetição) e instrução break <https://www.youtube.com/watch?v=oUXUVVP2_6E> ; 24 - Python - Loop FOR - Estruturas de Repetição - Função RANGE() <https://www.youtube.com/watch?v=55rOjj6kEck> .
Compartilhar