Lab1 Yves Conselvan

aluno: Yves Conselvan
ano/sem: 2008/2o.
data do laboratório (num. da semana) : 06/08/2008 (2)

Introdução

Este laboratório teve por objetivo a introdução dos principais conceitos de orientação a objetos. Para tanto desenvolvemos as classes para simulação de um sistema de entrega e correção de relatórios.

Para o desenvolvimento das classes utilizamos a linguagem Java com ambiente de desenvolvimento BlueJ.

Desenvolvimento

Funcionamento do sistema

Os alunos fazem seus relatorios, com qualidade e originalidade baseados em sua inteligencia e dedicação, e os entregam na fila de relatórios.
Existem dois tipos de alunos, esforçado e safo preguiçoso.
O professor corrige os relatorios da fila a partir da media entre qualidade, originalidade e um fator pseudo-aleatório.

Implementação

Para o desenvolvimento da atividade foi necessária a implementação de uma fila para a entrega dos relatorios. Optei pela implementação de uma fila baseada em estrutura encadeada. Foi necessário para isto a implementação de uma classe que representa um item na fila de relatorios.

Na implementação de todas as classes as propriedades são privadas acessando-se seus valores através de métodos get e set. Algumas propriedades, definidas no construtor ou intrínsecas à classe, não possuem método set.

Apresento abaixo o código de cada uma das classes implementadas

Classe Abstrata Aluno

A classe Aluno encapsula os métodos e propriedades básicas de um aluno.
É uma classe abstrata, apresentando dois métodos abstratos. Dessa forma os alunos poderão ser implementados com suas características específicas derivando desta classe, reutilizando código.

public abstract class Aluno
{
    private int conhecimento = 0;
    private String nome;
    private RelaQueue queue;
 
    //contrutor da classe
    //seta nome e pega referencia à fila de relatorios
    public Aluno(String nome, RelaQueue queue)
    {
        this.nome = nome;
        this.queue = queue;
    }   
 
    //metodo abstrato para retornar a inteligencia
    public abstract float getInteligencia();
 
    //metodo abstrato para retornar a dedicação
    public abstract float getDedicacao();
 
    //retorna o nome
    public String getNome() 
    {
        return this.nome;
    }
 
    //retorna o conhecimento
    public int getConhecimento()
    {
        return this.conhecimento;
    }
 
    //gera um novo relatorio e coloca na fila de relatorios
    public void fazEEntregaRelatorio()
    {
        float qualidade = (2 * this.getDedicacao() + 1 * this.getInteligencia() ) / 3 ;
        float originalidade = (1 * this.getDedicacao() + 2 * this.getInteligencia() ) / 3 ;
        queue.queue(new Relatorio(qualidade, originalidade, this));        
    }
}

Classe AlunoEsforcado - Subclasse de Aluno

A classe AlunoEsforcado deriva da classe Aluno, implementa seus métodos abstratos e chama o construtor da super classe.

public class AlunoEsforcado extends Aluno
{
 
    private float inteligencia = 0.5f;
    private float dedicacao = 1;
 
    //construtor da classe
    //chama o construtor da super classe com os mesmos parâmetros
    public AlunoEsforcado(String nome, RelaQueue queue)
    {
        super(nome, queue);
    }
 
    //retorna a inteligencia a partir da propriedade
    public float getInteligencia()
    {
        return this.inteligencia;
    }
 
    //retorna a dedicação a partir da propriedade
    public float getDedicacao()
    {
        return this.dedicacao;
    }
}

Classe AlunoSafoPreguicoso - Subclasse de Aluno

A classe AlunoEsforcado deriva da classe Aluno, implementa seus métodos abstratos e chama o construtor da super classe.
Na implementação desta classe foi necessária a utilização da biblioteca java.util.Random, para a geração pseudo-aleatória de uma das propriedades.

import java.util.Random;
 
public class AlunoSafoPreguicoso extends Aluno
{
 
    private float inteligencia = 1;
 
    //construtor da classe
    //chama o construtor da super classe com os mesmos parâmetros
    public AlunoSafoPreguicoso(String nome, RelaQueue queue)
    {
        super(nome, queue);
    }
 
    //retorna a inteligencia a partir da propriedade
    public float getInteligencia()
    {
        return this.inteligencia;
    }
 
    //retorna a dedicação do aluno a partir de um valor pseudo-aleatório
    public float getDedicacao()
    {
        Random generator = new Random();
        float r = generator.nextFloat();
        return r * 0.5f;
 
    }
 
}

Classe Relatorio

A classe Relatorio guarda as propriedades dos relatorios produzidos pelos alunos. Após a criação de um objeto apenas é possível ler suas propriedades, dessa forma os dados ficam protegidos de alterações.

public class Relatorio
{
 
    private float qualidade, originalidade;
    private Aluno aluno;
 
    //construtor da classe
    //seta as propriedades do relatorio
    public Relatorio(float qualidade, float originalidade, Aluno aluno)
    {
        this.qualidade = qualidade;
        this.originalidade = originalidade;
        this.aluno = aluno;
    }
 
    //retorna a qualidade do relatorio
    public float getQualidade() 
    {
        return this.qualidade;
    }
 
    //retorna a originalidade do relatorio
    public float getOriginalidade()
    {
        return this.originalidade;
    }
 
    //retorna o aluno que fez o relatorio
    public Aluno getAluno()
    {
        return this.aluno;
    }
 
}

Classe RelaQueueItem

A classe RelaQueueItem representa um item na fila de relatorios. Suas propriedades são o relatório para o qual apontam (item) e qual é o proximo objeto na fila.

public class RelaQueueItem
{
    private Relatorio item;
    private RelaQueueItem next;
 
    //construtor da classe
    //recebe a referencia de um relatorio
    public RelaQueueItem(Relatorio rela)
    {
        item = rela;
        this.next = null;
    }
 
    //retorna o proximo item da fila
    public RelaQueueItem getNext()
    {
        return this.next;
    }
 
    //seta o proximo item da fila
    public void setNext(RelaQueueItem p)
    {
        this.next = p;
    }
 
    //retorna o relatorio referenciado por este item da lista
    public Relatorio getItem()
    {
        return this.item;
    }
}

Classe RelaQueue

A classe RelaQueue implementa uma fila de relatórios utilizando estrutura encadeada. São utilizadas referências para o inicio e o fim da fila, e no construtor é criado um item utilizado como cabeça da lista.

public class RelaQueue
{
    private RelaQueueItem inicio, fim;   
 
    //construtor da classe
    //cria um nó cabeça
    public RelaQueue()
    {
        inicio = new RelaQueueItem(null);
        fim = inicio;
    }
 
    //coloca um item na fila    
    public void queue(Relatorio rela) 
    {
        fim.setNext(new RelaQueueItem(rela));
        fim = fim.getNext();
    }
 
    //retira um item da fila    
    public Relatorio dequeue() 
    {
        Relatorio ret = null;
        if (inicio.getNext() != null)
        {            
            ret = inicio.getNext().getItem();
            if (inicio.getNext() == fim) {
                fim = inicio;
            }
            inicio.setNext(inicio.getNext().getNext());            
        }
        return ret;
    }        
}

Clase Professor

A classe Professor apresenta externamente apenas o método para correção dos relatórios, sendo que cada relatório é corrigido por um método privado.
Nesta classe também foi necessária a utilização da biblioteca import java.util.Random.

import java.util.Random;
 
public class Professor
{
 
    private RelaQueue queue;
 
    public Professor(RelaQueue queue)
    {
        this.queue = queue;
    }
 
    public void corrigirRelatorios()
    {
        Relatorio rela;
        while ((rela = queue.dequeue()) != null) {
            System.out.println(rela.getAluno().getNome() + ": " +  corrigirRelatorio(rela));
        }
    }
 
    private float corrigirRelatorio(Relatorio rela)
    {             
        Random generator = new Random();
        return ( rela.getQualidade() + rela.getOriginalidade() + generator.nextFloat() ) / 3 * 10;
    }
}

ScreenShoot´s

Diagrama de classes do BlueJ

lab1_yves_classes.JPG

Objetos instanciados manualmente

lab1_yves_objetos.JPG

Tela do teste

lab1_yves_teste.JPG

Tela de saida

lab1_yves_saida.JPG

Conclusão

Na implementação do aluno para reutilizar o código do construtor da classe abstrata Aluno foi utilizado o método super a partir dos construtor das classes que derivam de Aluno. Pelo construtor padrão do Java o método super é chamado automaticamente para o construtor sem argumentos da super classe, para passar as informações necessárias, nome do aluno e lista de relatorios, foi necessário chamar explicitamente o método super passando estes parâmetros.

Na implementação da fila de relátorio optei pela lista encadeada para treinar a programação destas estruturas referenciadas em Java.

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