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