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

44
Programação de Computadores Instituto de Computação UFF Departamento de Ciência da Computação Otton Teixeira da Silveira Filho

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

Page 1: Programação de Computadores - ic.uff.brotton/graduacao/programacao/11_Exercicios_capecua... · Crivo de Eratóstenes Repare que não fizemos uma leitura inteligente no programa

Programação de Computadores

Instituto de Computação UFFDepartamento de Ciência da Computação

Otton Teixeira da Silveira Filho

Page 2: Programação de Computadores - ic.uff.brotton/graduacao/programacao/11_Exercicios_capecua... · Crivo de Eratóstenes Repare que não fizemos uma leitura inteligente no programa

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

Page 3: Programação de Computadores - ic.uff.brotton/graduacao/programacao/11_Exercicios_capecua... · Crivo de Eratóstenes Repare que não fizemos uma leitura inteligente no programa

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

Page 4: Programação de Computadores - ic.uff.brotton/graduacao/programacao/11_Exercicios_capecua... · Crivo de Eratóstenes Repare que não fizemos uma leitura inteligente no programa

Número capicua

Determine se um número é capicua

Page 5: Programação de Computadores - ic.uff.brotton/graduacao/programacao/11_Exercicios_capecua... · Crivo de Eratóstenes Repare que não fizemos uma leitura inteligente no programa

Número capicua

Melhor dizer o que é um número capicua...

Page 6: Programação de Computadores - ic.uff.brotton/graduacao/programacao/11_Exercicios_capecua... · Crivo de Eratóstenes Repare que não fizemos uma leitura inteligente no programa

Número capicua

Um número é capicua (ou número palíndromo) se o seu reverso é ele próprio.

Exemplos:

● 121

● 3516153

● 2002

● 111111111111

Page 7: Programação de Computadores - ic.uff.brotton/graduacao/programacao/11_Exercicios_capecua... · Crivo de Eratóstenes Repare que não fizemos uma leitura inteligente no programa

Número capicua

Precisamos de um algoritmo...

Page 8: Programação de Computadores - ic.uff.brotton/graduacao/programacao/11_Exercicios_capecua... · Crivo de Eratóstenes Repare que não fizemos uma leitura inteligente no programa

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

Page 9: Programação de Computadores - ic.uff.brotton/graduacao/programacao/11_Exercicios_capecua... · Crivo de Eratóstenes Repare que não fizemos uma leitura inteligente no programa

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

Page 10: Programação de Computadores - ic.uff.brotton/graduacao/programacao/11_Exercicios_capecua... · Crivo de Eratóstenes Repare que não fizemos uma leitura inteligente no programa

Número capicua

Page 11: Programação de Computadores - ic.uff.brotton/graduacao/programacao/11_Exercicios_capecua... · Crivo de Eratóstenes Repare que não fizemos uma leitura inteligente no programa

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

Page 12: Programação de Computadores - ic.uff.brotton/graduacao/programacao/11_Exercicios_capecua... · Crivo de Eratóstenes Repare que não fizemos uma leitura inteligente no programa

Número capicua

Page 13: Programação de Computadores - ic.uff.brotton/graduacao/programacao/11_Exercicios_capecua... · Crivo de Eratóstenes Repare que não fizemos uma leitura inteligente no programa

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.

Page 14: Programação de Computadores - ic.uff.brotton/graduacao/programacao/11_Exercicios_capecua... · Crivo de Eratóstenes Repare que não fizemos uma leitura inteligente no programa

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.

Page 15: Programação de Computadores - ic.uff.brotton/graduacao/programacao/11_Exercicios_capecua... · Crivo de Eratóstenes Repare que não fizemos uma leitura inteligente no programa

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.

Page 16: Programação de Computadores - ic.uff.brotton/graduacao/programacao/11_Exercicios_capecua... · Crivo de Eratóstenes Repare que não fizemos uma leitura inteligente no programa

Constante de Kaprekar

Melhor dar um exemplo:

Escolhamos 1726 que gera 7621 e 1267

Page 17: Programação de Computadores - ic.uff.brotton/graduacao/programacao/11_Exercicios_capecua... · Crivo de Eratóstenes Repare que não fizemos uma leitura inteligente no programa

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

Page 18: Programação de Computadores - ic.uff.brotton/graduacao/programacao/11_Exercicios_capecua... · Crivo de Eratóstenes Repare que não fizemos uma leitura inteligente no programa

Números primos

Determine e imprima os números primos menores ou iguais a n.

Page 19: Programação de Computadores - ic.uff.brotton/graduacao/programacao/11_Exercicios_capecua... · Crivo de Eratóstenes Repare que não fizemos uma leitura inteligente no programa

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

Page 20: Programação de Computadores - ic.uff.brotton/graduacao/programacao/11_Exercicios_capecua... · Crivo de Eratóstenes Repare que não fizemos uma leitura inteligente no programa

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

Page 21: Programação de Computadores - ic.uff.brotton/graduacao/programacao/11_Exercicios_capecua... · Crivo de Eratóstenes Repare que não fizemos uma leitura inteligente no programa

Laço de for: break e else

Page 22: Programação de Computadores - ic.uff.brotton/graduacao/programacao/11_Exercicios_capecua... · Crivo de Eratóstenes Repare que não fizemos uma leitura inteligente no programa

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

Page 23: Programação de Computadores - ic.uff.brotton/graduacao/programacao/11_Exercicios_capecua... · Crivo de Eratóstenes Repare que não fizemos uma leitura inteligente no programa

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

Page 24: Programação de Computadores - ic.uff.brotton/graduacao/programacao/11_Exercicios_capecua... · Crivo de Eratóstenes Repare que não fizemos uma leitura inteligente no programa

Laço de while: break e else

O break e o else também podem ser usados no while

Page 25: Programação de Computadores - ic.uff.brotton/graduacao/programacao/11_Exercicios_capecua... · Crivo de Eratóstenes Repare que não fizemos uma leitura inteligente no programa

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

Page 26: Programação de Computadores - ic.uff.brotton/graduacao/programacao/11_Exercicios_capecua... · Crivo de Eratóstenes Repare que não fizemos uma leitura inteligente no programa

Números primos

Page 27: Programação de Computadores - ic.uff.brotton/graduacao/programacao/11_Exercicios_capecua... · Crivo de Eratóstenes Repare que não fizemos uma leitura inteligente no programa

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

Page 28: Programação de Computadores - ic.uff.brotton/graduacao/programacao/11_Exercicios_capecua... · Crivo de Eratóstenes Repare que não fizemos uma leitura inteligente no programa

Exercício – Crivo de Eratóstenes

Determine os números primos menores ou iguais a n usando o Crivo de Eratóstenes.

Page 29: Programação de Computadores - ic.uff.brotton/graduacao/programacao/11_Exercicios_capecua... · Crivo de Eratóstenes Repare que não fizemos uma leitura inteligente no programa

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

Page 30: Programação de Computadores - ic.uff.brotton/graduacao/programacao/11_Exercicios_capecua... · Crivo de Eratóstenes Repare que não fizemos uma leitura inteligente no programa

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

Page 31: Programação de Computadores - ic.uff.brotton/graduacao/programacao/11_Exercicios_capecua... · Crivo de Eratóstenes Repare que não fizemos uma leitura inteligente no programa

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

Page 32: Programação de Computadores - ic.uff.brotton/graduacao/programacao/11_Exercicios_capecua... · Crivo de Eratóstenes Repare que não fizemos uma leitura inteligente no programa

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.

Page 33: Programação de Computadores - ic.uff.brotton/graduacao/programacao/11_Exercicios_capecua... · Crivo de Eratóstenes Repare que não fizemos uma leitura inteligente no programa

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.

Page 34: Programação de Computadores - ic.uff.brotton/graduacao/programacao/11_Exercicios_capecua... · Crivo de Eratóstenes Repare que não fizemos uma leitura inteligente no programa

Crivo de Eratóstenes

Page 35: Programação de Computadores - ic.uff.brotton/graduacao/programacao/11_Exercicios_capecua... · Crivo de Eratóstenes Repare que não fizemos uma leitura inteligente no programa

Crivo de Eratóstenes

Vamos introduzir algumas modificações nesta versão mostrando mais um elemento associado ao for

Page 36: Programação de Computadores - ic.uff.brotton/graduacao/programacao/11_Exercicios_capecua... · Crivo de Eratóstenes Repare que não fizemos uma leitura inteligente no programa

Crivo de Eratóstenes

Page 37: Programação de Computadores - ic.uff.brotton/graduacao/programacao/11_Exercicios_capecua... · Crivo de Eratóstenes Repare que não fizemos uma leitura inteligente no programa

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

Page 38: Programação de Computadores - ic.uff.brotton/graduacao/programacao/11_Exercicios_capecua... · Crivo de Eratóstenes Repare que não fizemos uma leitura inteligente no programa

Crivo de Eratóstenes

Repare que não fizemos uma leitura inteligente no programa pois permitimos valores inválidos por serem negativos ou nulos

Page 39: Programação de Computadores - ic.uff.brotton/graduacao/programacao/11_Exercicios_capecua... · Crivo de Eratóstenes Repare que não fizemos uma leitura inteligente no programa

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.

Page 40: Programação de Computadores - ic.uff.brotton/graduacao/programacao/11_Exercicios_capecua... · Crivo de Eratóstenes Repare que não fizemos uma leitura inteligente no programa

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

Page 41: Programação de Computadores - ic.uff.brotton/graduacao/programacao/11_Exercicios_capecua... · Crivo de Eratóstenes Repare que não fizemos uma leitura inteligente no programa

Crivo de Eratóstenes

É claro que podemos ter várias implementações do mesmo algoritmo.

Page 42: Programação de Computadores - ic.uff.brotton/graduacao/programacao/11_Exercicios_capecua... · Crivo de Eratóstenes Repare que não fizemos uma leitura inteligente no programa

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

Page 43: Programação de Computadores - ic.uff.brotton/graduacao/programacao/11_Exercicios_capecua... · Crivo de Eratóstenes Repare que não fizemos uma leitura inteligente no programa

Crivo de Eratóstenes

Page 44: Programação de Computadores - ic.uff.brotton/graduacao/programacao/11_Exercicios_capecua... · Crivo de Eratóstenes Repare que não fizemos uma leitura inteligente no programa

Crivo de Eratóstenes

Repare novamente no uso do continue associado ao for.