|
| 1 | += Exame Final Programação Funcional - SisNet - IFTO |
| 2 | +Prof. Dr. Manoel Campos |
| 3 | +:pagenums: |
| 4 | +:source-highlighter: rouge |
| 5 | + |
| 6 | +Nome Completo: |
| 7 | + |
| 8 | +''' |
| 9 | + |
| 10 | +== Regras para avaliação do exame |
| 11 | + |
| 12 | +Antes de proseguir, coloque seu nome na parte superior da prova. |
| 13 | + |
| 14 | +Todas as regras abaixo devem ser seguidas para que o exame seja avaliado. *Se qualquer uma dessas regras deixar de ser seguida, sua prova não será avaliada e você receberá nota zero.* |
| 15 | + |
| 16 | +1. Não pode existir qualquer erro de compilação no seu código. Se existirem erros de sintaxe que impediriam a compilação, a questão não será avaliada. |
| 17 | +1. Se forem identificados códigos idênticos ou muito semelhantes entre estudantes, a nota final de todos os envolvidos será zero. |
| 18 | +1. *Todo o código deve utilizar programação funcional*, com Streams e Lambdas onde for possível. Código estruturado que poderia ter sido escrito de forma funcional será ignorado. |
| 19 | +1. O código funcional deve utilizar as melhores práticas indicadas nas aulas, incluindo imutabilidade, lambdas pequenas e que tenham apenas uma responsabilidade. |
| 20 | +1. Todas as páginas entregues devem estar numeradas e terem seu nome completo. |
| 21 | + |
| 22 | +Por fim, você pode responder o exame usando lápis, mas neste caso, não serão aceitas reclamações após a entrega das notas. |
| 23 | + |
| 24 | +== Código base para resolução das questões |
| 25 | + |
| 26 | +Considere que você tem as classes abaixo para resolver as questões a seguir. |
| 27 | +Não foram exibidos getters e setters por simplificação, mas considere que tais métodos existem no momento de escrever seu código. |
| 28 | + |
| 29 | +[source,java] |
| 30 | +---- |
| 31 | +public class Campus { |
| 32 | + private int id; |
| 33 | + private String nome; |
| 34 | +} |
| 35 | +
|
| 36 | +public class Curso { |
| 37 | + private int id; |
| 38 | + private String nome; |
| 39 | + private int semestres; |
| 40 | + private Campus campus; |
| 41 | +} |
| 42 | +
|
| 43 | +public class Estudante { |
| 44 | + private int id; |
| 45 | + private String nome; |
| 46 | + private char sexo; |
| 47 | + private double nota; |
| 48 | + private int anoGraduacao; |
| 49 | + private Curso curso; |
| 50 | +} |
| 51 | +---- |
| 52 | + |
| 53 | +Considere ainda que: |
| 54 | + |
| 55 | +- Você tem um variável `List<Estudante> estudantes` que possui uma lista de estudantes qualquer (os dados de fato na lista e quantos estudantes existem não importam). Tal lista deve ser usada para resolver as questões a seguir. |
| 56 | +- Podem existir estudantes que não estejam matriculados em um curso e tal atributo pode ser `null`. Assim, seu código deve evitar `NullPointerException` em todas as questões. |
| 57 | + |
| 58 | +== Questão 1 (1,0 ponto) |
| 59 | + |
| 60 | +Implemente um código para imprimir a média de notas dos estudantes matriculados no curso de ID 1, que tenham nota menor que 4. |
| 61 | + |
| 62 | +== Questão 2 (2,0 pontos) |
| 63 | + |
| 64 | +Implemente um código para imprimir o nome dos cursos que tenham estudantes matriculados com nota maior que 7, sem repetir o nome do curso. |
| 65 | + |
| 66 | +== Questão 3 (2,0 pontos) |
| 67 | + |
| 68 | +Implemente um código para imprimir o estudante com a maior nota do curso de ID 2. |
| 69 | +Utilize a operação `reduce()` que recebe uma lambda do tipo `BinaryOperator`. |
| 70 | +Tal lambda a ser passada para o `reduce()` deve ter 2 parâmetros `e1` e `e2`, que são dois estudantes a serem comparados. A lambda deve retornar o estudante com a maior nota entre os dois. |
| 71 | +O resultado do `reduce()` é um `Optional<Estudante>`. |
| 72 | +Você deve garantir que, se nenhum estudante for encontrado, será lançada uma exceção |
| 73 | +para indicar tal situação. |
| 74 | + |
| 75 | +== Questão 4 (2,0 pontos) |
| 76 | + |
| 77 | +Implemente um código para imprimir os estudantes que estejam matriculados em cursos de 6 semestres, ordenados pelo curso em ordem crescente e por nota em ordem descrescente. |
| 78 | + |
| 79 | +== Questão 5 (3 pontos) |
| 80 | + |
| 81 | +Crie uma interface funcional chamada `MediaNota`, que tenha um método `calcular`: |
| 82 | + |
| 83 | +- com o parâmetro `double notas[]` representando um vetor de notas de diferentes estudantes |
| 84 | +- e retorne um `double` representando a média a ser calculada para as notas recebidas. |
| 85 | + |
| 86 | +Uma interface funcional é qualquer uma que tenha apenas um método abstrato. No entanto, é preciso usar um recurso de Java para garantir que a interface continue como funcional. |
| 87 | + |
| 88 | +Esta interface representa uma operação de cálculo de média que pode ser implementada para média artimética, média ponderada ou qualquer outro tipo. Sendo uma interface funcional, ela pode ser usada para implementar tal cálculo de algum tipo de média usando uma expressão lambda. |
| 89 | + |
| 90 | +Crie um método `imprimirMediaAlunosCurso(MediaNota calculaMedia)` que internamente obtém o vetor de notas dos estudantes do curso de ID 2. O método criado deve usar o parâmetro funcional `calculaMedia` para calcular a média de todos estes estudantes e imprimir o resultado. |
| 91 | + |
| 92 | +Além da interface que você deve criar, seu código deve ser algo como: |
| 93 | + |
| 94 | +[source, java] |
| 95 | +---- |
| 96 | +void questao5() { |
| 97 | + // Chame o método imprimirMediaAlunosCurso aqui, |
| 98 | + // passando uma lambda para calcular a média aritmética das notas |
| 99 | + // dos alunos indicados no enunciado da questão. |
| 100 | +} |
| 101 | +
|
| 102 | +void imprimirMediaAlunosCurso(MediaNota calculaMedia){ |
| 103 | + // Uma variável local vetorNotas deve receber um vetor com |
| 104 | + // as notas dos estudantes indicados no enunciado. |
| 105 | + // Use o parâmetro calculaMedia para calcular e imprimir a média |
| 106 | +} |
| 107 | +---- |
0 commit comments