You are on page 1of 13
capituLo 5 Repeticoes Repetigdes representam a base de varios programas. Sao utilizadas para executar a mesma parte de um programa varias vezes, normalmente dependendo de uma condigio. Por exemplo, para imprimir trés nameros na tela, poderfamos escrever um programa como: print(a) print(2) print(3) Podemos imaginar que para imprimir tés mimeros, comegando de 1 até o 3, devemos variar print(x), em que x varia de 1 a 3. Vejamos outra solucéo: xet print(x) x22 print(x) x23 print(x) Outra solugio seria incrementar o valor de x apés cada print: xet print(x) exed print(x) kext print(x) Porém, se o objetivo fosse escrever 100 niimeros, a solugao nao seria to agrad- vel, pois teriamos de escrever pelo menos 200 linhas! A estrutura de repetigao aparece para nos auxiliar a resolver esse tipo de problema, Uma das estrururas de repetig’o do Python € 0 while, que repete um bloco enquanto a condigao for verdadeira. Seu formato é apresentado a seguir, em 4 Repetigoes 85 40 uma expressio logica, e bloco representa as linhas de programa a juanto o resultado da condigio for verdadeiro. condigéo>: iver. problema de escrever trés mimeros utilizando 0 while, escrev programa: int(x) © x+10 0 desse programa seria um pouco diferente do que vimos até agora @ seria executada inicializando a varidvel x com o valor 1. A linha @ 1 combinagio de estrutura condicional com estrutura de repeticia. entender a condig3o do while da mesma forma que a condigao de &f. ca € que, se a condigao for verdadeira, repetiremos as linhas @ ¢ @ fenquanto a avaliagéo da condigio for verdadeira remos a impressio na tela propriamente dita, em que x é 1. Em @ tem lor de x é acrescentado de 1. Como x vale 1, x + 1 valerd 2. Esse novo jentio atribuido a x. A parte nova é que a execugio nfo termina apés @, fim do bloco, mas retoma para @. E esse retorno que faz a estrutura de especial, xvale 2.x < 3 continua verdadeiro (true), logo, o bloco ser executado © realizar a impresséo do valor 2, e @ atualizara o valor de x para se caso, 2 +1 = 3. A execugdo volta novamente para a linha @- igo em @ 6 avaliada, e, como x vale 3,x < 3 continua verdadeira, fazendo mie as linhas © c © sejam executadas, exibindo 3 ¢ atualizando 0 va 4(3 +1) ponto, @, temos que x vale 4 ¢ que a condicao x . rerminando, assim, a repetigao do bloco. i051 Modifique o programa para exibir os mimeros de 12 100. 5.2. Modifique o programa para exibir os nuimeros de 50 a 100. i053. Faca um programa para escrever a contagem regressiva do langa- zo de um foguete. O programa deve imprimir 10, 9,8, ...1, 0 e Fogo! na tela 86 Introducéo & Programacao com Python ~ 3*edicao 5.1 Contadores © poder das estruturas de repetigdes € muito interessante, principalmente quando utilizamos condigdes com mais de uma varidvel. Imagine um problema em que deveriamos imprimir os mimeros inteiros entre 1 e um valor digitado pelo usuario. Vamos escrever um programa de forma que o tiltimo niimero a imprimir seja informado pelo usuario: fin = int(input(“Digite o Ultimo ninero 2 inprintr: xe while x < Fin: @ print(x) © x=x+10 Nesse caso, 0 programa imprimir de 1 até o valor digitado em @. Em ® utiliza mos a variavel fir para representar o limite de nossa repeticdo. Agora vamos analisar 0 que realizamos com a varidvel x dentro da repetigio. Em @, o valor de x é simplesmente impresso. Em @ atualizamos o valor de x com x + 1, ou seja, com 0 préximo valor inteiro, Quando realizamos esse tipo de operagao dentro de uma repeticio, estamos contando. Logo, diremos que x €um contador. Um contador é uma variével utilizada para contar o mimero de ocorréncias de um determinado evento; nesse caso, 0 mimero de repetigées do while, que satisfaz as necessidades de nosso problema Experimente esse programa com varios valores, primeito digitando 5, depois 500 €, por fim, 0 (zero). Provavelmente, 5 ¢ 500 produzitio os resultados espe- rados, ou seja, a impressio de 1 até 5, ou de 1 até 500. Porém, quando digitamos zero, nada acontece, € 0 programa termina logo a seguir, sem impressio. Analisando nosso programa quando a varisvel fia vale 0, ou seja, quando digita- mos 0 em @, temos que a condicdo em @ x < fin, Como xé Le fin € 0, temos que 1 < 8 é falso desde a primeira execucio, fazendo com que o bloco a repetir do seja executado, uma vez que sua condiggo de entrada é falsa, O mesmo aconteceria na insergdo de valores negativos. Imagine que o problema agora seja um pouco diferente: imprimir apenas os aiimeros pares entre 0 ¢ um miimero digitado pelo usuétio, de forma bem similar ao problema anterior. Poderiamos resolver o problema com um éf para testar se x par ou impar antes de imprimir. Vale lembrar que um niimero é par quando €0 ou miltiplo de 2. Quando é miiltiplo de 2, temos que o testo da divisao desse mimero por 2 € 0, ou seja, 0 resultado é uma divistio exata, sem resto. Em Python, podemos escrever esse teste com x % 2 == 0 (resto da diviso de x por 2 € igual a zero); alterando o programa anterior, temos: stile» Po IEsses dois igue pode Solucdesg assim com Hejamos ot ide um ni Sendo nom Excueos Repeticoes at input("Digite o dltino ninero a Arprinir ° a= fin xk2=0 0 printix) © x41 para comecar a imprimir do 0,e nio de 1, modificamos @. Um detalhe © € que © é um bloco dentro de éf @, sendo para isso deslocado xecute o programa e verifique seu resultado,” almente, estamos resolvendo 0 problema, mas poderiamos resolvé- a ainda mais simples se adiciondssemos 2 a x a cada repetiga0. Isso B que x sempre fosse par: Ant(input("Digite o Wltino ninero a inprinir: BE < fin: SO) x+2 exemplos mostram que existe mais de uma solugio para o problema, mos escrever programas diferentes € obter a mesma solucio. Essas B podem ser as vezes mais complicadas, as vezes mais simples, mas Brretas. 54 Modifique o programa anterior para imprimir de 1 até o miimero do pelo ususrio, mas, dessa vez, apenas 0s nlimeros impares. 5.5 Reescreva o programa anterior para escrever 0s 10 primeizos milk 3, S outro tipo de problema. Imagine ter de imprimir a tabuada de adi Inimero digitado pelo usuario. Essa tabuada deve ser impressa de ‘o ntimero digitado pelo usuario, Terfamos, assim, n+1, n42,... +10 int (input ("Tabuada de:")) print(n + x) xed ge o programa anterior e experimente diversos valores. 88 Introducéo & Programagéo com Python ~ 3° edicio Brerdicio 5.6 Altere o programa anterior para exibir os resultados no mesmo for- mato de uma tabuada: 2x1 = 2, 2x2 = 4, frercdo 5.7 Modifique o programa anterior de forma que o usuétio também digite 0 inicio €o fim da tabuada, em vez de comecar com le 10 Brercido5.8Escreva um programa que leia dois niimeros. Imprima o resultado da multiplicagao do primeiro pelo segundo. Utilize apenas os operadores de soma e subtrasio para caleular o resultado, Lembre-se de que podemos entender a multi= plicagao de dois nimeros como somas sucessivas de um deles. Assim, 4 x S+54+5=444e44444, Erercido 59 Escreva um programa que leia dois nimeros. Imprima a divisio inteira do primeiro pelo segundo, assim como o resto da divisio. Utilize apenas 0 operadores de soma e subtracio para calcular o resultado. Lembre-se de que podemas entender 0 quociente da divisio de dois ntimeros como a quantidade de vezes que podemos retirar o divisor do dividendo. Logo, 20 = podemos subtrair 4 cinco vezes de 20 5, uma vez que Contador nbém podem ser iteis quando usados com condigdes dentro dos programas Vejamos um programa para corrigir um teste de miltipla escolha com ts questdes. A resposta da primeira é “b"; da segunda, “a”; e da terceira, 'd° O programa seguinte conta um ponto a cada resposta correta: while questo < 3: ‘resposta = input(f'Resposte da questo (questéo}: ") Af questo == 1 and resposta b pontos = pontos + 4 ‘Uf questéo == 2 and resposta Pontos = pontos + 4 iF questo 3 and resposta pontos + 1 questéo + 1 (0 aluno fez {pontos} ponto(s)*) Execute o programa e digite todas as respostas corretas, depois tente com respos- tas diferentes. Veja que estamos verificando apenas respostas simples de uma s6 Tetra e que consideramos apenas letras miniisculas. Em Python, uma letra mints- cala é diferente de uma maitiscula. Se voc® digitar ‘A’ na segunda questo em vez de “a,.o programa nfo considerara essa resposta correta. Uma solugio para esse Gapitulo 5» Repetigia tipo de problema minGscula, Pores Exercico5.10 i maitisculas e ma Embora essa ver espaco em branay errada, Sempre controlado. Verems 5.2 Acumuladore Nem sé de contadil soma, por exempl tador e um acum «nos acumuladeat numeros. Nesse Gag while n <= 19: x= int(inpety sona = sone = 9 n=0+1@ print(F*sona: (sord Podemos definir as pela quantidade dey € 6, teriamos a méda ndimeros. Se chamang de n3, teremos (nl = Vejamos um progray usuario. Se chamamm assim sucessivamemay pee com resp les de um: ges letra min questo em¥ 0 para eS Repeticaes #9 Jplema ¢ utilizar 0 operador légico or e verificar a resposta maiiscula ¢ Ji, Por exemplo, questo = 1 and (resposta == "b" or resposta == "8') 5.10 Modifique o programa anterior para que aceite respostas com letras Jas € minisculas em todas as questOes essa verificagao resolva o problema, veremos que, se digitarmos um fem branco antes ou depois da resposta, ela também ser considerada Sempre que trabalharmos com strings, esse tipo de problema deve sex io. Veremos mais sobre o assunto no Capitulo 7. uladores ‘de contadores precisamos, Em programas para calcular 0 total de wm bor exemplo, precisaremos de acurnuladores. A diferenca entre um com ‘um acumulador é que nos contadores 0 valor adicionado € eomstante camuladores, varidvel. Vejamos um programa que calcule a soma de 10 Nese caso, sora @ é um acumulador en @ é um contador = 18: int(input(F*Diaite o {n) nisero:")) = soma + xO +10 (F"Sona: {sora)") 3s definir a média aritmética como a soma de varios mimeros divididos rntidade de ntimeros somados. Assim, se somarmos trés milmenos, 4 5 amos a média aritmética como (#+5+6) / 3,em que 3 €2 quantidade de = Se chamarmos o primeiro ntimero de nl, o segundo de n2,e@tereeiro teremos (nl + 2 +13) / 3. «um programa que calcula a média de cinco mimeros digitados pelo Se chamarmos 0 primeiro valor digitado de nl, o segundo de n2, ¢ sucessivamente, teremos que: bia = (nienrensendensys = Hbnet a tk £08 Introdugio & Programacao com Python — 3+ edigdo Em vez de utilizarmos cinco varidveis, vamos acumular 0s valores medida que sio lidos. Ant (input(F"{x} Digite o ninero:")) sora = soma +n @ kext print(f*Hédia: (sone / 5:5.2f)") © Nesse caso, temos x sendo um contador ¢ n o valor digitado pelo usuario. A varié- vel sona ¢ criada em @ ¢ inicializada com 0. Diferentemente de x, que recebe 1'a cada passagem, a varidvel soma, em @, € adicionada do valor digitado pelo usué- ria. Podemos dizer que o incremento de sona nao ¢ um valor constante, pois varia com 0 valor digitado pelo usuario. Podemos também dizer que sora acumula os valores de na cada repetiga. Logo, diremos que a variavel son é um acumulador. Acumuladores so muito interessantes quando nao sabemos ou no consegui- mos obter o total da soma pela simples multiplicagdo de dois mimeros. No caso do célculo da média, 0 valor de n pode ser diferente cada vez que o usuario digitar um valor. Erercido 5.11 Escreva um programa que pergunte o depésito inicial e a taxa de juros de uma poupanga, Exiba os valores més a més para os 24 primeiros meses, Escreva 0 total ganho com juros no perioda. Berdde 5.12 Altere o programa anterior de forma a perguntar também o valor depositado mensalmente, Esse valor sera depositado no inicio de cada més, e voce deve consideré-lo para o calculo de juros do més seguinte. Beerciio 5.13 Escreva um programa que pergunte o valor inicial de uma divida © juro mensal. Pergunte também o valor mensal que sera pago.Imprima o numero de meses para que a divida seja paga, 0 total pago e o total de juros pago. 5.2.1 Operadores de atribuico especiais Muitas vezes, teremos de escrever expressdes como x = x + 1ouy = y - 1, Para simplificar a escrita, a linguagem Python oferece operadores de atribuico espe- ciais como += ¢ -=. Esses operadores tém o mesmo significado de expressées com os sinais que o precedem. Por exemplo: Capitulo 5 = 5.3 Interras Embora mui cio de caday dentro do bil A instrugaol temente dow até que digig s=0 while Troe print(s) © Nesse exemgl 0 while execut constante, Exy ficamente qua continuaré ag executada, teq exibe o valord Erercicio 5.14 grama devel exiba a quam ticbes Tabela 51 ~ Operadores de atribuicdo especiais , Operador Exemplo | Equivaléncia +1 muito stil, a estrutura while s6 verifica sua condigdo de parada no int a repeti¢aa. Dependendo do problema, a habilidade de terminarwhile o bloco a repetir pode ser interessante. 0 break € utilizada para interromper a execugio de while independe: do valor atual de sua condigao. Vejamos o exemplo da leitura de valores digitemos 0 (zero) e True: © w= int input("Digite un ninero 2 sonar ou ® para satr Af v =o: break @ sv@ (5) © ‘exemplo, substituimos a condigio do whtle por True em @. Dessa forma. executara para sempre, pois 0 valor de sua condigio de parada (True) € te. Em @ temos a instrugio break sendo ativada dentro de um ¢f, especi- mnte quando v é zero. Porém, enquanto v for diferente de zero, a repetigao maré a somat v a s em @. Quando v for igual a zero (0), teremos @ sendo da, terminando a repeticao ¢ transferindo a execucao para @, que, ent&o, fo valor de s na tela. 05.14 Escreva um programa que leia niimeros inteiros do teclado. O pro- a deve ler os nimeros até que o usuario digite 0 (zero). No final da execugao, ‘a quantidade de niimeros digitados, assim como a soma e a média aritméti 2 Introdugao & Programagéo com Python - 3+ edo Exerddo 5.15. Escreva um programa para controlar uma pequena maquina registra- dora, Vocé deve solicitar ao usuario que digite o codigo do produto e a quantidade comprada. Utilize a tabela de cédigos a seguir para obter o prego de cada produto: Cédigo Prego Gdigo Prego 1 050 | = 700 | Bem) = [2 | an Seu programa deve exibir o total das compras depois que o usudrio digitar 0. Qualquer outro eédigo deve gerar a mensagem de erro “Cédigo invalido” ‘Vejamos como exemplo um programa que leia um valor e que imprima a quan- tidade de cédulas necessarias para pagar esse mesmo valor. Para simplificar, vamos trabalhar apenas com valores inteiros ¢ com cédulas de RS 50, RS 20, R$ 10, R$ Se R$L 4 Prograna 5.1 ~ Contagen de cédulas int(input("Digite o valor a pagar: apagar while Tr ‘f atual <= apager: apagar -= atual cédulas 421 else: print(F*{cédulas) cédula(s) de RS{atual}" 4F apagar break if atual atual = 28 elif atual atual elif atual atual elif atual atual cédulas = 0 5.4 Rep Podemey comoag das dem tabuadl while ce a En Oe valor des ninero deg multiplig © segundl repetigoes © enquat += para me © resules Em @ im a condiga , reine que possd tabuadag G6 Execute o Programa Si para os seguintes valores: 501, 745,384, D7 0 que acontece se digitarmos 0 (zero) no valor a pagar? 48 Modifique o programa para também trabalhar com notas de RS 100 49 Modifique o programa para aceitar valores decimais, ou seja, tam: tar moedas de OI, 02, 005, 010 € 050. $5200 que acomtece se digitarmos 0/901 no programa anterior? Caso ele cone, altere-o de forma a corrigir o problenia. ‘ides aninhadas combinar varios while de forma a obter resultados mais interessantes, Iepeticao com incremento de duas variaveis. Imagine imprimir as tabua- smultiplicacdo de 1 a 10. Vejamos como fazer isso: 21 tabuada < 18: © pire = 1 Wuhile ninero eo print(F*{tabuada) x {ninero} = {tabvada * niero}") agmero += 1 @ seats += 1 © temos nosso primeiro vhtle, criado para repetir seu bloco enquanto 0 ide tabuada for menor ou igual a 10, Em @ temos a inicializacao da variavel dentro do primeiro whtle. Isso é importante porque precisamos voltar a Ficar por 1 a cada novo valor da variavel tabvada, Finalmente, em @ temos mado while com a condigio de parada ninero < 10, Esse while executars suas Ses dentro do primeiro, ou seja, o ponto de execugio passa de @ para mnanto a condigio for verdadeira. Veja que em © utilizamos o operador a representar ninero = ninero + 1. Quando ninero valer Il, a condigio ex tard falsa, e a execugdo do programa continuard a partir da linha incrementamos o valor de tabuada ¢ voltamos a @, onde sera verificada digdo do primeiro white, Como resulta verdadeito, voltaremos a executar ‘nicializando a variivel ninero com o valor 1. @ é muito importante para ppossamos novamente executar 0 segundo while, responsavel por imprimir a ida na tela 4 Introdugéo & Programacéo com Python ~ 3 edigdo Capitulo 5 © Reps Yejamos o mesmo problema, mas sem utilizar repetigoes aninhadas: 5.5 F-Strings tabuada = 1 JA utilizamos aivero = 1 F-Strings foram while tabvada < 10: Fi substituir o val print(f*{tabuada} x (ninero} = {tabuada * ninero}") Zl | tt: >e> print( 1 ALD mundo 4 niner rivera ‘tabuada t= 1 Em que fale { Vocé pode tas Exercido521_Reescreva o Programa 5il de forma a continuar executando até que 0 apés o nomed valor digitado seja 0, Utilize repetigies aninhadas nee rercio5.22 Escreva um programa que exiba uma lista de opgbes (menu): adigao, >>> F'Precos subtragio, divisio, multiplicagio e sair. Imprima a tabuada da operacio escolhida. oe Repita até que a opcio saida seja escolhida ooo frre Brerdido 5.23 Escreva um programa que leia um niimero e verifique se € ou no Preco: ‘um mimero primo, Para fazer essa verificagao, calcule o resto da divisao do nimero >>> F"recos | por 2 depois por todos os miimeros impares até o nfimero lido. Se a resto de uma Prego: RS dessas divisbes for igual a zero, o ntimero nao € primo, Observe que 0 € I ndo saa >>> FPrecoz| primos e que 2 € 0 tinico mimero primo que é par. Prego: AS5.28 Ererddo 5.24 Modifique © programa anterior de forma a ler um nimero a, Voce também j Imprima os n primeiros ntimeros primos. a0 centro: Exerciio 5.25 Escreva um programa que calcule a raiz quadrada de um mimero. po» FPrecos§ Usilize © método de Newton para obter um resultado aproximado. Sendo n o hoa es numero a obter a raiz quadrada, considere a base b=2. Calcule p usando a formula a p=(b+(n/b))/2 Agora, calcule o quadrado de p. A cada passo, faca b=p € recalcule n> Procell p usando a férmula apresentada. Pare quando a diferenca absoluta entre n ¢ 0 Preco: RS5.28 quadrado de p for menor que 00001 >> fPreco: 4 Preco: RS Ererdcio 5.26 Escreva um programa que calcule o resto da divisio inteira entre dois nimeros. Utilize apenas as operagGes de soma e subtracio para calcular 0 E também espe resultado, 0s em brance: Exercico 5.27 Escreva um programa que verifique se um nimero é palindroma. o> f"Preco: # Um ntimero é palindromo se continua o mesmo caso seus digitos sejam invertidos. Preco: RS,..5 Exemplos: 454, 10501 >>> f"Preco: & Preco: PSoa, boo f*Preco: & Preco: R§_5. gedo até que O Seen): adigio, Bao escolhida, gee se € ou nO S30 do nimero pesto dew ge ¢ 1 nio si0 fam niimero 9 de am mamero mado. Sendo n o sando a formula Bhp c recalcule gata enwre n€ © SsSo inteira entre j para calcular © geo € palindrome. jsejam invertidos. mos F-Strings para compor strings, mas vamos revisitar o assunto. foram introduzidas na versio 36 do Python. Com essa sintaxe, é possivel iro valor de uma varidvel ou expresso dentro de uma string. Por exemplo: i = "mundo" print Frats (3)") ppundo #10 {2)" € equivalente a "Al6 Xs" % 8ou *ALS {}".Fornat(2). lc também formatar {strings especificando 0 mimero de caracteres nome da varidvel e dos dois pontos. Exemplo: preco = 5.20 FrPreco: {prego:5.2f}" 5.28 FPrecor (oreco:10.2F}" Fereco: RS{preco:10.2F1 RS 5.28 FrPreco: RS{preco: .2F} = R5.28 mbém pode usar >, <¢ * para alinhar os valores a esquerda, a direita ou FrPreco: RE(preco:>10.2F}" RS 5.28 FPreco: R§{preco:<10.2F] S528 Fpreco: RS{preco:*10.2F}!" Rs 5.20 | ém especificar qual caractere deve ser utilizado para preencher branco: FPreco: RS{preco:."18.2F}: go: RS...5.20...! FPreqo: RS(preso:x%40.2F)!" 9: RS 0S. 26K! reco: RS{oreco:_*18.2F)!" RS_5.20__! 6 Introdugdo 8 Programacao com Python ~ 3*edicdo sa nova forma de escrever € tao poderosa que voce pode até chamar fungdes dentro da string: 1 >>> FInteiro: {int(x)} “nteiro: 5! ‘Assim como realizar operagies matematicas >>> fPreco: RBforeco * 18:5.2F)!" Prec: R$52.88! E-strings também funcionam com strings de miiltiplas linhas, usando-se as aspas triplas prefixadas com a letra f: ae f 0 prego do novo produto é: RS{preso:5.2f}. E pode ser encontrado nas nelhores Lojas do rano "\n0 preso do novo produto &: RS 5.28.\nE pode ser encontrado nas melhores Lojas do rano.\n" Observe que as linhas foram representadas com \n. Esta combinagdo de carac- teres € utilizada para representar uma quebra de linha e vocé pode utiliza-la.em suas strings >>> a = "prineira Linhalnsegunda Unhalntercetra Linha” ‘prineira Linha\nsegunda Unhaoterceira linha! >>> print(a) prineira Uinha segunda Vinha tercetra Una [TZ NOTA: Qual formato voc’ deve utilizar depende da sua aplicogtio. Se vocé trabalho com Python 3.6 ou superior, utilize Fstrings. Se seu programa precisa rodar em outros versées de Python, anteriores 6 versto 3.6, ullize fornat. A vllzagdo de formatacgéo com % vem caindo em desuso, embore continue vélida Listas sio um acessados por mesmo tipo nho de uma Podemos innag Teo é o andarj utilizado para) Em um prédag Se chamarmag jeomo enderey ® seria 0 nome Listas sio mam Bejamos coma 1 sa linha cei Is colchetes ff a. Vejamos4 7-5, 88 lista Z foi era 3. Como

You might also like