Post on 03-Dec-2018
Programação de Computadores
Instituto de Computação UFFDepartamento de Ciência da Computação
Otton Teixeira da Silveira Filho
Conteúdo
● Exercícios e implementação de algoritmos:
Número capicua
Constante de Kaprekar
Números primos: algoritmo direto, Crivo de Eratóstenes
● Alguns aspectos adicionais no for e no print()
else, break e continue
● Exercícios propostos
Observação
Observe que nenhum programa deste material tem por finalidade ser eficiente, inteligente ou referência de qualidade de desenvolvimento
A intenção está no aprendizado de construção de algoritmos, implementação de algoritmos e apresentar conceitos e elementos de Python
Número capicua
Determine se um número é capicua
Número capicua
Melhor dizer o que é um número capicua...
Número capicua
Um número é capicua (ou número palíndromo) se o seu reverso é ele próprio.
Exemplos:
● 121
● 3516153
● 2002
● 111111111111
Número capicua
Precisamos de um algoritmo...
Número capicua
Criemos um algoritmo possível para determinar se um número é capicua
O primeiro algoritmo usará o fato que aqui verificaremos se um número é capicua na base 10
Número capicua – Um algoritmo
O que faremos será trabalhar com a decomposição de um número na base 10, ou seja, por exemplo,
e reescrevermos da seguinte maneira
1234=1×103+2×102+3×101+4×100
1×100+2×101+3×102+4×103=4321
Número capicua
Número capicua – Outro algoritomo
Agora outro algoritmo observando que os int lidos são representados como uma sucessão de algarismos que, por sua vez, são caracteres.
● Então, por que não tratar o número como uma cadeia de caracteres?
Assim sendo, manipular a cadeia de caracteres com uma contagem de índice partindo da última posição para a primeira
Número capicua
Número capicua
Repare que a entrada se dá como cadeia de caracteres. No final das contas, ser número não importa aqui.
● Com poucas modificações este programa poderá verificar palíndromos (um exercício que será apresentado mais a frente)
Novamente este programa não faz uma filtragem da entrada. Modifique este programa para que só admita como entrada uma cadeia de caracteres que contenha apenas algarismos.
Número capicua
● Repare que o segundo algoritmo usa especificidades de Python.
● Há uma eterna luta entre o uso de especificidades de uma linguagem ou um sistema operacional e a portabilidade de um programa. O cuidado que se deve ter é para quem não saia perdendo não seja o fruto do seu trabalho.
Exercício – Constante de Kaprekar
Faça um programa em Python no qual será solicitado que se entre com um número de quatro algarismos sendo que pelo menos dois algarismos diferentes, podendo haver complementação de zeros à esquerda.
i) Ordene os algarismos em ordem crescente e em ordem decrescente, colocando estes valores em duas variáveis
ii) Subtraia da variável de maior valor a de menor valor
iii) Se o valor da subtração for 6174, pare e imprima quantos passos foram dados. Caso não, volte ao passo ii.
Constante de Kaprekar
Melhor dar um exemplo:
Escolhamos 1726 que gera 7621 e 1267
Constante de Kaprekar
Melhor dar um exemplo:
Escolhamos 1726 que gera 7621 e 1267
● 7621 – 1267 = 6354 que gera 6543 e 3456
● 6543 – 3456 = 3087 que gera 8730 e 0378
● 8730 – 0378 = 8352 que gera 8532 e 2358
● 8532 – 23 58 = 6174
se você insistir e gerar 7641 e 1467
● 7641 – 1467 = 6174
Números primos
Determine e imprima os números primos menores ou iguais a n.
Números primos
Já vimos este problema que é bem conhecido. Teremos um laço de repetição gerando os valores enquanto teremos outro laço fazendo as divisões e testando a divisibilidade.
● Aproveitaremos este problema para antes apresentar mais alguns aspectos novos do for
Laço de for: break e else
Crie um programa no qual temos uma lista do estoque de uma quitanda onde temos produtos hortifrutigranjeiros
Entramos com o produto e o programa avisa se há ou não há o produto no estoque
Laço de for: break e else
Laço de for: break e else
Aqui temos um elemento novo
● break
e algo estranho
● else
pois o else está associado ao for e não ao if
Vamos descrever seus efeitos
Laço de for: break e else
● Quando entramos com o produto o for rastreará a lista.
● O if verificará se o produto se encontra no estoque. Caso encontre, ele imprime a mensagem que achou o produto e interrompe o for usando o break, afinal já houve a localização do produto.
● Caso o for rastreie até o final, o for passa o controle ao else que testemunha a consequência da exaustão do elementos da lista que é não haver o produto no estoque
Laço de while: break e else
O break e o else também podem ser usados no while
Números primos
Observe que este tipo de estrutura parece ser adequado a trabalharmos com nosso problema de números primos pois também não queremos fazer testes desnecessários se já sabemos que o número não é primo e, além disto, o fato de o número testado pelo for não ser divisível, é sinal que o número é primo
Números primos
Números primos
O break é um elemento de laços de repetição que interrompe o laço ao qual está associado
● No programa, quando o if detecta que i é divisível por j, ou seja, o número não é primo, o break interrompe o laço que trabalha com o j, poupando contas inúteis
● O else associado ao for que conta j entra em ação quando este for exaure os elementos que examina, indicação que o número é primo
Exercício – Crivo de Eratóstenes
Determine os números primos menores ou iguais a n usando o Crivo de Eratóstenes.
Crivo de Eratóstenes
Vejamos um exemplo para n = 20
i) Escreva os números de 1 a 20
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20
ii) corte da lista os múltiplos de 2
1, 2, 3, x, 5, x, 7, x, 9, x, 11, x, 13, x, 15, x, 17, x, 19, x
ii) corte da lista múltiplos de 3
1, 2, 3, x, 5, x, 7, x, x, x, 11, x, 13, x, x, 17, x, 19, x
iii) como o número 4 já foi cortado, cortemos os múltiplos de 5
1, 2, 3, x, 5, x, 7, x, x, x, 11, x, 13, x, x, 17, x, 19, x
Crivo de Eratóstenes
iv) como o número 6 já foi cortado, cortemos os múltiplos de 7
1, 2, 3, x, 5, x, 7, x, x, x, 11, x, 13, x, x, 17, x, 19, x
v) paramos pois os múltiplos do próximo número não cortado, 11, é maior que 20
Crivo de Eratóstenes
Repare que estamos matando um bocado de coisas que já estão mortas, mesmo assim o algoritmo é eficaz e eficiente, embora possamos melhorá-lo bastante
Não nos preocuparemos muito com as questões de eficiência
Crivo de Eratóstenes
Uma forma de implementar está em preenchermos um vetor com o valor igual ao seu índice e “matarmos“ os valores múltiplos de cada valor no vetor partindo de 2. Observe que
● Como os primeiros múltiplos serão os de 2, não tem sentido matar valores maiores que n/2
● Da mesma forma, não há sentido em matar valores múltiplos de 3 maiores que n/3 ou múltiplos de 4 maiores que n/4 e etc.
Crivo de Eratóstenes
Mas como “matamos“ os elementos que não são primos?
Uma possibilidade é atribuirmos ao elemento da lista um valor que não se encaixe no que um número primo é. Aqui usaremos o zero.
Crivo de Eratóstenes
Crivo de Eratóstenes
Vamos introduzir algumas modificações nesta versão mostrando mais um elemento associado ao for
Crivo de Eratóstenes
Crivo de Eratóstenes – Mais um aspecto do for
Aqui fizemos uso de um controle de fluxo de repetição aplicado ao for, usando o continue que salta as instruções que se seguem sem interromper a laço de repetição
● O continue também pode ser usado com o while
Além disto, usando o end no print() de tal forma que imprimimos os números primos separados por vírgula e um espaço em branco
Crivo de Eratóstenes
Repare que não fizemos uma leitura inteligente no programa pois permitimos valores inválidos por serem negativos ou nulos
Crivo de Eratóstenes
Repare que não fizemos uma leitura inteligente no programa pois permitimos valores inválidos por serem negativos ou nulos
No entanto, esta implementação segue o algoritmo como apresentado onde se “mata” o que já está “morto” e, pior, usa os valores “mortos” para “matar” múltiplos dele.
Crivo de Eratóstenes
Repare que não fizemos uma leitura inteligente no programa pois permitimos valores inválidos por serem negativos ou nulos
No entanto, esta implementação segue o algoritmo como apresentado onde se “mata” o que já está “morto” e, pior, usa os valores “mortos” para “matar” múltiplos dele.
● Aperfeiçoe este programa de forma que ele não use valores já “mortos” para “matar” seus múltiplos
Crivo de Eratóstenes
É claro que podemos ter várias implementações do mesmo algoritmo.
Crivo de Eratóstenes
É claro que podemos ter várias implementações do mesmo algoritmo.
Uma ideia está em usar uma lista de tipo bool inicialmente preenchido com True, ou seja, a princípio todos os valores representados seriam vistos como primos em potencial. A medida que aplicamos o Crivo de Eratóstenes, marcamos como False os números excluídos como primos
Crivo de Eratóstenes
Crivo de Eratóstenes
Repare novamente no uso do continue associado ao for.