Baixe o app para aproveitar ainda mais
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()
Compartilhar