In [1]:
# ignore esse código inicial, é apenas para preparar a página
from IPython.display import YouTubeVideo, HTML, Image, display
css_file = './modelo.css'
HTML(open(css_file, "r").read())


Out[1]:

Introdução à Programação em Python

Estruturas de Repetição

Vamos lembrar das aulas de Natureza da Informação quando aprendemos a converter um número decimal para binário.

Começando com o exemplo de dec = 14.

dec dec/2 dec%2 bin
14 7 0 0
7 3 1 10
3 1 1 110
1 0 1 1110
0 - - 1110

O número binário é 1110.

Vamos descrever o processo que realizamos:

  • enquanto dec era maior que zero
  • dividimos dec por 2
  • o quociente guardamos em dec, o resto concatenamos a esquerda do número binário
  • para facilitar vamos escrever o número binário como uma string!

Os 3 últimos itens podem ser resolvidos com nosso conhecimento atual.

Vamos fazer um rascunho desses itens:


In [5]:
def DivResto(num, base):
    """
    Retorna o quociente e resto da divisão de num por base
    """
    return num//base, num%base

In [6]:
dec = 14
bin = ""   # string vazia
div, resto = DivResto(dec,2)
dec = div
bin = str(resto) + bin
print(bin)


0

In [7]:
# repete mais uma vez, pois temos outro dígito
div, resto = DivResto(dec,2)
dec = div
bin = str(resto) + bin
print(bin)


10

Para resolver o primeiro item, utilizamos o comando while que significa enquanto:

while condicao verdadeira:
    faça alguma coisa

Esse comando instrui o Python a repetir o bloco de instruções abaixo enquanto certa condição for verdadeira.

No nosso caso a condição é que dec seja maior que zero.


In [8]:
def Converte(dec,base):

    num = ""

    while dec > 0:
        div, resto = DivResto(dec,base)
        dec = div
        num = str(resto) + num
    return num

print(Converte(14,2))


1110

Reparem que substituindo $2$ por qualquer outro número, convertemos o número para outras bases menores do que $10$.

Nota: Podemos indicar para uma função um valor padrão para sua variável.


In [9]:
def Converte(dec,base=2):

    num = ''

    while dec > 0:
        div, resto = DivResto(dec,base)
        dec = div
        num = str(resto) + num
    return num

print(Converte(14)) # usará a base 2
print(Converte(14, 3)) # usará a base 3
print(Converte(14, base=3)) # usará a base 3


1110
112
112

Como podemos adaptar nossa função para que possamos converter também para bases maiores que 10?


In [8]:
def Converte(dec,base):

    num = ''        

    while dec > 0:
        div, resto = DivResto(dec,base)
        dec = div
        num = ??? + num
    return num

print(Converte(14,16), hex(14)) # hexadecimal


14 0xe

In [11]:
import string
print(dir(string))
print()
print(string.digits, string.ascii_uppercase)


['ChainMap', 'Formatter', 'Template', '_TemplateMetaclass', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', '_re', '_string', 'ascii_letters', 'ascii_lowercase', 'ascii_uppercase', 'capwords', 'digits', 'hexdigits', 'octdigits', 'printable', 'punctuation', 'whitespace']

0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ

In [12]:
digitos = string.digits+string.ascii_uppercase
print(digitos[0], digitos[10])


0 A

In [13]:
def Converte(dec,base):

    digitos = string.digits+string.ascii_uppercase
    num = ''        

    while dec > 0:
        div, resto = DivResto(dec,base)
        dec = div
        num = digitos[resto] + num
    return num

print(Converte(14,16), hex(14)) # hexadecimal


E 0xe

Faça um programa que sorteie um número e peça para o usuário adivinhar.

Informe o usuário se o número sorteado é maior ou menor que o chute dele e repita a operação até que ele adivinhe.

Para sortear um número use a função randint(a,b) da biblioteca random, ele sorteia um número inteiro entre a e b.


In [2]:
import random

def Adivinhe():
    x = random.randint(0,100)

    
    
    
    
    
Adivinhe()


Entre com um valor: 50
O número é menor
Entre com um valor: 25
O número é maior
Entre com um valor: 35
O número é menor
Entre com um valor: 30
O número é menor
Entre com um valor: 28
O número é menor
Entre com um valor: 27
O número é menor
Entre com um valor: 26
Acertou

A multiplicação Etíope é um método de multiplicação que utiliza apenas a divisão e multiplicação por $2$.

Dado $m$ e $n$, faça:

  • Se $m$ for ímpar some $n$ ao resultado
  • Enquanto $m$ for maior ou igual a 1 repita:
    • Divida $m$ por $2$, multiplique $n$ por $2$
    • Se $m$ for ímpar, some $n$ ao resultado

In [4]:
def Etiope(m, n):

    
    
    
    
    
    
print(Etiope(12,13), 12*13)
print(Etiope(22,18), 22*18)


156 156
396 396

Existem algumas sintaxes no Python conhecidas como Syntactic sugar que são formas de reduzir longas sequências de instruções de uma forma mais simples para leitura.

Um exemplo são instruções if-else que contém apenas uma instrução a serem executadas:

variavel = valor1 if condicao else valor2

A variável irá receber o valor1 caso a condição seja verdadeira, caso contrário receberá o valor2.

Outra Syntactic Sugar é atribuição de valores para múltiplas variáveis em uma linha:

variavel1, variavel2 = valor1, valor

A variavel1 receberá o valor1, enquanto a variavel2 receberá o valor2.


In [5]:
def Etiope(m, n):

    
    
    
print(Etiope(12,13), 12*13)
print(Etiope(22,18), 22*18)


156 156
396 396

Crie uma função para calcular a soma dos dígitos de um número.

Primeiro, faça o procedimento sem auxílio do computador e tente abstrair a solução do problema.

DICA: Utilize a nossa função DivResto() criada anteriormente.


In [14]:
def SomaDigitos(num):
   
    
    
print(SomaDigitos(12345))


15

Crie uma função para verificar se um número é primo!

Pense na condição de repetição e quando podemos retornar o resultado para fazer o menor número de repetições.


In [9]:
def Primo(num):
    # ele não pode ser divisível por nenhum número de 2 a num-1

    
    
    
    
print(Primo(10))
print(Primo(13))
print(Primo(131))


False
True
True