aluno: Igor de Sousa Almeida
ano/sem: 2008/2o.
data do laboratório (num. da semana) : 06/08/2008 (2)
Introdução
A prática desse laboratório consistiu na implementação de um sistema simples de entrega de relatórios, no qual o professor atribui uma nota para os relatórios dependendo de certas propriedades de cada aluno mescladas com um fator randomico. Esse sistema foi implementado através de seis classes (RelaQueue, Professor, Relatorio, Aluno, AlunoEsforcado e AlunoSafoPreguicoso). A descrição de cada classe será mostrada no desenvolvimento desse relatório.
Desenvolvimento
Classe RelaQueue:
Essa classe é responsável por operações de empilhagem e desempilhagem na array de relatorios. Essa array pode conter no máximo 10 relatórios. No fim das correções, quando todos os relatórios tiverem sido desempilhados, é mostrada uma mensagem indicando o fim dos relatórios.
public class RelaQueue public class RelaQueue{ Relatorio[] array = new Relatorio[10]; int inicio = 0; int fim = 0; public void queue(Relatorio elem){ array[fim] = elem; fim = (fim + 1) % 10; } public Relatorio dequeue(){ Relatorio valor; if(array[inicio] == null){ System.out.println("Fim dos relatórios!"); valor = null; } else{ valor = array[inicio]; inicio = (inicio + 1) % 10; } return valor; } }
Classe Aluno:
É uma classe abstrata que vai servir para o desenvolvimentos das subclasses Alunoesforcado e AlunoSafoPreguicoso. Os métodos getInteligencia, getDedicacao e getNome apenas retornam os valores de inteligencia, dedicacao e a String com o nome do aluno. O método getConhecimento é responsável por aumentar o conhecimento do Aluno. O método fazEEntregaRelatorio empilha um relatório enviando uma mensagem para o objeto RelaQueue solicitando a utilização do método queue. Esse relatório possui originalidade e qualidade dependentes da inteligência e da dedicação do aluno. Além disso o aluno ganha conhecimento cada vez que entrega um relatório. Através da herança de classes, todas as subclasses dessa classe podem utilizar os seus métodos. Além disso, devido ao polimorfismo os objetos de uma subclasse podem sempre ser tratados como um objeto da superclasse.
public abstract class Aluno { int conhecimento = 0; String nome; RelaQueue queue; double inteligencia; double dedicacao; public Aluno(String nome, RelaQueue queue){ this.nome = nome; this.queue = queue; } public void fazEEntregaRelatorio(){ getConhecimento(); 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); queue.queue(rela); } public void getConhecimento(){ conhecimento = conhecimento + 1; } public double getInteligencia(){ return inteligencia; } public double getDedicacao(){ return dedicacao; } public String getNome(){ return nome; } }
Classe Aluno esforçado:
Subclasse da classe aluno, possui dedicação e inteligência pré-estabelecidos. Possui dois métodos getInteligencia e getDedicacao análogos aos da superclasse que apenas retornam os valores da inteligencia e dedicacao do Aluno.
public class AlunoEsforcado extends Aluno { double inteligencia = 0.5; double dedicacao = 1; public AlunoEsforcado(String nome, RelaQueue queue){ super(nome, queue); } public double getInteligencia(){ return inteligencia; } public double getDedicacao(){ return dedicacao; } }
Classe AlunoSafoPreguicoso:
Outra subclasse da classe Aluno, possui inteligência pré-estabelecida e métodos getInteligencia e getDedicacao, entretanto esse último retorna um valor randomico que varia de 0 até 0,5.
public class AlunoSafoPreguicoso extends Aluno { double inteligencia = 1; public AlunoSafoPreguicoso ( String nome, RelaQueue queue){ super(nome, queue); } public double getInteligencia(){ return inteligencia; } public double getDedicacao(){ double r = Math.random(); return r * 0.5; } }
Classe Relatorio:
Classe que representa os relatorios. Recebe como parâmetros a qualidade e originalidade do relatório e o nome do aluno que o produziu. Possui três métodos getQualidade, getOriginalidade e getAluno, que retornam, respectivamente, a qualidade e originalidade do trabalho e o aluno que o produziu.
public class Relatorio{ double qualidade; double originalidade; Aluno aluno; public Relatorio(double qualidade, double originalidade, Aluno aluno){ this.qualidade = qualidade; this.originalidade = originalidade; this.aluno = aluno; } public double getQualidade(){ return qualidade; } public double getOriginalidade(){ return originalidade; } public Aluno getAluno(){ return aluno; } }
Classe Professor:
Classe responsável por receber os relatórios e atribuir notas para os mesmos. Possui um método privado corrigirRelatorio que dá nota aos relatórios através da sua qualidade, da sua originalidade e de um fator randomico, e retorna essa nota. Possui outro método corrigirRelatorios que, utilizando um objeto RelaQueue, corrige todos os relatórios da array e coloca o nome do aluno e a sua respectiva nota na tela de saída.
public class Professor { RelaQueue queue; public Professor(RelaQueue queue){ this.queue = queue; } private double corrigirRelatorio(Relatorio rela){ double nota = ( rela.getQualidade() + rela.getOriginalidade() + Math.random() ) / 3 * 10; return nota; } public void corrigirRelatorios(){ Relatorio rela = queue.dequeue(); while(rela != null){ System.out.print("" +rela.getAluno().nome); System.out.println(" : " +this.corrigirRelatorio(rela)); rela = queue.dequeue(); } } }
Classe Test:
Classe do tipo Unit Test responsável por criar quatro alunos e corrigir seus relatórios.
public class Test extends junit.framework.TestCase { public void test() { //criando os objetos RelaQueue queue = new RelaQueue(); Professor prof = new Professor(queue); AlunoEsforcado aluno1 = new AlunoEsforcado("John Smith", queue); AlunoEsforcado aluno2 = new AlunoEsforcado("Mark Smith", queue); AlunoSafoPreguicoso aluno3 = new AlunoSafoPreguicoso("Joseph Smith", queue); AlunoSafoPreguicoso aluno4 = new AlunoSafoPreguicoso("Robert Smith", queue); //teste de alunoesforcado assertEquals(0.5, aluno1.getInteligencia(), 0.01); assertEquals(1, aluno1.getDedicacao(), 0.01); //teste de alunosafo assertEquals(1.0, aluno3.getInteligencia(), 0.01); assertTrue(aluno3.getDedicacao() != aluno3.getDedicacao()); //deve ser randomica assertTrue(aluno3.getDedicacao() < 0.5); //alunos comecam a fazer os relas aluno1.fazEEntregaRelatorio(); //roubamos o relatório do primeiro aluno para investigá-lo Relatorio rela1 = queue.dequeue(); assertEquals(aluno1, rela1.getAluno()); assertTrue(rela1.getAluno().getNome().equals("John Smith")); assertTrue(rela1.getQualidade() < 0.9); assertTrue(rela1.getQualidade() > 0.8); assertTrue(rela1.getOriginalidade() < 0.7); assertTrue(rela1.getOriginalidade() > 0.6); //os outros continuam a fazer os relas aluno2.fazEEntregaRelatorio(); aluno3.fazEEntregaRelatorio(); aluno4.fazEEntregaRelatorio(); //deve exibir a coreção dos relas dos aluno2, aluno3, e aluno4, nesta ordem //pois "roubamos" o relatório do aluno1 prof.corrigirRelatorios(); } }
Diagrama de Classes no BlueJ:
Testes realizados:
Anexe o arquivo com código nesta página.
Conclusão
As principais funções desse laboratório foram implementar os conceitos de orientação a objeto, vistos em sala, e se familiarizar com os comando da linguagem Java.
Faltou implementar getDedicacao() e getInteligencia() como abstratos, como especificado.