aluno: Italo Fernandes Aguiar
ano/sem: 2008/2o.
data do laboratório (4) : 21/08/2008 (2)
Introdução
Um sistema que simula uma interação entre professores e alunos em esquema de correção de relatórios e divulgação de notas foi implementado em Java. A ferramenta usada para desenvolver o projeto foi o NetBeans, porém, para padronizar com a maioria dos outros projetos, após serem testadas e aprovadas as classes desenvolvidas, o projeto foi convertido para o BlueJ.
Desenvolvimento
O diagrama de classes tomado como base para o desenvolvimento encontra-se representado na Figura 1.

Figura 1 - Diagrama de classes para o projeto
Os códigos usados no projeto foram os listados abaixo:
// classe abstrata: nao pode haver objeto dessa classe instanciado public abstract class Aluno { int conhecimento = 0; String nome; RelaQueue queue; // constructor public Aluno(String nome, RelaQueue queue) { this.nome = nome; this.queue = queue; } // getters public int getConhecimento() { return conhecimento; } public String getNome() { return nome; } // metodos a serem, necessariamente, implementados nas subclasses de Aluno public abstract float getInteligencia(); public abstract float getDedicacao(); // metodo para fazer e entregar um relatorio 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( (float) qualidade ,(float) originalidade, this); queue.queue(rela); this.conhecimento++; // ver em que parte do metodo fica isso... } }
// classe derivada da classe Aluno, havendo aqui o conceito de heranca public class AlunoEsforcado extends Aluno { float inteligencia = (float) 0.5; float dedicacao = 1; // constructor que chama o constructor da sua super classe Aluno public AlunoEsforcado(String nome, RelaQueue queue) { super(nome, queue); } // metodos abstratos da super classe implementados: @Override public float getDedicacao() { return dedicacao; } @Override public float getInteligencia() { return inteligencia; } /*public float getInteligencia() { } public float getDedicacao();*/ }
import java.lang.Math; // classe derivada da classe Aluno, havendo aqui o conceito de heranca public class AlunoSafoPreguicoso extends Aluno { float inteligencia = 1; // constructor que chama o constructor da sua super classe Aluno public AlunoSafoPreguicoso(String nome, RelaQueue queue) { super(nome, queue); } // metodos abstratos da super classe implementados: @Override public float getDedicacao() { return (float) Math.random() / 2 ; } @Override public float getInteligencia() { return inteligencia; } }
import java.lang.Math; public class Professor { RelaQueue queue; // constructor public Professor(RelaQueue queue) { this.queue = queue; } // metodo que dah a nota de um relatorio fornecido private float corrigirRelatorio( Relatorio rela ) { double nota = ( rela.getQualidade() + rela.getOriginalidade() + Math.random() ) / 3 * 10; return (float) nota; } // metodo que acessa a fila de relatorios e retira todos dando suas notas public void corrigirRelatorios() { Relatorio rela; while( (rela = queue.dequeue()) != null ) { System.out.println( rela.getAluno().getNome() + ": " + this.corrigirRelatorio(rela) ); } } }
// classe que implementa a fila de relatorios public class RelaQueue { Relatorio[] array = new Relatorio[10]; int inicio = 0; int fim = 0; // metodo para inserir uma relatorio na fila public void queue(Relatorio rela) { array[fim] = rela; fim = (fim + 1) % 10; } // metodo para retirar um relatorio da fila public Relatorio dequeue() { if (inicio == fim) { return null; } else { Relatorio rela = array[inicio]; inicio = (inicio + 1) % 10; return rela; } } }
// classe que representa o relatorio public class Relatorio { float qualidade; float originalidade; Aluno aluno; // constructor public Relatorio(float qualidade, float originalidade, Aluno aluno) { this.qualidade = qualidade; this.originalidade = originalidade; this.aluno = aluno; } // getters public Aluno getAluno() { return aluno; } public float getOriginalidade() { return originalidade; } public float getQualidade() { return qualidade; } // metodo que representa a forma que um objeto desta classe deve // ser apresentado quando chamado em formato String public String toString() { return "Relatorio de " + aluno.getNome() + ", de qualidade " + this.qualidade + " e originalidade = " + this.originalidade + "."; } }
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(); } }
Na Figura 2 estão representados o resultado da instanciação manual de objetos, janela de testes com estes aprovados e resultado dos testes.

Figura 2 - Resultado do uso da ferramenta BlueJ na elaboração do projeto
Conclusão
Foi possível constatar, nesse conciso exemplo de programacao em Java, varios conceitos chaves presentes na tecnica de programacao conhecida por Programacao Orientada a Objetos - POO. As classes AlunoEsforcado e AlunoSafoPreguicoso herdam atributos e métodos da sua super classe Aluno. Notou-se que Mensagens foram trocadas entres objetos do sistema, como quando, por exemplo, objetos alunos enviaram um objeto relatorio para um outro objeto fila de relatorios.
Essa prática resumiu bem os principais conceitos iniciais que envolvem POO. Será possível explorar mais as potencialidades desta quando houver interação com Banco de Dados e/ou Programacao WEB.






Código OK. Não precisa colar imagem da descrição no relatório. Faltou ser um pouco mais analítico no rela.