## 4. Crie uma função que recebe duas listas como parâmetros e agrupe os elementos um a um das listas, formando uma lista de tuplas de 3 elementos, no qual o primeiro e segundo elemento da tupla são os valores na posição i das listas e o terceiro elemento é a soma dos valores na posição i das listas. A função deve conter um tratamento de erro indicando o tipo de erro gerado e retornar como resultado a lista de tuplas. Caso as listas enviadas como parâmetro tenham tamanhos diferentes, a função deve retornar um IndexError com a frase: 'A quantidade de elementos em cada lista é diferente.' Dados para testar a função:
# Listas
#lista1 = [4,6,7,9,10]
#lista2 = [-4,6,8,7,9]
#lista1 = [4,6,7,9,10,4]
#lista2 = [-4,6,8,7,9]
lista1 = [4,6,7,9,'A']
lista2 = [-4,'E',8,7,9]
def agrupar_listas(lista1, lista2):
try:
# Verifica se as listas têm o mesmo tamanho
if len(lista1) != len(lista2):
# Lança um erro personalizado se os tamanhos forem diferentes
raise IndexError('A quantidade de elementos em cada lista é diferente.')
resultado = [] # Lista que armazenará as tuplas com os valores e suas somas
# Percorre os elementos das listas simultaneamente
for i in range(len(lista1)):
a = lista1[i] # Elemento da lista1 na posição i
b = lista2[i] # Elemento da lista2 na posição i
soma = a + b # Soma os dois elementos (pode gerar erro se não forem números)
resultado.append((a, b, soma)) # Adiciona a tupla (a, b, soma) à lista de resultado
return resultado # Retorna a lista final de tuplas
# Trata o caso em que as listas têm tamanhos diferentes
except IndexError as ie:
print(f'Erro de índice: {ie}')
# Trata o caso em que ocorre erro de tipo (por exemplo, tentar somar número com string)
except TypeError as te:
print('Erro de tipo: Só é possível somar números. '
'Verifique se todos os elementos das listas são inteiros ou reais.')
# Trata qualquer outro erro inesperado
except Exception as e:
print(f'Erro inesperado: {type(e).__name__}: {e}')
# Este bloco é sempre executado, mesmo que ocorra um erro
finally:
print('A execução da função foi finalizada.')
# Chamada da função
resultado = agrupar_listas(lista1, lista2)
# Exibe o resultado, se não houver erro
if resultado:
print(resultado)
## 5. Como desafio, você recebeu a tarefa de desenvolver um código que contabiliza as pontuações de estudantes de uma instituição de ensino de acordo com suas respostas num teste. Este código deve ser testado para um exemplo de 3 estudantes com uma lista de listas em que cada lista possui as respostas de 5 questões objetivas de cada estudante. Cada questão vale um ponto e as alternativas possíveis são A, B, C ou D.
# Dados do Gabarito
gabarito = ['D', 'A', 'B', 'C', 'A']
respostas_validas = {'A', 'B', 'C', 'D'}
# Dicionário Aluno/Resposta
aluno_respostas = {
'Aluno 1': ['D', 'A', 'B', 'C', 'A'],
'Aluno 2': ['C', 'A', 'A', 'C', 'A'],
'Aluno 3': ['D', 'B', 'A', 'C', 'A']
}
#aluno_respostas = {
# 'Aluno 1': ['D', 'A', 'B', 'C', 'A'],
# 'Aluno 2': ['C', 'A', 'A', 'E', 'A'],
# 'Aluno 3': ['D', 'B', 'A', 'C', 'Z']
#}
# Calcular a nota de cada aluno (1 ponto por questão correta)
def calcular_nota(respostas_aluno, gabarito):
return sum(1 for r, g in zip(respostas_aluno, gabarito) if r == g)
# Verifica entradas inválidas e acumula mensagens de erro
def validar_respostas(aluno_respostas, gabarito, respostas_validas):
erros = []
for aluno, respostas in aluno_respostas.items():
if len(respostas) != len(gabarito):
erros.append(f'{aluno}: número de respostas inválido ({len(respostas)} em vez de {len(gabarito)})')
continue
for i, resposta in enumerate(respostas):
if resposta not in respostas_validas:
erros.append(
f'{aluno} - Questão {i + 1}: A alternativa "{resposta}" não é uma opção de alternativa válida'
)
if erros:
raise ValueError('\n'.join(erros))
# Exibir resultados
def exibir_resultados(aluno_respostas, gabarito):
try:
validar_respostas(aluno_respostas, gabarito, respostas_validas)
for aluno, respostas in aluno_respostas.items():
nota = calcular_nota(respostas, gabarito)
print(f'{aluno}: {nota} ponto(s)')
except ValueError as e:
print('Erro(s) detectado(s):')
print(e)
# Executar
exibir_resultados(aluno_respostas, gabarito)