Programação Funcional UFOP DECOM 2014.1 Trabalho 2 Correção de provas de múltipla escolha Resumo Com esta atividade pretende-se explorar a construção de programas interativos que processam arquivos e funções com listas. Será desenvolvida uma aplicação para correção de provas de múltipla escolha. Sumário 1 Correção de provas de múltipla escolha 1 1 Correção de provas de múltipla escolha Vamos escrever um programa em Haskell para corrigir provas de múltipla escolha que foram aplicadas para uma turma de alunos. Os dados de entrada deverão ser obtidos de um arquivo texto. O nome deste arquivo deve ser informado como um argumento da linha de comando. O arquivo de entrada deve conter: • o gabarito (as respostas corretas de cada questão) da prova: primeira linha do arquivo de entrada • a matrícula e as respostas de cada aluno da turma: demais linhas do arquivo de entrada Exemplo de entrada: 10014 10310 40010 20101 20200 20330 30355 a a b a a c a e b b b a b b b b c c a a d d c e a b a a e b b c c c a a c c d c d b d a b e b e a e a a b a a a e e e a e e e e a a a a a a a a c c c a a c c d a a a a a a a a b d b a b b b d As notas devem ser normalizadas na faixa de zero a dez. Assim para calcular a nota obtida em uma prova, divida a soma dos pontos obtidos (um ponto para cada resposta correta) pelo número de questões na prova, e multiplique o resulado por dez. Um aluno será aprovado se e somente se sua nota for igual ou superior a sete. O programa deve calcular e mostrar: • a matrícula, a nota e a situação (aprovado ou reprovado) de cada aluno, e • a taxa (em porcentagem) de aprovação. Tarefa 1 Defina o módulo Main que exporta a variável main. 1 Tarefa 2 Defina a ação de E/S main que, quando executada, interage com o mundo para obter os dados do arquivo de entrada e calcular e mostrar os resultados, e retorna a tupla vazia. Mais especificamente, as ações de main são: 1. cancelamento da bufferização da saída padrão, 2. obtenção dos argumentos da linha de comando 3. análise dos argumentos da linha de comando: • caso seja uma lista unitária, o único elemento da lista é o nome do arquivo; neste caso deve-se processar o arquivo usando a função processaArquivo do item 3. • caso contrário deve-se emitir uma mensagem de erro adequada Tarefa 3 Defina a função processaArquivo que recebe o nome do arquivo de entrada e resulta em uma ação de E/S que, quando executada: 1. lê todo o conteúdo do arquivo de entrada, obtendo-se uma string, 2. processa os dados lidos fazendo a correção das provas (calculando a nota e a situação de cada aluno), usando a função processa do item 4, e 3. exibe os resultados obtidos usando a função exibeResultados do item ??, e retorna a tupla vazia. Tarefa 4 Defina a função processa que recebe uma string formada pelos dados a serem processados e produz o resultado da correção das provas. Sugestão: 1. quebre a string de entrada nas mudanças de linha, obtendo assim uma lista de strings 2. analise o resultado: • caso seja uma lista não vazia, a cabeça da lista corresponde ao gabarito e a cauda da lista corresponde às respostas das provas dos alunos: – para obter as soluções divida a string do gabarito em palavras; – para obter as respostas das provas, divida cada string correspondente a uma prova em palavras; a primeira palavra é a identificação do aluno e as demais palavras são as respostas da prova; use map para mapear a função words na lista das provas; use a função corrigeProvas do item 5 para corrigir as provas. • caso contrário a entrada e o resultado deve ser a lista vazia. Tarefa 5 Defina a função corrigeProvas que recebe o gabarito e a lista das provas e resulta na lista dos resultados da correção. Use a função map para mapear a função do item 6 (que corrige uma prova) na lista de provas. Faça uma aplicação parcial da função corrige do item 6. Tarefa 6 Defina a função corrige que recebe o gabarito e a prova a ser corrigida e corrige a prova resultando em uma tripla com a identificação do aluno, a nota obtida na prova, e a situação (aprovado ou reprovado). 2