Buscar

P2(Gabarito)

Prévia do material em texto

Universidade Federal do Rio de Janeiro 
Turma EP1 
2ª Prova de Computação I 
6 de dezembro de 2013 
 
Questão 1: Mnemônicos (1.0 pontos) 
Em um telefone comum, cada um dos dígitos, com exceção do 0 e 1, está associado a um grupo de três ou 
quatro letras, como mostrado na figura a seguir: 
 
Para determinados números de telefone, é possível encontrar palavras que correspondem aos dígitos desse 
número. Por exemplo, a sequencia de dígitos 5683 pode ser associada à palavra “LOVE”. Uma vez que estas 
palavras são geralmente mais fáceis de decorar do que o número, elas servem como mnemônicos para o 
número. Por exemplo, o telefone 653-5683 poderia ser memorizado como “OLD-LOVE” 
Escreva a função ehMnemonico(palavra, numero) que recebe como parâmetros as strings palavra e 
numero e determina se a palavra pode ser usada como um mnemônico do número. Exemplos: 
assert ehMnemonico('NERVOUS', '6378687') == True 
assert ehMnemonico('GOOD', '4663') == True 
assert ehMnemonico('FLOWERS', '3569377') == True 
 
 
def ehMnemonico(palavra, numero): 
 aux = "" 
 for ch in palavra: 
 if 'A' <= ch <= 'C': 
 ch = '2' 
 elif 'D' <= ch <= 'F': 
 ch = '3' 
 elif 'G' <= ch <= 'I': 
 ch = '4' 
 elif 'J' <= ch <= 'L': 
 ch = '5' 
 elif 'M' <= ch <= 'O': 
 ch = '6' 
 elif 'P' <= ch <= 'S': 
 ch = '7' 
 elif 'T' <= ch <= 'V': 
 ch = '8' 
 elif 'W' <= ch <= 'Z': 
 ch = '9' 
 aux += ch 
 return numero == aux 
 
 
assert ehMnemonico('NERVOUS', '6378687') == True 
assert ehMnemonico('GOOD', '4663') == True 
assert ehMnemonico('FLOWERS', '3569377') == True 
print 'OK' 
 
 
Questão 2: Strings e caracteres (1.0 pontos) 
Escreva a função Python intercala(str1, str2) que recebe duas strings como parâmetro e retorna 
uma terceira string formada pela intercalação das duas strings de entrada. Quando todos os caracteres da 
menor string tiverem sido usados, os caracteres restantes da maior string devem ser acrescentados ao final da 
string de saída, sem intercalação. 
Exemplos: 
assert intercala('flu', 'campeao') == 'fclaumpeao' 
assert intercala('ENGENHARIA', 'UFRJ') == 'EUNFGREJNHARIA' 
 
 
def intercala(str1, str2): 
 resultado = '' 
 # determina qual das strings, str1 ou str2, é a maior 
 if len(str1) < len(str2): 
 menor = str1 
 maior = str2 
 else: 
 menor = str2 
 maior = str1 
 
 # Adicionar caracteres alternados (intercalados) à string de saída 
 for i in range(len(menor)): 
 resultado += str1[i] + str2[i] 
 
 # Copia o restante da maior string de entrada para a string de saída 
 resultado += maior[len(menor):] 
 return resultado 
 
assert intercala('flu', 'campeao') == 'fclaumpeao' 
assert intercala('ENGENHARIA', 'UFRJ') == 'EUNFGREJNHARIA' 
print 'OK' 
 
 
Questão 3: Usando Tkinter (1.0 pontos) 
Escreva um programa para desenhar e mover retângulos de tamanho e cor aleatórios pelo canvas. O 
pseudocódigo a seguir deve deixar clara sua tarefa. 
 
# método de callback para o clique do mouse 
def clicou(e): 
 se não houver um retângulo na posição do clique: 
 cria um retângulo de largura, altura e cor aleatórios, centrado na 
 posição do clique 
 senão 
 se não havia um retângulo selecionado: 
 seleciona o retângulo atual 
 senão: 
 libera o retângulo atual 
 
# método de callback para o movimento do mouse 
def moveu(e): 
 se houver um retângulo selecionado: 
 move o retângulo selecionado para este acompanhar a posição do mouse 
 
 
canvas = Canvas(width=600, height=400, bg='white') 
canvas.pack() 
 
# estabelece os métodos de callback 
 
mainloop() 
 
 
 
 
 
from Tkinter import * 
from random import * 
 
LARG_MIN = 40.0 
LARG_MAX = 200.0 
cores = ['red', 'green', 'blue', 'yellow', 'pink', 
 'magenta', 'white', 'black', 'brown', 'purple'] 
''' 
Verifica se existe um retangulo na posição do clique. Se houver, o 
retangulo é selecionado (se não houver outro retangulo selecionado), 
ou a seleção atual é liberada. 
''' 
def clicou(e): 
 global selecionado 
 lista = canvas.find_overlapping(e.x, e.y, e.x, e.y) 
 if len(lista) == 0: 
 criaRetanguloAleatorio(e.x, e.y) 
 elif selecionado == None: 
 selecionado = lista[0] 
 else: 
 selecionado = None 
''' 
Se houver um retangulo selecionado, este é movido para acompanhar 
a posição do mouse 
''' 
def moveu(e): 
 if selecionado != None: 
 x0, y0, x1, y1 = canvas.coords(selecionado) 
 xc = (x0 + x1)/2 
 yc = (y0 + y1)/2 
 canvas.move(selecionado, e.x - xc, e.y - yc) 
## ou: 
## global selecionado 
## if selecionado != None: 
## x0, y0, x1, y1 = canvas.coords(selecionado) 
## L = x1 - x0 
## A = y1 - y0 
## cor = canvas.itemcget(selecionado, 'fill') 
## canvas.delete(selecionado) 
## selecionado = canvas.create_rectangle( 
## e.x - L/2, e.y - A/2, e.x + L/2, e.y + A/2, fill=cor) 
 
''' 
Cria um retangulo de largura, altura e cor aleatorios, centrado em x e y 
''' 
def criaRetanguloAleatorio(x, y): 
 altura = uniform(LARG_MIN, LARG_MAX) 
 largura = uniform(LARG_MIN, LARG_MAX) 
 canvas.create_rectangle(x - largura/2, y - altura/2, 
 x + largura/2, y + altura/2, 
 fill = choice(cores)) 
 
# o retangulo selecionado (None se nenhum estiver selecionado) 
selecionado = None 
canvas = Canvas(width=600, height=400, bg='white') 
canvas.pack() 
canvas.bind("<Button-1>", clicou) 
canvas.bind("<Motion>", moveu) 
mainloop()

Continue navegando