Quando fazemos :
>>> X = X + 1acontece o seguinte. Primeiro o sistema tenta calcular o objecto associado à expressão X + 1. Para tal procura no espaço dos objectos o valor do objecto associado ao nome X. De seguida, incrementa esse valor de uma unidade e associa o novo objecto ao nome X.
P2
Era-nos pedido uma solução para o problema de saber se após o lançamento de um dado n vezes, o número de vezes que saiu um número par é maior do que o valor médio esperado. Podemos resolver este problema pro aproximações, baseando-nos num padrão de programação nosso conhecido: ciclo - acumulador.
def par_impar(n): conta_par = 0 # o acumulador for i in range(n): num = lanca_dado() # actualiza o acumulador # define resultadoA implementação da simulação do lançamento do dado é trivial:
import random def lanca_dado(): return random.randint(1,6)Com estes elementos chegamos facilmente à versão final:
import random def lanca_dado(): return random.randint(1,6) def par_impar(n): conta_par = 0 for i in range(n): num = lanca_dado() if (num == 2) or (num == 4) or (num == 6): # if num in (2,4,6): conta_par = conta_par + 1 if conta_par > n/2: return True else: return FalseNotar que o teste de saída de número par pode ser abreviado para if num in (2,4,6):
P3
Queremos um programa que nos permita desenhar figuras como a abaixo.
Pedem para poder parametrizar muita coisa: posição, orientação, número de laços e de segmentos tos, cor, tamanho do lado dos laços, tamanho dos segmentos, etc.
A solução passa por dividir o problema em sub-problemas e não tentar resolver tudo de uma vez. Olhando para a figura vemos laços e uma cauda. Os laços podem ser construídos como dois triângulos ligados por um vértice, enquanto a cauda é uma sequência de segmentos. Vamos resolver cada um dos sub-problemas.
Comecemos pelos triângulos coloridos, algo que fizemos nas aulas.
def tri_cor(posx,posy,orientacao,lado,cor): turtle.penup() turtle.goto(posx,posy) turtle.pendown() turtle.setheading(orientacao) turtle.fillcolor(cor) turtle.begin_fill() for i in range(3): turtle.forward(lado) turtle.left(120) turtle.end_fill() turtle.hideturtle()Como se pode ver, iniciamos o programa definindo os parâmetros e depois desenhos o triângulo. O laço resulta de desenharmos dois triângulos percebendo que a orientação de ambos está desfasada de 180 graus.
def laco(posx,posy,orientacao,lado,cor): tri_cor(posx,posy,orientacao,lado,cor) tri_cor(posx,posy,orientacao + 180,lado,cor) turtle.hideturtle()Passemos à cauda como sequência de segmentos. Desenhar um segmento com uma dada inclinação é trivial.
def seg(posx,posy,comp,orientacao,cor): turtle.penup() turtle.goto(posx,posy) turtle.pendown() turtle.setheading(orientacao) turtle.pencolor(cor) turtle.forward(comp) turtle.hideturtle()Podemos agora juntar as peças do nosso puzzle. Se pensarmos um pouco, a estratégia mais interessante para o nosso programa final consiste em desenhar um segmento e de seguida desenhar um laço, repetindo estas acções o número apropriado de vezes. Daí a solução:
def boneco(n, posx, posy, orientacao,inc,comp,lado,cor): turtle.penup() turtle.goto(posx,posy) turtle.pendown() for i in range(n): if i % 2 == 0: seg(turtle.xcor(),turtle.ycor(),comp,orientacao + inc,cor) laco(turtle.xcor(),turtle.ycor(),turtle.heading()-90,lado,cor) else: seg(turtle.xcor(),turtle.ycor(),comp,orientacao - inc,cor) laco(turtle.xcor(),turtle.ycor(),turtle.heading()+90,lado,cor) if n % 2 == 0: seg(turtle.xcor(),turtle.ycor(),comp,orientacao + inc,cor) else: seg(turtle.xcor(),turtle.ycor(),comp,orientacao - inc,cor)E pronto! O leitor atento notará que o if final se deve à necessidade de desenhar o último segmento da cauda. Por outro lado, note como controlamos a orientação da cauda, e como relacionamos a orientação dos segmentos e dos laços. Finalmente, a cor dos laços e dos segmentos é a mesma, mas é trivial fazer com que tenham cor diferente!
Depois de feito o programa, torna-se evidente que podemos simplificar o desenho dos segmentos:
def boneco(n, posx, posy, orientacao,inc,comp,lado,cor): turtle.penup() turtle.goto(posx,posy) turtle.pendown() turtle.pencolor(cor) for i in range(n): if i % 2 == 0: turtle.setheading(orientacao + inc) turtle.forward(comp) laco(turtle.xcor(),turtle.ycor(),turtle.heading()-90,lado,cor) else: turtle.setheading(orientacao - inc) turtle.forward(comp) laco(turtle.xcor(),turtle.ycor(),turtle.heading()+90,lado,cor) if n % 2 == 0: turtle.setheading(orientacao + inc) turtle.forward(comp) else: turtle.setheading(orientacao - inc) turtle.forward(comp)E chega… ou talvez não!
Para terminar, e embora não fosse necessário, um pequeno programa para desenhar apenas uma cauda ondulante:
def cauda(n,posx,posy,comp,orienta_1,orienta_2,cor): # posiciona turtle.penup() turtle.goto(posx,posy) turtle.pendown() turtle.pencolor(cor) for i in range(n): if i % 2 == 0 : seg(turtle.xcor(),turtle.ycor(),comp, orienta_1,cor) else: seg(turtle.xcor(),turtle.ycor(),comp, orienta_2,cor)Note-se como controlamos a orientação dos segmentos.
Sem comentários:
Enviar um comentário