Buscar

P2.2010.2(Gabarito)

Prévia do material em texto

Universidade Federal do Rio de Janeiro 
Engenharia de Produção – Turma EP1 
2ª Prova de Computação 1 
03 de dezembro de 2010 
Duração: 2 horas 
Jonas Knopman 
 
Questão 1: Um retângulo animado. (4.0 pontos) 
Escreva um programa que desenhe um retângulo preto no canvas e que faça o retângulo seguir o clique do 
mouse. Os requisitos da aplicação são: 
a. Inicialmente, o retângulo deve ser desenhado no centro do canvas. 
 
b. Quando o usuário clica em alguma área do canvas exterior ao retângulo, o retângulo é movido de forma 
a que seu centro corresponda às coordenadas do mouse. 
 
c. Quando o usuário clica em algum ponto do retângulo, duas ações são necessárias: o centro do retângulo 
move-se para a posição do clique do mouse e as dimensões de altura e largura do retângulo são 
invertidas. 
 
d. Você não precisa se preocupar com o redimensionamento do canvas nem com a possibilidade do 
retângulo não estar totalmente visível no canvas. 
e. Algumas sugestões para as constantes usadas no seu programa. 
# Constantes 
LARGURA_INICIAL = 100 # largura inicial do retangulo 
ALTURA_INICIAL = 50 # altura inicial do retângulo 
 
# -*- coding: cp1252 -*- 
# arquivo: moveRetangulo.py 
# -------------------- 
# Esse programa permite ao usuário mover um retângulo pelo canvas e 
# inverter suas dimensões usando o mouse 
from Tkinter import * 
 
# Constantes 
LARGURA_INICIAL = 100 # largura inicial do retangulo 
ALTURA_INICIAL = 50 # altura inicial do retângulo 
 
# desenha um retângulo preto centrado na posição especificada por (x, y) 
def desenhaRetangulo(xc, yc, largura, altura): 
 canvas.create_rectangle(xc - largura/2, yc - altura/2, 
 xc + largura/2, yc + altura/2, fill='black') 
 
# trata o clique do mouse 
def clicouMouse(e): 
 global largRet, altRet 
 # Determina se o usuário clicou em um objeto (o retangulo) 
 lista = canvas.find_overlapping(e.x, e.y, e.x, e.y) 
 # Se ele clicou no retângulo, troca a largura com a altura 
 if len(lista) > 0: 
 largRet, altRet = altRet, largRet 
 # Apaga o retângulo antigo, uma vez que um novo retângulo será desenhado 
 # na posição do mouse 
 canvas.delete(ALL) 
 # redesenha o retangulo, centrado na posição do mouse 
 desenhaRetangulo(e.x, e.y, largRet, altRet) 
 
canvas = Canvas(bg='white') 
canvas.pack() 
 
# Desenha o retangulo inicial centrado no canvas 
largRet = LARGURA_INICIAL 
altRet = ALTURA_INICIAL 
desenhaRetangulo(canvas.winfo_reqwidth()/2, canvas.winfo_reqheight()/2, 
 largRet, altRet); 
 
# trata o clique do mouse 
canvas.bind("<ButtonPress-1>", clicouMouse) 
 
mainloop() 
 
 
 
Questão 2: Manipulação de Strings (3.0 pontos) 
Escreva uma função expandeStringCodificada(str) que recebe uma string codificada como 
parâmetro e retorna uma outra string decodificada. A regra de codificação é a seguinte: caracteres repetidos 
na string original são substituídos por um único caractere seguido pelo número de repetições (um, no caso de 
caracteres não repetidos). 
Exemplo. Se a instrução, 
print expandeStringCodificada("a1b2c3d4e5") 
for executada, seu programa deverá gerar como saída: 
abbcccddddeeeee 
 
 
# -*- coding: cp1252 -*- 
def expandeStringCodificada(str): 
 # começa com uma string vazia e constroi progressivamente o resultado 
 resultado = "" 
 # percorre a string codificada de dois em dois caracteres 
 for i in range(0, len(str), 2): 
 letra = str[i] # pega o primeiro caracter no par (letra) 
 digito = str[i + 1] # pega o segundo caracter no par (digito) 
 num = ord(digito) - ord('0') # converte o caracter digito em um número 
 # acrescenta o número apropriado de cópias do primeiro caracter ao 
 # resultado para decodificar corretamente a string de entrada 
 for j in range(num): 
 resultado += letra 
 return resultado 
 
ou, 
 
def expandeStringCodificada2(str): 
 # começa com uma string vazia e constroi progressivamente o resultado 
 resultado = "" 
 # percorre a string codificada de dois em dois caracteres 
 for i in range(0, len(str), 2): 
 letra = str[i] # pega o primeiro caracter no par (letra) 
 digito = str[i + 1] # pega o segundo caracter no par (digito) 
 num = int(digito) # converte o caracter digito em um número 
 # acrescenta o número apropriado de cópias do primeiro caracter ao 
 # resultado para decodificar corretamente a string de entrada 
 for j in range(num): 
 resultado += letra 
 return resultado 
 
ou ainda, 
 
def expandeStringCodificada2(str): 
 # começa com uma string vazia e constroi progressivamente o resultado 
 resultado = "" 
 # percorre a string codificada de dois em dois caracteres 
 for i in range(0, len(str), 2): 
 letra = str[i] # pega o primeiro caracter no par (letra) 
 digito = str[i + 1] # pega o segundo caracter no par (digito) 
 num = int(digito) # converte o caracter digito em um número 
 # acrescenta o número apropriado de cópias do primeiro caracter ao 
 # resultado para decodificar corretamente a string de entrada 
 resultado += letra*num 
 return resultado 
 
ou ainda, 
 
def expandeStringCodificada2(str): 
 # começa com uma string vazia e constroi progressivamente o resultado 
 resultado = "" 
 # percorre a string codificada de dois em dois caracteres 
 for i in range(0, len(str)): 
 if str[i].isalpha(): 
 letra = str[i] # pega o primeiro caracter no par (letra) 
 digito = str[i + 1] # pega o segundo caracter no par (digito) 
 num = int(digito) # converte o caracter digito em um número 
 # acrescenta o número apropriado de cópias do primeiro caracter ao 
 # resultado para decodificar corretamente a string de entrada 
 resultado += letra*num 
 return resultado 
Questão 3: Ajudando um novato (3.0 pontos) 
Considere o programa a seguir. Seu amigo, iniciante em Python, está convencido de que o programa 
imprimirá 7. Explique a ele porque ele está equivocado. Sua explicação deve descrever o que de fato ocorre 
na memória do computador, instrução a instrução, durante a execução do programa. Tente explicar ainda 
qual foi, provavelmente, o raciocínio de seu amigo que o levou a pensar que a saída impressa pelo programa 
seria o número sete e que modificações seriam necessárias para que o programa efetivamente mostrasse a 
saída esperada por ele. 
def funcao1(i, j): 
 i += j 
 return i 
 
i = 3 
j = 4 
funcao1(i, j) 
print i 
 
 
Vamos acompanhar a evolução da pilha durante a execução do programa: 
 
a) antes da chamada da função funcao1() 
 
 
b) no início da execução de funcao1() 
 
 
c) antes do return de funcao1() 
` 
main 
i = 3 
j = 4 
main 
i = 3 
j = 4 
funcao1 
i = 3 
j = 4 
main 
i = 3 
j = 4 
funcao1 
i = 3 7 
j = 4 
d) durante o return de funcao1() 
 
e) na volta ao programa principal 
 
 
Meu amigo provavelmente pensou que a instrução return i modificaria a variável i no programa 
principal. Para que isso acontecesse, ele teria de alterar o programa principal para: 
 
 i = 3 
 j = 4 
 i = funcao1(i, j) 
 print i 
 
 
 
 
7 
main 
i = 3 
j = 4 
funcao1 
i = 3 7 
j = 4 
main 
i = 3 
j = 4

Continue navegando