aluno: Nome do Aluno
ano/sem: 2008/2o.
data do laboratório (num. da semana) : 06/08/2008 (2)
Introdução
O programa realizado simula os comportamentos de dois tipos de aluno, o esforçado e o aluno safo preguiçoso, além dessa simulação é feita uma simulação de como seriam as notas de ambos baseados em suas características e considerando a correção do professor;
Desenvolvimento
Criamos então várias classes que simulariam os elementos envolvidos na situação e seus comportamentos, através de classes instanciadas por objetos e métodos respoectivamente.
Primeiramente criamos uma classe abstrata para aluno, que representaria as características comum a todo aluno.
public abstract class Aluno { protected int conhecimento; protected String nome; protected RelaQueue queue; public Aluno(String nome, RelaQueue queue) { this.nome=nome; this.queue=queue; } public void fazEEntregaRelatorio() { conhecimento++; float qualidade = (2 * this.getDedicacao() + 1 * this.getInteligencia() ) / 3 ; float originalidade = (1 * this.getDedicacao() + 2 * this.getInteligencia() ) / 3 ; Relatorio rela = new Relatorio(qualidade, originalidade, this); queue.queue(rela); } public float getConhecimento() { return conhecimento; } public abstract float getDedicacao(); public abstract float getInteligencia(); public String getNome() { return this.nome; } }
em seguida para o nosso programa criamos dois tipos de aluno, o aluno esforçado e o aluno safo preguiçoso, que eram subclasses do nosso modelo abstrato de aluno:
public class AlunoEsforcado extends Aluno { // instance variables - replace the example below with your own private float inteligencia; private float dedicacao; /** * Constructor for objects of class AlunoEsforcado */ public AlunoEsforcado(String nome, RelaQueue queue) { // initialise instance variables super(nome,queue); inteligencia = 0.5f; dedicacao = 1f; } public float getInteligencia() { return this.inteligencia; } public float getDedicacao() { return this.dedicacao; } }
import java.util.*; public class AlunoSafoPreguicoso extends Aluno { // instance variables - replace the example below with your own private float inteligencia; public AlunoSafoPreguicoso(String nome, RelaQueue queue) { super(nome,queue); this.inteligencia =1; } public float getInteligencia() { return inteligencia; } public float getDedicacao() { Random x= new Random(); return (float) 0.5*x.nextFloat(); } }
Criamos então uma classe para representar o professor que corrigiria o relatório dos alunos, outra para a representação da pilha de relatórios a ser corrigida pelo professor e mais uma para representar o relatório em si, os códigos seguem na ordem descrita:
import java.util.*; public class Professor { RelaQueue queue; public Professor(RelaQueue queue) { this.queue=queue; } private float corrigirRelatorio(Relatorio rela) { Random r =new Random(); float nota = ( rela.getQualidade() + rela.getOriginalidade() + r.nextFloat() ) / 3 * 10; return nota; } public void corrigirRelatorios() { System.out.println("\t\nnotas:"); while (queue.inicio!=queue.fim) { Relatorio rela= queue.dequeue(); float nota = corrigirRelatorio(rela); System.out.println(rela.aluno.nome +" : " + nota); } } }
public class RelaQueue { Relatorio [] array; int inicio; int fim; public RelaQueue() { inicio=0; fim=0; array=new Relatorio[10]; } public void queue(Relatorio rela) { array[fim]=rela; fim=(fim+1)%10; } public Relatorio dequeue() { Relatorio valor= array[inicio]; inicio=(inicio+1)%10; return valor; } }
public class Relatorio { float qualidade; float originalidade; Aluno aluno; public Relatorio( float qualidade, float originalidade, Aluno aluno) { this.qualidade=qualidade; this.originalidade=originalidade; this.aluno = aluno; } public float getQualidade() { return qualidade; } public float getOriginalidade() { return originalidade; } public Aluno getAluno() { return aluno; } }
Enfim testamos manualmente o código instaciando os objetos no BlueJ e testando seus métodos e propriedades, logo em seguida automatizamos o teste com o auxílio de uma classe de teste conforme o código especificado na descrição do laboratório. O diagrama UML já com a classe de teste do programa já testado e aprovado ficou:

Os testes usando o Junit não retornaram nenhuma anormalidade, assim concluímos que nos posntos avaliados o programa funcionava bem. Imagens dos resultados dos testes:


Conclusão
Neste Lab pode-se praticar alguns dos conceitos de orientação a objeto e da linguagem java em si, como herança e implementação de métodos herdados de classes abstratas, que auxilia na criação de um padrão a ser seguido pelas classes que extendem essa classe abstrata. Também foi assimilado na construção do programa alguns conceitos de diagramação UML, e como esta ajuda na organização e compartimentação do código. Por último, foi apresentado um elemento que desconhecia, as classes de teste de unidade JUnit, que facilitam o teste do programa e a depuração do mesmo em caso de resultados não esperados.






Isto aqui é um pouco feio:
Pois você está embutindo conhecimento sobre a sua Queue na classe aluno. Se você mudar a implementação de Queue (para lista ligada, por exemplo), vai quebrar seu código. Você deve embutir esta checagem na classe Queue (fazendo-a retornar null, quando estiver vazia).
Rela um pouco sucinto e sem demonstração de testes manuais.