sexta-feira, 13 de outubro de 2017

Teste # 1 - TP2

P1

O que aparece no lugar do ponto de interrogação?
1.>>> x = 'abacadabra'
2.>>> x[1] = 'zeus'
3.Traceback (most recent call last):
4.  Python Shell, prompt 2, line 1
5.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.
1.def enviesada_a(n):
2.    # lança e conta
3.    conta = 0
4.    for i in range(n):
5.        conta = conta + random.randint(0,1)  
6.    # analisa
7.    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.
01.def enviesada(n,perc):
02.    """
03.    n = número de lançamentos
04.    perc = percentagem aceitável [0,1]
05.    """
06.    # lança e conta
07.    conta = 0
08.    for i in range(n):
09.        conta = conta + random.randint(0,1)  
10.    # analisa
11.    espera = n/2
12.    inf_ = (1 - perc)* espera
13.    sup_ = (1 + perc) * espera
14.    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:
1.def boneco(n,raio_1, raio_2, posx,posy, orientacao, cor_1,cor_2,cor_3):
2.    # desenha balão grande
3.    # desenha balão pequeno
4.    # desenha cauda
5.    pass
Tratemos dos balões isoladamente:
01.def bola(raio, posx,posy, orientacao, cor):
02.    turtle.penup()
03.    turtle.goto(posx,posy)
04.    turtle.pendown()
05.    turtle.setheading(orientacao)
06.    turtle.fillcolor(cor)
07.    turtle.begin_fill()
08.    turtle.circle(raio)
09.    turtle.end_fill()
10.    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:
01.def cauda(n, tipo, posx, posy,orientacao, comp, cor):
02.    turtle.penup()
03.    turtle.goto(posx,posy)
04.    turtle.pendown()
05.    turtle.setheading(orientacao)
06.    turtle.pencolor(cor)
07.    for i in range(n):
08.        turtle.forward(comp)
09.        turtle.right(tipo * 60)    
10.    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 é:
01.def boneco(n,raio_1, raio_2, posx,posy, orientacao, cor_1,cor_2,cor_3):
02.    # desenha balão grande
03.    bola(raio_1,  posx,posy, orientacao, cor_1)
04.    # desenha balão pequeno
05.    turtle.penup()
06.    turtle.setheading(orientacao-90)
07.    turtle.forward(2*raio_2)
08.    turtle.setheading(orientacao)
09.    turtle.pendown()
10.    bola(raio_2,  turtle.xcor(),turtle.ycor(), orientacao, cor_2)
11.    # 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:

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

Só falta acrescentar a cauda…
01.def balao(n,raio_1, raio_2, posx,posy, orientacao, cor_1,cor_2,cor_3):
02.    bola(raio_1,  posx,posy, orientacao, cor_1)
03.    turtle.penup()
04.    turtle.setheading(orientacao-90)
05.    turtle.forward(2*raio_2)
06.    turtle.setheading(orientacao)
07.    turtle.pendown()
08.    bola(raio_2,  turtle.xcor(),turtle.ycor(), orientacao, cor_2)
09.    for i in range(n):
10.        cauda(3,(-1)**i,turtle.xcor(),turtle.ycor(),turtle.heading(),20,cor_3)
11.    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:

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

Sem comentários:

Enviar um comentário