Baixe o app para aproveitar ainda mais
Prévia do material em texto
Universidade Federal de Ouro Preto Instituto de Ciências Exatas e Biológicas Departamento de Computação BCC701 Programação de Computadores I Semestre: 2020-02 Aula Prática – Estrutura de Repetição (FOR) Pré-requisitos: • Estar familiarizado com o conteúdo das aulas anteriores e ter realizado as tarefas correspondentes. • Ler a seção 6.2 do livro texto da disciplina. • Assistir os v́ıdeos e/ou aulas teóricas correspondentes. Resumo: • O primeiro comando em Python para implementar repetição (ou laço) apresentado foi o while, que serve para executar um bloco de comandos enquanto uma dada condição for verdadeira. • Com o while podemos representar qualquer laço de repetição, mas devemos nos lembrar de tomar alguns cuidados para que tudo ocorra bem. • Para simplificar a construção de alguns tipos de laços, e diminuir a possibilidade de ocorrência de erros, foi disponibilizado o laço for. • Com o laço for você pode realizar repetições baseadas em um contador, definindo: valor inicial, valor final (exclusive) e valor de incremento, através da função range (o Python fornece outras opções, que não utilizaremos no curso). • Juntando o for com o range temos a seguinte sintaxe: 1 print("início do programa") 2 for x in range(0, 10, 2): 3 print(f’Dentro do laço, x = {x}’) 4 print("fim do programa") onde: – for e in são palavras reservadas obrigatórias, assim como o “:” no final da linha 2; – x é uma variável dita contadora, cujos valores são controlados internamente, você não precisa iniciar nem incrementar esta variável. Você pode dar o nome que quiser para ela, x é só um exemplo. – range(0, 10, 2) define quais valores o x vai receber em cada iteração, começando por 0 (ińıcio), terminando em 10, exclusive (final), e incrementando x de 2 (passo ou incremento). Você pode definir os valores que precisar, 0, 10 e 2 são apenas exemplos. Neste caso, x vai assumir os valores: 0, 2, 4, 6 e 8, um deles para cada iteração do laço, nesta ordem. – Caso o incremento seja 1, algo muito comum em programação, pode-se usar: range(0, 10). Neste caso x assumiria os valores 0, 1, 2, 3, ..., e 9. – No caso de o inicial ser 0 e o incremento ser 1, também muito comum, pode-se usar: range(10). Neste caso x assumiria os valores 0, 1, 2, 3, ..., e 9. • Nesta prática a intenção é reforçar seus conhecimentos em todos estes recursos e praticar sua utilização na construção de programas que resolvam algum problema espećıfico. Se você não está familiarizado com os itens listados acima, consulte os pré-requisitos da prática, listados no ińıcio desta página. 1 Tarefa 1: Escolhendo entre FOR e WHILE Como vimos, o laço for foi criado para laços que podem ser controlados por um contador, definido por: valor inicial, valor final (exclusive) e valor de incremento. Qualquer laço for pode ser também representado por um laço while. Porém, toda vez que você for capaz de definir os atributos de um contador, utilize o for. Isto porque com ele você não vai precisar se preocupar com o controle da variável contadora, evitando cometer erros muito comuns neste tipo de situação, como se esquecer de iniciar o valor antes do laço, ou incrementar o valor dentro do laço. Veja o programa a seguir, utilizado anteriormente na prática sobre while. O programa imprime todos os números gerados a partir da entrada fornecida pelo usuário. Por exemplo, se o valor fornecido for 5, imprime: 0, 1, 2, 3, 4, 5. O programa valida a entrada para aceitar apenas números positivos maiores que zero. 1 n = int(input("Digite um número: ")) 2 i = 0 # valor inicial do contador 3 while n < 1: 4 n = int(input("Digite um número: ")) 5 while i <= n: # repetição que pode ser controlada por contador 6 print(i) # imprime o contador 7 i = i + 1 # incremento do contador Os números impressos no terminal seguem um padrão de contagem. Marcamos com comentários os recursos necessários para fazer a contagem e a impressão do número no terminal. Veja a seguir, uma versão do programa usando for: 1 n = int(input("Digite um número: ")) 2 while n < 1: 3 n = int(input("Digite um número: ")) 4 for i in range(n+1): 5 print(i) # imprime o contador Bem mais fácil não é mesmo? Além de mais compacto, o risco de cometer um erro é bem menor. Algumas observações importantes: • Não precisamos inicializar a variável contadora: i = 0; • Não precisamos nos preocupar com a condição lógica: i <= n; • Não precisamos nos preocupar com o incremento do contador: i = i + 1; • Fizemos tudo isso apenas definindo: range(n+1): – Como o valor inicial é 0 e o incremento é 1, não precisamos defini-los no range. – Somar 1 a n para definir o valor final é necessário, pois o range não inclui o valor final e, neste caso, queremos que n seja inclúıdo. Implemente os programas anteriores no Thonny e execute com o depurador para entender perfeitamente o que cada um deles faz em detalhes. 2 Tarefa 2: Contador regressivo e algumas situações interessantes Os exemplos vistos anteriormente mostram apenas situações em que o incremento é positivo. Muitas vezes o contador precisa ser decrementado. Para isso, basta definir um passo negativo. Por exemplo, suponha que você deseja resolver a seguinte equação: X = 1 N + 1 N − 2 + 1 N − 4 + 1 N − 6 + ... para todos os denominadores maiores do que 0. Observe que o denominador é definido por um padrão de contagem para os termos do somatório. Assim, seu programa pode ficar assim: 1 N = int(input("Digite N: ")) 2 X = 0 3 for den in range(N, 0, −2): 4 X += 1 / den 5 print(f’X = {X}’) O laço for foi utilizado não apenas para providenciar o somatório acumulativo de cada termo, mas também para que sua variável contadora represente o denominador. Implemente este programa no Thonny e execute utilizando o depurador para entender perfeitamente o que ele faz em detalhes. Agora observe algumas situações bastante interessantes. Veja o que acontece quando você fornece um valor menor ou igual a 0. Percebeu que o laço for não executará nenhuma vez o bloco de comandos? Isso acontece porque o valor inicial é menor ou igual ao valor final, com um incremento negativo, o valor final jamais seria atingido, o que provocaria um laço infinito. O mesmo ocorreria se o incremento fosse positivo, mas o valor inicial fosse maior ou igual ao final. Experimente estas situações depurando a execução no Thonny e uma outra situação interessante: execute um laço for com um incremento de valor 0. 3 Tarefa 3: Dois contadores – um laço Suponha que agora você precise fazer um cálculo parecido com o anterior, resolvendo a seguinte equação: X = 1 N + 2 N − 2 + 3 N − 4 + 4 N − 6 + ... Muitos programadores iniciantes tentam resolver este problema desta forma: 1 N = int(input("Digite N: ")) 2 X = 0 3 for num in range(1, N): 4 for den in range(N, 0, −2): 5 X += num / den 6 print(f’X = {X}’) Este programa está errado, pelos seguintes motivos: • Temos um problema de somatório, que demanda apenas um laço, pois a tarefa é somar cada termo do somatório de forma iterativa. • A relação entre o numerador e o denominador não é corretamente expressa pelos dois range’s. Mesmo que fosse posśıvel usar dois laços for para fazer este processamento, o programa provavelmente continuaria errado. Teŕıamos que usar algo parecido com range(1, N/2), mas precisaŕıamos avaliar esta definição com cuidado. Existem mecanismos mais avançados em Python que poderiam até resolver o problema. Porém, com os recursos que apresentamos até agora é perfeitamente posśıvel implementar um programa correto. Para isso, basta escolher entre o numerador ou denominador para ser utilizado como contador do laço, e criar uma nova variável, controlada por você, para representar o outro componente do termo do somatório. Veja um programa que resolve o problema corretamente: 1 N = int(input("Digite N: ")) 2 X = 0 3 num = 1 4 for den in range(N, 0,−2): 5 X += num / den 6 num += 1 7 print(f’X = {X}’) Escolhemos o denominador para ser controlado pelo laço, pois ele naturalmente determinará a quantidade de termos para o somatório. Controlamos os valores do numerador conforme ele deve acompanhar os valores do denominador. E mais, utilizamos apenas um laço para fazer o somatório, manipulando corretamente cada numerador e denominador que gera o termo em cada iteração. Implemente este programa no Thonny e execute utilizando o depurador para entender perfeitamente o que ele faz em detalhes. 4 Questão 1 A constante π pode ser computada por meio da seguinte equação: π = ∞∑ n=0 (−1)n × 4 2× n+ 1 , e o volume de uma esfera é dada pela equação: V = 4 3 × π × r3. Crie um programa que compute a constante π por meio da série indicada acima, mas considerando um número de termos (inteiro), fornecido pelo usuário. Utilize o valor de π obtido pela série para calcular o volume de uma esfera de raio r (inteiro), também fornecido pelo usuário. Considere que os valores fornecidos pelo usuário são sempre válidos. Como sáıda, o programa deverá exibir o valor obtido de π e o volume da esfera, ambos com 5 casas decimais. Você deve implementar e usar a função realizaCalculos, que recebe o número de termos e o valor do raio da esfera como argumentos de entrada, calula o valor de π e o volume da esfera e retorna os dois valores calculados. Exemplo 1: Número de termos: 10 Raio da esfera: 5 pi = 3.04184. Volume da esfera = 506.97327. Exemplo 2: Número de termos: 10000 Raio da esfera: 5 pi = 3.14149. Volume da esfera = 523.58211. Exemplo 3: Número de termos: 10 Raio da esfera: 3 pi = 3.04184. Volume da esfera = 109.50623. 5 Questão 2 A CBF te contratou para fazer um programa para calcular as estat́ısticas de um juiz em várias partidas do Campeonato Brasileiro. No ińıcio, o programa lê o nome do juiz e a quantidade de partidas em que ele atuou. Em seguida, ele lê um conjunto de informações quantitativas sobre cada partida: impedimentos, faltas marcadas, cartões aplicados e o tempo de acréscimo (em minutos). Todos estes valores são inteiros, exceto o tempo, que é real. Ao final, o programa calcula e imprime a média de cada informação, com duas casas decimais de precisão. Implemente o programa seguindo o padrão dos exemplos a seguir. Considere que as entradas são sempre válidas, ou seja, não é preciso fazer verificações sobre os dados de entrada. Exemplo 1: Informe o nome do juiz: Arnaldo César Coelho Quantidade de partidas: 1 Partida 1: . Impedimentos.......: 8 . Faltas.............: 13 . Cartões............: 2 . Tempo de acréscimo.: 6 Estatísticas do juiz Arnaldo César Coelho: . Impedimentos.......: 8.00. . Faltas.............: 13.00. . Cartões............: 2.00. . Tempo de acréscimo.: 6.00. Exemplo 2: Informe o nome do juiz: Carlos Eugênio Simon Quantidade de partidas: 3 Partida 1: . Impedimentos.......: 6 . Faltas.............: 13 . Cartões............: 3 . Tempo de acréscimo.: 6.7 Partida 2: . Impedimentos.......: 8 . Faltas.............: 15 . Cartões............: 3 . Tempo de acréscimo.: 9.3 Partida 3: . Impedimentos.......: 6 . Faltas.............: 18 . Cartões............: 7 . Tempo de acréscimo.: 15 Estatísticas do juiz Carlos Eugênio Simon: . Impedimentos.......: 6.67. . Faltas.............: 15.33. . Cartões............: 4.33. . Tempo de acréscimo.: 10.33. 6 Questão 3 Você faz parte do grêmio estudantil de qúımica da UFOP e pretende substituir o sistema de votação em papel por um sistema de eleição eletrônica. Para isso, você deve desenvolver um programa que receba dados de 2 candidatos (nome e número), a quantidade de eleitores e, em seguida, iniciar a votação. Se a quantidade de eleitores for inferior a 3, você deve informar ao usuário que esta quantidade é inválida e solicitar um novo número de eleitores. Para a votação, o programa deverá perguntar em qual candidato cada eleitor deseja votar. Após o término da votação, seu programa deve imprimir o resultado da apuração, contento o percentual de votos válidos e inválidos, além dos percentuais de cada candidato sobre os votos válidos, conforme os exemplos a seguir. Note que todos os valores percentuais estão com 2 casas decimais. Implemente e use a função realizaVotacao, que recebe como argumento de entrada a quantidade de eleitores, e faz o seguinte: 1. Imprime a mensagem de votação iniciada; 2. Faz a leitura de todos os votos, contabilizando votos válidos, inválidos, para o candidato 1 e para o candidato 2; 3. Imprime a mensagem de votação encerrada; 4. Retorna os 4 contadores de votos (válidos, inválidos, candidato 1 e candidato 2). Sendo assim, o programa principal faz as entradas iniciais, chama a função para realizar a votação, recebe os resultados da função, calcula os valores percentuais e imprime o resultado final. Exemplo 1: Digite o nome do candidato 1: Nióbio Digite o número do candidato 1: 41 Digite o nome do candidato 2: Ítrio Digite o número do candidato 2: 39 Digite a quantidade de eleitores: −1 A quantidade de eleitores é inferior a 3 Digite a quantidade de eleitores: 2 A quantidade de eleitores é inferior a 3 Digite a quantidade de eleitores: 4 ## Votação Iniciada Digite o número do candidato que você deseja votar: 41 Digite o número do candidato que você deseja votar: 41 Digite o número do candidato que você deseja votar: 41 Digite o número do candidato que você deseja votar: 50 ## Votação Encerrada Votos válidos: 75.00% (3 votos) Votos inválidos: 25.00% (1 votos) Votos para Nióbio: 100.00% (3 votos) Votos para Ítrio: 0.00% (0 votos) 7 Exemplo 2: Digite o nome do candidato 1: Silício Digite o número do candidato 1: 14 Digite o nome do candidato 2: Bromo Digite o número do candidato 2: 35 Digite a quantidade de eleitores: 1 A quantidade de eleitores é inferior a 3 Digite a quantidade de eleitores: 3 ## Votação Iniciada Digite o número do candidato que você deseja votar: 14 Digite o número do candidato que você deseja votar: 35 Digite o número do candidato que você deseja votar: 17 ## Votação Encerrada Votos válidos: 66.67% (2 votos) Votos inválidos: 33.33% (1 votos) Votos para Silício: 50.00% (1 votos) Votos para Bromo: 50.00% (1 votos) 8
Compartilhar