Programação de Computadores - ic.uff.brotton/graduacao/programacao/11_Exercicios_capecua... ·...

Post on 03-Dec-2018

220 views 0 download

Transcript of Programação de Computadores - ic.uff.brotton/graduacao/programacao/11_Exercicios_capecua... ·...

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.