Skip to content

Commit 82d08fc

Browse files
committed
Exame final
Signed-off-by: Manoel Campos <[email protected]>
1 parent 1c27117 commit 82d08fc

File tree

9 files changed

+632
-0
lines changed

9 files changed

+632
-0
lines changed

exame-final/.gitignore

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
target/
2+
!.mvn/wrapper/maven-wrapper.jar
3+
!**/src/main/**/target/
4+
!**/src/test/**/target/
5+
6+
### IntelliJ IDEA ###
7+
.idea/modules.xml
8+
.idea/jarRepositories.xml
9+
.idea/compiler.xml
10+
.idea/libraries/
11+
*.iws
12+
*.iml
13+
*.ipr
14+
15+
### Eclipse ###
16+
.apt_generated
17+
.classpath
18+
.factorypath
19+
.project
20+
.settings
21+
.springBeans
22+
.sts4-cache
23+
24+
### NetBeans ###
25+
/nbproject/private/
26+
/nbbuild/
27+
/dist/
28+
/nbdist/
29+
/.nb-gradle/
30+
build/
31+
!**/src/main/**/build/
32+
!**/src/test/**/build/
33+
34+
### VS Code ###
35+
.vscode/
36+
37+
### Mac OS ###
38+
.DS_Store

exame-final/README.adoc

Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
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+
----

exame-final/pom.xml

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns="http://maven.apache.org/POM/4.0.0"
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
5+
<modelVersion>4.0.0</modelVersion>
6+
7+
<groupId>ifto.progfuncional</groupId>
8+
<artifactId>exame-final</artifactId>
9+
<version>1.0.0</version>
10+
11+
<properties>
12+
<maven.compiler.source>17</maven.compiler.source>
13+
<maven.compiler.target>17</maven.compiler.target>
14+
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
15+
</properties>
16+
</project>
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package exame;
2+
3+
/**
4+
* Representa um campus de uma instituição de ensino.
5+
*
6+
* @author Manoel Campos da Silva Filho
7+
*/
8+
public class Campus {
9+
private int id;
10+
private String nome;
11+
12+
public Campus(){}
13+
14+
public Campus(int id, String nome){
15+
this.id = id;
16+
this.nome = nome;
17+
}
18+
19+
public int getId() {
20+
return id;
21+
}
22+
23+
public void setId(int id) {
24+
this.id = id;
25+
}
26+
27+
public String getNome() {
28+
return nome;
29+
}
30+
31+
public void setNome(String nome) {
32+
this.nome = nome;
33+
}
34+
}
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
package exame;
2+
3+
/**
4+
* Representa um curso de uma instituição de ensino.
5+
*
6+
* @author Manoel Campos da Silva Filho
7+
*/
8+
public class Curso implements Comparable<Curso> {
9+
private int id;
10+
private String nome;
11+
private int semestres;
12+
private Campus campus;
13+
14+
public Curso(){
15+
}
16+
17+
public Curso(int id, String nome, int semestres, Campus campus){
18+
setId(id);
19+
setNome(nome);
20+
setSemestres(semestres);
21+
setCampus(campus);
22+
}
23+
24+
public int getId() {
25+
return id;
26+
}
27+
28+
public final void setId(int id) {
29+
this.id = id;
30+
}
31+
32+
public String getNome() {
33+
return nome;
34+
}
35+
36+
public final void setNome(String nome) {
37+
this.nome = nome;
38+
}
39+
40+
public int getSemestres() {
41+
return semestres;
42+
}
43+
44+
public final void setSemestres(int semestres) {
45+
this.semestres = semestres;
46+
}
47+
48+
public Campus getCampus() {
49+
return campus;
50+
}
51+
52+
private void setCampus(Campus campus) {
53+
this.campus = campus;
54+
}
55+
56+
@Override
57+
public String toString(){
58+
return String.format("Id: %6d Nome: %-30s Semestres: %4d", id, nome, semestres);
59+
}
60+
61+
@Override
62+
public int compareTo(Curso that) {
63+
return Long.compare(this.id, that.id);
64+
}
65+
}
Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
package exame;
2+
3+
/**
4+
* Representa um aluno em uma instituição de ensino.
5+
* Classe baseada no exemplo do <a href="https://apexapps.oracle.com/pls/apex/f?p=44785:145:0::::P145_EVENT_ID,P145_PREV_PAGE:4887,143">questoes.Curso JDK 8 MOOC: Lambdas and Streams Introduction</a>.
6+
*
7+
* @author Manoel Campos da Silva Filho
8+
*/
9+
public class Estudante {
10+
private int id;
11+
private String nome;
12+
private char sexo;
13+
private double nota;
14+
private int anoGraduacao;
15+
private Curso curso;
16+
17+
public Estudante(){
18+
}
19+
20+
/**
21+
* Cria um estudante.
22+
* Este construtor possui uma quantidade mais do que recomendável de parâmetros (3).
23+
* O mesmo é usado apenas para facilitar a geração de dados aleatórios,
24+
* mas é uma péssima prática em projetos reais.
25+
* No entanto, observe que o construtor não é público (é package),
26+
* não podendo ser usado fora do pacote.
27+
*
28+
* @param id matrícula do estudante
29+
* @param nome nome do estudante
30+
* @param sexo sexo do estudante
31+
* @param nota nota do estudante
32+
* @param anoGraduacao ano de graduação
33+
* @param curso curso matriculado
34+
*/
35+
Estudante(int id, String nome, char sexo, double nota, int anoGraduacao, Curso curso){
36+
setId(id);
37+
setNome(nome);
38+
setSexo(sexo);
39+
setNota(nota);
40+
setAnoGraduacao(anoGraduacao);
41+
setCurso(curso);
42+
}
43+
44+
public int getId() {
45+
return id;
46+
}
47+
48+
public final void setId(int id) {
49+
this.id = id;
50+
}
51+
52+
public String getNome() {
53+
return nome;
54+
}
55+
56+
public final void setNome(String nome) {
57+
this.nome = nome;
58+
}
59+
60+
public char getSexo() {
61+
return sexo;
62+
}
63+
64+
public final void setSexo(char sexo) {
65+
this.sexo = sexo;
66+
}
67+
68+
public boolean isHomem(){
69+
return sexo == 'M' || sexo == 'm';
70+
}
71+
72+
public boolean isMulher(){
73+
return sexo == 'F' || sexo == 'f';
74+
}
75+
76+
public boolean temCurso(){
77+
return curso != null;
78+
}
79+
80+
81+
public double getNota() {
82+
return nota;
83+
}
84+
85+
public final void setNota(double nota) {
86+
this.nota = nota;
87+
}
88+
89+
public int getAnoGraduacao() {
90+
return anoGraduacao;
91+
}
92+
93+
public final void setAnoGraduacao(int anoGraduacao) {
94+
this.anoGraduacao = anoGraduacao;
95+
}
96+
97+
public Curso getCurso() {
98+
return curso;
99+
}
100+
101+
public final void setCurso(Curso curso) {
102+
this.curso = curso;
103+
}
104+
105+
@Override
106+
public String toString(){
107+
final String courseName = String.format("%-35s", curso == null ? "" : "Curso: " + curso.getNome());
108+
return String.format(
109+
"Id: %6d Nome: %-30s Sexo: %c Nota: %5.2f Ano Grad: %4d %s",
110+
id, nome, sexo, nota, anoGraduacao, courseName);
111+
}
112+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package exame;
2+
3+
/**
4+
* @author Manoel Campos
5+
*/
6+
@FunctionalInterface
7+
public interface MediaNota {
8+
double calcular(double notas[]);
9+
}

0 commit comments

Comments
 (0)