aluno: Francisco Germano Batista da Silva Júnior
ano/sem: 2008/2o.
data do laboratório (num. da semana) : 25/08/2008 (5)
Introdução
Neste laboratório foi desenvolvido um programa que simula a entrega de relatórios por alunos e a correção deles por um professor. Para isso foram desenvolvidas quatro classes: classe Aluno (abstrata), classe Professor, classe Relatório e classe RelaQueue. Da super classe abstrata Aluno foram criadas duas subclasses, AlunoSafoPreguicoso e AlunoEsforçado, para representar dois tipos diferentes de alunos.
Desenvolvimento
O diagrama de classes final do aplicativo desenvolvido foi o seguinte:
Os testes foram executados da maneira correta como ilustrado na figura a seguir
Também foram criadas instâncias manualmente para testarmos essa funcionalidade do BlueJ.
O código de cada uma das classes utilizadas na aplicação
Classe Aluno (abstrata)
import java.util.*; // Classe que define os alunos que farão os relatorios a ser entregues. public abstract class Aluno { // instance variables private int conhecimento=0; protected String nome; protected double inteligencia; protected double dedicacao; public RelaQueue queue; /** * fazEEntregaRelatorio cria um relatorio, o coloca na fila de entrega e aumenta o conhecimento do aluno. * getConhecimento retorna o conhecimento do aluno * getInteligencia retorna a inteligencia do aluno * getDedicacao retorna a dedicação do aluno * getNome retorna o nome do aluno */ public void fazEEntregaRelatorio(){ double qualidade = (2 * this.getDedicacao() + 1 * this.getInteligencia() ) / 3 ; double originalidade = (1 * this.getDedicacao() + 2 * this.getInteligencia() ) / 3 ; Relatorio rela = new Relatorio(qualidade, originalidade, this); conhecimento++; queue.queue(rela); } public int getConhecimento() { return conhecimento; } public String getNome() { return nome; } public double getInteligencia() { return inteligencia; } public double getDedicacao() { return dedicacao; } }
Classe AlunoSaforPreguicoso
import java.util.*; //Classe que representa os alunos que são safos e preguiçosos public class AlunoSafoPreguicoso extends Aluno { /** * AlunoSafoPreguicoso construtor da classe aluno safo */ public AlunoSafoPreguicoso(String str, RelaQueue fila) { this.nome=str; this.queue=fila; inteligencia=1; } // Método getDedicação sobreescrição do método getDedicação da classe aluno public double getDedicacao() { Random qualquer=new Random(); dedicacao=qualquer.nextDouble()*0.5; return dedicacao; } }
Classe AlunoEsforcado
//Classe que representa os alunos dedicados
public class AlunoEsforcado extends Aluno
{
/**
* Constructor for objects of class AlunoDedicado
*/
public AlunoEsforcado(String str, RelaQueue fila)
{
nome=str;
queue=fila;
inteligencia=0.5;
dedicacao=1;
}
}
Classe Relatorio
//Classe que representa os relatorios feitos pelos alunos
public class Relatorio
{
// instance variables
private double qualidade;
private double originalidade;
private Aluno aluno;
/**
* Constructor for objects of class Relatorio
*/
public Relatorio(double qld, double ori, Aluno al)
{
this.qualidade=qld;
this.originalidade=ori;
this.aluno=al;
}
/**
* getAluno retorna o aluno que fez o relatorio
* getQualidade retorna a qualidade do relatorio
* getOriginalidade retorna a originalidade do relatorio
*/
public double getQualidade(){
return qualidade;}
public double getOriginalidade(){
return originalidade;}
public Aluno getAluno(){
return aluno;}
}
Classe RelaQueue
//Fila de relatórios entregue pelos alunos e que serão corrigidos pelo professor
public class RelaQueue
{
// instance variables
private Relatorio[] array = new Relatorio[10];
private int inicio=0;
private int fim=0;
/**
Metódo queue coloca um relatório na fila de relatórios.
Método dequeue retira um relatório da fila de relatórios (caso exista algum elemento na fila).
*/
public void queue(Relatorio rela)
{
array[fim]= rela;
fim=(fim+1)%10;
}
public Relatorio dequeue()
{
if(inicio==fim)
return null;
else{
Relatorio rela= array[inicio];
inicio=(inicio+1)%10;
return rela;
}
}
}
Classe Professor
import java.util.*;
// Classe que representa os professores que corrigem os relatórios.
public class Professor
{
// instance variables
RelaQueue queue;
/**
* Constructor for objects of class Professor
*/
public Professor(RelaQueue fila)
{
this.queue=fila;
}
/**
* corrigirRelatorio corrige um relatorio, o retira da fila e retorna a sua nota
* corrigirRelatorios corrige todos os relatorios da fila e apresenta suas notas na tela
*/
private double corrigirRelatorio(Relatorio rela){
Random qualquer=new Random();
double nota = ( rela.getQualidade() + rela.getOriginalidade() + qualquer.nextFloat()) / 3 * 10;
return nota;
}
public void corrigirRelatorios(){
Relatorio temp=queue.dequeue();
while(temp!=null){
System.out.print(temp.getAluno().getNome());
System.out.print(": ");
System.out.println(this.corrigirRelatorio(temp));
temp=queue.dequeue();
}
}
}
Conclusão
O laboratório serviu como primeiro contato com a linguagem Java e os conceitos de orientação a objetos (herança, polimorfismo, encapsulamento, construtores). A abordagem adota no curso de fornecer uma classe de exemplo foi muito útil para quem não possuia experiência nesse tipo de programação, agilizando bastante o processo de aprendizado.
Destaco como pontos principais do laboratório:
- A utilização do diagrama de classes (UML) para orientar o desenvolvimento do programa.
- A aplicação dos conceitos de classe abstrata, super classe e subclasses.
- A criação de métodos construtores para as diversas classes.
- Diferenciação no nível de acesso, por exemplo temos os métodos da classe Professor (corrigirRelatorio é um método privado e corrigirRelatorios é um método público).
Algumas sugestões para a melhorar a aplicação são:
- Desenvolvimento de trabalhos em grupo. Esse tipo de trabalho seria similar a um relatório (podendo ter os atributos qualidade e originalidade também) sendo que vários alunod deveriam ser relacionados ao trabalho e na hora da correção o professor deverá dar nota a todos os alunos.
- O atributo conhecimento deveria ser levado em conta na hora da confecção do relatório, sendo um pré-requisito para a confecção de relatórios mais complexos (criar atributo para o relatório que seria, complexidade do relatório).
- Novo método aprender poderia ser criado para os alunos de maneira que assim eles aumentassem o seu conhecimento e fossem capazes de realizar os relaórios mais difíceis.
Com o conteudo aprendido neste laboratório já é possível a criação de aplicações simples OO, sendo portanto de extrema utilidade.






Não implementou getInteligencia() e getDedicação() como abstratos (fugiu da especificação do diagrama UML).
Boa conclusão e rela.