Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

[Sugestão] Python_04_Lidando_com_Exceções Atividade 04/05

## 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)
1 resposta
solução!

Ei, Marinaldo!

Você organizou muito bem os tratamentos de erro na função agrupar_listas e também no desafio de correção de respostas. Ficou claro e funcional.

Parabéns por toda dedicação que está tendo ao estudar e praticar, você vai longe!

Continue assim e qualquer dúvida, conte conosco.

Alura Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!