sexta-feira, 13 de outubro de 2017

Teste # 1 - TP2

P1

O que aparece no lugar do ponto de interrogação?
>>> x = 'abacadabra'
>>> x[1] = 'zeus'
Traceback (most recent call last):
  Python Shell, prompt 2, line 1
builtins.TypeError: 'str' object does not support item assignment
Aparece um erro pois as cadeias de caracteres são imutáveis não podendo o seu valor ser alterado.

P2

Como saber se uma moeda está enviesada? Fazemos vários lançamentos e comparamos com o valor esperado para uma das duas opções. Como nada neste mundo é perfeito aceitamos uma pequena discrepância em relação a esse valor. Para resolver o problema, vamos devagar e por partes. Primeiro uma versão simples que apenas simula e compara com o caçoe médio esperado.
def enviesada_a(n):
    # lança e conta
    conta = 0
    for i in range(n):
        conta = conta + random.randint(0,1)   
    # analisa
    return conta != n//2
Esta versão baseia-se num padrão dec programação conhecido por ciclo - acumulador. O nome conta está associado a um objecto cujo valor corresponde ao numero de vezes que já saiu caras (1). O ciclo é repetido o número de vezes pretendido. A comparação final é feita usando a divisão inteira.

Vamos partir desta solução para a solução final pretendida. A moeda estará enviesada se o valor obtido estiver fora de um dado intervalo.
def enviesada(n,perc):
    """ 
    n = número de lançamentos
    perc = percentagem aceitável [0,1]
    """
    # lança e conta
    conta = 0
    for i in range(n):
        conta = conta + random.randint(0,1)   
    # analisa
    espera = n/2
    inf_ = (1 - perc)* espera
    sup_ = (1 + perc) * espera
    return (conta < inf_) or (conta > sup_)
Como se observa usamos agora uma divisão de floats.

P3

Queremos desenhar bonecos como o da figura.
Olhando para a figura observamos que precisamos saber desenhar balões coloridos e uma cauda que é composta de repetições de uma sequência de quatro segmentos com orientações alternadas. Uma solução simples vai envolver três passos:
def boneco(n,raio_1, raio_2, posx,posy, orientacao, cor_1,cor_2,cor_3):
    # desenha balão grande
    # desenha balão pequeno
    # desenha cauda
    pass
Tratemos dos balões isoladamente:
def bola(raio, posx,posy, orientacao, cor):
    turtle.penup()
    turtle.goto(posx,posy)
    turtle.pendown()
    turtle.setheading(orientacao)
    turtle.fillcolor(cor)
    turtle.begin_fill()
    turtle.circle(raio)
    turtle.end_fill()
    turtle.hideturtle()
Esta solução corresponde ao que já foi feito nas aulas!!! Vamos tratar da parte nova: a cauda. olhando para a figura vemos que é composta a partir de uma sequência de formas mais simples. Estas por sua vez são formadas por três traços. Eis uma solução genérica para a cauda:
def cauda(n, tipo, posx, posy,orientacao, comp, cor):
    turtle.penup()
    turtle.goto(posx,posy)
    turtle.pendown()
    turtle.setheading(orientacao)
    turtle.pencolor(cor)
    for i in range(n):
        turtle.forward(comp)
        turtle.right(tipo * 60)     
    turtle.hideturtle()
Dizemos que é genérica porque usamos o parâmetro n, que no caso que nos interessa será igual a 3. Por outro lado, note-se que o parâmetro tipo é usado para determinar a orientação de cada sequência de três segmentos. tipo pode valer 1 ou -1, pois só temos duas orientações a considerar.

Resolvidas as três questões (balão grande, balão pequeno e cauda), vamos juntar tudo. A primeira questão é a de saber como juntamos os dois balões. A ideia é desenhar o maior e depois, a partir da posição final e da orientação, calcular a posição do centro do balão pequeno. Uma hipótese é:
def boneco(n,raio_1, raio_2, posx,posy, orientacao, cor_1,cor_2,cor_3):
    # desenha balão grande
    bola(raio_1,  posx,posy, orientacao, cor_1)
    # desenha balão pequeno
    turtle.penup()
    turtle.setheading(orientacao-90)
    turtle.forward(2*raio_2)
    turtle.setheading(orientacao)
    turtle.pendown()
    bola(raio_2,  turtle.xcor(),turtle.ycor(), orientacao, cor_2)
    # desenha cauda
   
Esta solução é fácil de entender se nos lembrarmos que a tartaruga desenha uma circunferência tendo o centro à sua esquerda! Claro que podemos fazer de outro modo:

def balao(n,raio_1, raio_2, posx,posy, orientacao, cor_1,cor_2,cor_3):
    bola(raio_1,  posx,posy, orientacao, cor_1)
    bola(-raio_2,  turtle.xcor(),turtle.ycor(), orientacao, cor_2)
Percebe a diferença???

Só falta acrescentar a cauda…
def balao(n,raio_1, raio_2, posx,posy, orientacao, cor_1,cor_2,cor_3):
    bola(raio_1,  posx,posy, orientacao, cor_1)
    turtle.penup()
    turtle.setheading(orientacao-90)
    turtle.forward(2*raio_2)
    turtle.setheading(orientacao)
    turtle.pendown()
    bola(raio_2,  turtle.xcor(),turtle.ycor(), orientacao, cor_2)
    for i in range(n):
        cauda(3,(-1)**i,turtle.xcor(),turtle.ycor(),turtle.heading(),20,cor_3)
    turtle.hideturtle()
E pronto! Percebeu o modo como alternamos a orientação da cauda??? Simplesmente fazendo o tipo igual a (-1)** i, o que faz com que o tipo vá ser alternadamente 1 e -1, como pretendido!

Pode usar este programa para criar variantes. Por exemplo:

def baloes(n,raio_1, raio_2, posx,posy, orientacao, cor_1,cor_2,cor_3):
    # balão grande
    bola(raio_1,  posx,posy, orientacao, cor_1)
    # n balões pequenos à volta do balão grande...
    for i in range(n):
        turtle.penup()
        turtle.circle(raio_1,360/n)
        turtle.pendown()        
        bola(-raio_2,  turtle.xcor(),turtle.ycor(), turtle.heading(), cor_2)
    turtle.hideturtle()

Sem comentários:

Enviar um comentário