MC346 - Prova Python

      Criada: 2017-12-01
      Modificada: 2017-12-02 (Questões 1 e 2 - Critérios)
      Modificada: 2017-12-03 (Questões 3 e 4 - Critérios)
    

Enunciado distribuído na sala.

Gabarito

### q.1

def linhas(filename):
    try:
        f = open(filename)
    except IOError:
        return 'falha ao abrir'
    else:
        l = 0
        try:
            for linha in f:
                l += 1
        except IOError:
            return 'falha ao ler'
        finally:
            f.close()
        return l

### q.2

def split(d, p):
    d1 = {}
    d2 = d
    for i in p:
        if i in d:
            d1[i] = d[i]
            del d[i]
    return d1, d2

### q.3 e q.4: classe Polinomio

class Polinomio:
    coefs = []
    
    def __init__(self, lista):
        self.coefs = lista

    def grau(self):
        g = len(self.coefs) - 1
        while g >= 0 and self.coefs[g] == 0:
            del self.coefs[g]
            g -= 1
        return g

    def escalar(self, a):
        for i, v in enumerate(self.coefs):
            self.coefs[i] = a*v

### q.3

    ## Função auxiliar: soma deslocada com escalar
    
    def somadescal(p, q, k, a):
        lp = p.grau() + 1
        lq = q.grau() + 1
        for i in range(lq):
            if i + k < lp:
                p.coefs[i + k] += a * q.coefs[i]
            else:
                p.coefs.append(a * q.coefs[i])

    ## Função pedida

    def soma(self, q):
        self.somadescal(q, 0, 1)

### q.4

    ## Usa função auxiliar da q.3
		       
    def produto(self, q):
        paux = self.coefs
        self.coefs = []
        for i, v in enumerate(paux):
            self.somadescal(q, i, v)

Critérios de correção

Em todas as questões, o critério de correção começou por decidir como seria a pontuação: de cima para baixo ou de baixo para cima. Se a resposta estava bem escrita, com sintaxe Lisp correta, resolução do problema pedido (e não de outro) e com comprimento proporcional à complexidade da questão, então a correção procedeu de cima para baixo, ou seja, parte-se do valor integral e vão sendo subtraidas frações de pontos para cada defeito encontrado.

Por outro lado, se a resposta estava mal escrita, com sintaxe errada, resolvendo o problema errado ou incompleta, então a correção procedeu de baixo para cima: parte-se de zero e vão sendo adicionadas frações de pontos a cada indício de conhecimento importante encontrado.

A seguir, critérios específicos para cada questão. Os valores negativos se aplicam à correção de cima para baixo, e os valores positivos ou nulos se aplicam à correção de baixo para cima.

Questão 1

I/O fora de try -0,5
tratamento antes da exceção -0,5
não fechou, ou fechou após return -0,5
usou print em lugar de return -0,5
não retorna o número de linhas -0,5
catch em lugar de except -0,5
função não existente (para cada função) -0,5
Nil em vez de None -0,5
esqueceu def -0,5
except após else em try -0,5

leu tudo de uma vez -0,2
nomes das exceções -0,0

Questão 2

estratégia falha -0,5
função, método ou operação não definida -0,5
uso de {:} -0,5
falta de parênteses -0,5
falta de .items() -0,5
falta de for em list compehension -0,5
erro em inicialização -0,5
usoerrôneo de key -0,5
uso de append com dicionário -0,5
faltou return -0,5
tentativa de acesso com chave inexistente -0,5
keys(d) em vez de d.keys() -0,5

ineficiência -0,2
item em vez de items -0,1

Questão 3

acesso a posição não existente -1,0
não copia possível rabeira de q -1,0
não modifica self -0,5
não usou self -0,5
loop infinito -0,5
erro em assinatura de método -0,5
erro em chamada de método -0,5
confusão entre > e &lq; -0,5
confusão entre índice e valor -0,5
confusão entre grau e tamanho do vetor de coeficientes -0,5
confusão entre objeto e componente: até -0,5
soma coeficientes de self consigo mesmo -0,5
esqueceu colchetes -0,5

esqueceu .coefs -0,2
append em lugar de extend -0,2
extends em lugar de extend -0,1

Questão 4

acesso a posição inexistente -1,0
ignora coeficientes negativos -1,0
substitui em vez de somar parciais -0,5
erro em grau do produto -0,5
criação de Polinomio sem passar lista -0,5
repeat em vez de [0]*i -0,5
confusão entre + e * -0,5
compartilha objecto onde deveria copiar -0,5
falta ou sobra de 1 unidade -0,5
esqueceu de zerar self.coefs -0,5
confusão entre , e ; -0,5
erro em teste de índice, ou em índice -0,5
m-- em vez de m -= 1 -0,5
faltaram colchetes -0,5
não deslocou -0,5
não modifica self -0,5
ignorou elementos de índice zero -0,5
faltou self. -0,5

usou append em lugar de extend -0,2
faltou .coefs -0,2

sabe que tem que escalar e deslocar +0,5
só sabe grau, aproximado +0,1


MC346 Home

© 2017 João Meidanis