Lab1 Igor Almeida

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:

diagrama_de_classes

Testes realizados:

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.

Add a New Comment
Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License