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: 2021-01 Aula Prática – Estrutura de Repetição: WHILE Pré-requisitos: • Estar familiarizado com o conteúdo das aulas anteriores e ter realizado as tarefas correspondentes. • Ler a introdução do caṕıtulo 6 e a seção 6.1 do livro texto da disciplina. • Assistir os v́ıdeos e/ou aulas teóricas correspondentes. Resumo: • O conceito de repetição ou laço (em inglês, loop) é usado para realizar tarefas de forma repetitiva, ou seja, executar uma série de comandos um determinado número de vezes ou enquanto uma dada condição for verdadeira. • O primeiro recurso que veremos em Python para implementar laços é o while, que serve para realizar um conjunto de tarefas enquanto uma dada condição for verdadeira. while é um termo do inglês que significa enquanto. • Como mostrado abaixo, a sintaxe do comando while envolve a definição de uma condição que, en- quanto verdadeira, determinará a repetição e execução do bloco de comandos (no exemplo, composto por print(x) e x+=1). 1 print("início do programa") 2 x = 0 3 while x < 10: 4 print(f’Dentro do laço, x = {x}’) 5 x += 1 6 print("fim do programa") • É importante ter muito cuidado na definição da condição do while e na manipulação dos valores que influenciam esta condição. – Quando a condição resulta inicialmente em True e o bloco de comandos não tem recursos para alterar esta condição, o programa fica em laço infinito, ou seja, nunca termina sua execução, fica repetindo o bloco de comandos infinitamente. – Por outro lado, quando a condição resulta inicialmente em False e nenhum comando anterior ao laço tem condição de alterar esta condição em execuções diferentes do programa, o bloco de comandos nunca será executado. • O while será importante para resolver uma série de problemas em programação. Durante as práticas encontraremos problemas de diferentes tipos: teste de validade da entrada, múltiplas execuções dentro do mesmo programa, contador e somatório, uso de flag, até problemas de séries mais simples. • 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: Validação de Entrada Em muitos programas é solicitado que o usuário seja forçado a fornecer uma entrada válida. Nestes casos, o algoritmo não se trata apenas de validar, mas de continuar solicitando um valor enquanto ele for inválido. Conforme o algoritmo a seguir: 1 ... 2 x = entrada de um valor 3 enquanto x é inválido: 4 informe que o valor é inválido e que solicitará outro 5 x = entrada de um valor 6 ... Observe que, neste caso, é necessário utilizar o laço while. Primeiro pede-se o valor, depois o laço faz a validação. A condição deve resultar em verdadeiro caso o valor de x seja inválido. O bloco de comandos do while apenas informa que o valor é inválido e solicita um novo valor. A mensagem informando valor inválido é opcional. Com base nisso, veja o exemplo de um programa que 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 3 while n < 1: 4 n = int(input("Digite um número: ")) 5 while i <= n: 6 print(i) 7 i = i + 1 Note que o programa só para de solicitar um número se o usuário digitar um valor maior que zero, linhas 1 a 4, seguindo o algoritmo anterior, mas sem mensagem de erro. Depois, linhas 5 a 7, é apenas realizado o processamento do programa, que consiste em imprimir todos os números no terminal. Observe que, para isso, é necessário utilizar outro laço while. Não confunda, ou misture, as coisas, um laço foi para fazer a validação, e o outro para fazer o processamento. Eles são sequenciais, um após o outro, pois o processamento só será realizado após o valor válido ser lido adequadamente. 2 Tarefa 2: Estado Civil Faça um programa que leia e valide as seguintes informações: 1. Nome: maior que 3 caracteres (use a função len(texto) para obter o número de caracteres do texto); 2. Idade: entre 0 e 150; 3. Salário: maior que zero; 4. Sexo: f ou m; 5. Estado Civil: s, c, v, d; O algoritmo recebe como entrada 5 dados: nome, idade, salário, sexo e estado civil. Você precisa criar 5 variáveis para salvar os dados informados pelo usuário. A questão possui várias validações de dados, por exemplo, nome com mais de 3 caracteres. O while pode ser utilizado para validar cada um dos 5 dados. O código irá encerrar o laço de repetição (while) somente quando a condição para cada um dos dados for satisfeita. No caso da idade, temos que ela não pode ser negativa e nem maior do que 150 anos. Se isso acontecer, o algoritmo solicita os dados novamente e encerra apenas quando a condição for satisfeita (linhas 5 a 7). 1 nome = solicite o nome da pessoa 2 enquanto nome menor ou igual a três 3 nome = solicite o nome novamente 4 5 idade = solicite a idade da pessoa 6 enquanto idade menor ou igual zero ou superior a 150 anos: 7 idade = solicite a idade novamente 8 9 salario = solicite o salario da pessoa 10 enquanto salario negativo 11 salario = solicite o salário novamente 12 13 sexo = solicite o sexo da pessoa 14 enquanto sexo diferente de masculino ou feminino 15 sexo = solicite o sexo novamente 16 17 civil = solicite o estado civil da pessoa 18 enquanto estado civil diferente de solteiro, divorciado, casado e viúvo: 19 civil = solicite o estado civil novamente Veja que cada informação é validada individualmente, o que determina a utilização de 5 (cinco) laços. 3 O programa que implementa este algoritmo em python é apresentado a seguir. 1 nome = input("Qual seu nome [mínimo 4 caracteres]: ") 2 while len(nome) <= 3: 3 nome = input("Seu nome deve ter mais que 3 caracteres: ") 4 5 idade = int(input("Sua idade: ")) 6 while idade < 0 or idade > 150: 7 idade = int(input("Voce deve ter entre 0 e 150 anos: ")) 8 9 salario = float(input("Salário: ")) 10 while salario < 0: 11 salario = float(input("A coisa ta difícil, mas não tem salário negativo: ")) 12 13 sexo = input("Sexo (’f’ para feminino ou ’m’ para masculino): ") 14 while sexo != ’f’ and sexo != ’m’: 15 sexo = input("Biologicamente, você deve ser ’f’ ou ’m’: ") 16 17 civil = input("Estado civil (s, c, v ou d): ") 18 while civil != ’s’ and civil != ’c’ and civil != ’v’ and civil != ’d’: 19 civil = input("Estado civil deve ser s, c, v ou d: ") Observe que situações que envolvem mais de uma condição são constrúıdas com expressões relacionais ligadas pelos operadores lógicos or ou and. Como por exemplo: do algoritmo idade menor ou igual zero ou superior a 150 anos foi implementado pela condição idade < 0 or idade > 150, ou seja, temos duas expressões relacionais completas, idade < 0 e idade > 150 ligadas, é comum cometer o erro de tentar construir a condição de forma incompleta, idade < 0 or > 150, que é um erro de sintaxe. O mesmo acontece na validação do estado civil, que no caso é composto por quatro condições ligadas: civil != ’s’, civil != ’c’, civil != ’v’ e civil != ’d’. Mais uma vez tivemos que construir expressões relacionais completas, para não gerar erro de sintaxe. Um erro muito comum é também confundir a comparação com uma string, fazendo civil != s ao invés de civil != ’s’. Sem as aspas na primeira expressão compara- se duas variáveis, com as aspas na segunda expressão compara-se a variável civil com o valor textual ’s’, que é o que realmente desejamos fazer. 4 Questão 1 Uma indústriade tubos de aço possui uma máquina para cortar tubos em sua linha de produção. A máquina de corte será controlada pelo seu programa, que verifica se os comprimentos dos tubos cortados estão dentro de uma determinada margem de erro, em relação ao comprimento desejado. Os tubos com comprimento inadequado são rejeitados. No ińıcio da operação da máquina, são especificados o comprimento desejado para os tubos (número real), a margem de erro aceitável (número real) e a quantidade de tubos demandada (número inteiro). Para cada tubo cortado, seu comprimento é fornecido como entrada no programa, que avalia se ele está dentro da margem de erro aceitável, rejeitando ou aceitando o mesmo. A operação da máquina deve parar quando tiver sido obtido o número de tubos demandados, com comprimentos dentro da margem de erro especificada. Ao final da operação da máquina, o programa imprime o total de tubos cortados e o número de tubos rejeitados, tal como mostrado no exemplo de execução do programa, a seguir. Para avaliar se o tubo está na margem de erro, você deve implementar e usar a função avaliaTubo, que recebe como entradas o comprimento do tubo, o comprimento de corte desejado e a margem de erro aceitável, ela faz a verificação e retorna True caso o tubo seja aceito e False caso ele seja rejeitado. Exemplo 1: Comprimento de corte dos tubos: 10 Margem de erro aceitável: 0.2 Quantidade de tubos demandada: 3 Comprimento do tubo cortado: 9.7 Acima da margem de erro, tubo rejeitado Comprimento do tubo cortado: 9.9 Comprimento do tubo cortado: 10.3 Acima da margem de erro, tubo rejeitado Comprimento do tubo cortado: 10 Comprimento do tubo cortado: 10.2 Fim da produção, demanda atendida. Total de tubos cortados: 5 Total de tubos rejeitados: 2 Exemplo 2: Comprimento de corte dos tubos: 25 Margem de erro aceitável: 3 Quantidade de tubos demandada: 3 Comprimento do tubo cortado: 24 Comprimento do tubo cortado: 28 Comprimento do tubo cortado: 25.8 Fim da produção, demanda atendida. Total de tubos cortados: 3 Total de tubos rejeitados: 0 5 Questão 2 Você foi contratado por uma empresa qúımica que precisa resolver algumas fórmulas matemáticas para desenvolver produtos qúımicos. Você foi o escolhido para encontrar o fatorial de um número. Calcular o fatorial de um número só faz sentido quando estamos trabalhando com números naturais. Essa operação é bastante comum na análise combinatória, facilitando o cálculo de arranjos, permutações, combinações e demais problemas envolvendo contagem. O fatorial é representado pelo śımbolo “!”. Definimos como n! (n fatorial) a multiplicação sucessiva de n por todos os seus antecessores até chegar em 1. A equação do fatorial pode ser definida como: n! = n × (n − 1) × (n − 2) × ... × 3 × 2 × 1. Observe que o número definido é sempre inteiro, mas, o programa “força” a entrada de um número maior do que 0 (zero). Para resolver este problema você deve implementar e usar a função Fatorial, que recebe como argumento o valor de n, calcula e retorna o valor de n!. Exemplos de execução a seguir. Exemplo 1: Informe o número que deseja calcular o Fatorial: −2 Número inválido, defina outro: 4 O Fatorial de 4 é: 24 Exemplo 2: Informe o número que deseja calcular o Fatorial: 0 Número inválido, defina outro: 5 O Fatorial de 5 é: 120 Exemplo 3: Informe o número que deseja calcular o Fatorial: −5 Número inválido, defina outro: −2 Número inválido, defina outro: 0 Número inválido, defina outro: 6 O Fatorial de 6 é: 720 Exemplo 4: Informe o número que deseja calcular o Fatorial: 7 O Fatorial de 7 é: 5040 Exemplo 5: Informe o número que deseja calcular o Fatorial: 1 O Fatorial de 1 é: 1 6 Questão 3 Você empresta dinheiro com cobrança de juros simples, que é calculada da seguinte forma: J = C × t×m, onde: J é o valor dos juros devido; C é o capital emprestado; t é a taxa de juros do peŕıodo; e m é a quantidade de meses para quitação da d́ıvida. A taxa de juros depende do capital emprestado: para valores menores ou iguais a R$ 10.000,00, a taxa de juros é de 10% ao mês (ou seja, t = 0, 1), já para valores maiores do que R$ 10.000,00, a taxa de juros é de 7% ao mês (ou seja, t = 0, 07). Implemente um programa que receba inicialmente o valor de capital total (T , real) que você possui para fazer empréstimos. Em seguida, você vai realizar empréstimos enquanto tiver capital total suficiente. A cada empréstimo realizado você recebe duas entradas: C (real) e m (inteiro); e determina a taxa de juros t, levando em consideração o valor do capital emprestado, calcula o valor de juros devido e imprime a taxa de juros aplicada (valor percentual, com 0 casas decimais), o juros devido calculado (J , com 2 casas decimais) e o valor total da d́ıvida (soma do capital emprestado e o juros devido, também com 2 casas decimais). Ao final de cada empréstimo, você atualiza seu capital total (T = T − C). O programa encerra no momento exato em que um valor do capital total T for insuficiente para fornecer o empréstimo pretendido C, imprimindo uma mensagem de encerramento com o capital total final (com duas casas decimais). Observe que, neste caso, o empréstimo é negado, m não é solicitado, e o programa é encerrado. Para resolver este problema você deve implementar e usar a função calculaJ, que recebe como argumentos os valores de C e m, calcula e retorna o valor de J e o valor da taxa de juros aplicada (10 ou 7). Exemplos de execução a seguir. Exemplo 1: Capital Total para empréstimo: 10000 Capital emprestado: 20000 Empréstimo negado, capital total é de R$ 10000.00. Exemplo 2: Capital Total para empréstimo: 20000 Capital emprestado: 9001 Quantidade de meses para quitação: 4 Taxa de juros aplicada: 10%. Juros devido: 3600.40. Valor total: 12601.40. Capital emprestado: 10104 Quantidade de meses para quitação: 3 Taxa de juros aplicada: 7%. Juros devido: 2121.84. Valor total: 12225.84. Capital emprestado: 5643 Empréstimo negado, capital total é de R$ 895.00. Exemplo 3: Capital Total para empréstimo: 1250 Capital emprestado: 1250 Quantidade de meses para quitação: 5 Taxa de juros aplicada: 10%. Juros devido: 625.00. Valor total: 1875.00. Capital emprestado: 1 Empréstimo negado, capital total é de R$ 0.00. 7 Questão 4 Seja n um número inteiro positivo. Dizemos que n é perfeito se ele for igual à soma de seus divisores inteiros positivos, com exceção do próprio n. Por exemplo: Os divisores de 6 são {1, 2, 3, 6}. Logo 6 é perfeito, pois 1 + 2 + 3 = 6. Implemente um programa que solicite diversos valores inteiros para n e verifique se cada um deles é perfeito. O programa deve admitir entradas do usuário enquanto os valores forem maiores que zero. Para resolver este problema você deve implementar e usar a função verificaPerfeito, que recebe como argumento o valor de n, verifica e imprime a mensagem de sáıda indicando se o valor é perfeito ou não, e não retorna nada. Siga o padrão de entrada e sáıda apresentado nos exemplos a seguir. Exemplo 1: Digite um número: 10 10 <> 8: número não é perfeito Digite um número: 6 6 == 6: número é perfeito Digite um número: −1 Exemplo 2: Digite um número: 8128 8128 == 8128: número é perfeito Digite um número: 8130 8130 <> 11454: número não é perfeito Digite um número: 496 496 == 496: número é perfeito Digite um número: 6 6 == 6: número é perfeito Digite um número: 0 Exemplo 3: Digite um número: 200 200 <> 265: número não é perfeito Digite um número: −200 Exemplo 4: Digite um número: 0 8
Compartilhar