Lab1 Douglas Bokliang

aluno: Douglas Bokliang Ang Cunha
ano/sem: 2008/2o.
data do laboratório (num. da semana) : 21/08/2008 (2)

Introdução

Neste primeiro laboratório foi feito um aplicativo em Java que representa a seguinte situação: alunos de dois diferentes tipos (safos e esforçados) fazem um relatório que fica guardado numa fila. Depois disso, os relatórios são retirados um a um (seguindo a ordem da fila) pelo professor, o qual deve seguir alguns parâmetros para retornar a nota final.

Desenvolvimento

Para simular essa situação em um programa em Java, foi necessário utilizar alguns conceitos de orientação objetos aprendidos em sala. Precisou-se criar diversas classes representando os diferentes elementos da situação (aluno, professor, relatório, fila de relatórios), assim como duas subclasses de aluno (a dos safos e a dos esforçados).

CLASSE RELA_QUEUE
Classe que implementa uma fila de relatórios.
Possui dois métodos, um para adicionar um elemento ao fim da fila (queue) e outro para remover um elemento do início da fila (dequeue).

public class RelaQueue {
    Relatorio[] array = new Relatorio[10];
    int inicio = 0;
    int fim = 0;

    //coloca um relatorio no fim da fila
    public void queue (Relatorio elem) {
        array[fim] = elem;
        fim = (fim + 1) % 10;    
    }

    //tira um relatorio da fila e o retorna
    public Relatorio dequeue () {
        if (inicio == fim) return null;

        Relatorio valor = array[inicio];
        inicio = (inicio + 1) % 10;

        return valor;    
    }
}

CLASSE RELATÓRIO
Possui os valores de qualidade e originalidade do relatório de um referido aluno, que são mais tarde utilizados pelo Professor para dar as notas de cada um.

public class Relatorio {
    private double qualidade;
    private double originalidade;
    private Aluno aluno;

    //constructor
    public Relatorio (double qualidade, double originalidade, Aluno aluno) {
        this.aluno = aluno;
        this.originalidade = originalidade;
        this.qualidade = qualidade;
    }

    //getters
    public Aluno getAluno() {
        return aluno;
    }

    public double getOriginalidade() {
        return originalidade;
    }

    public double getQualidade() {
       return qualidade;
    }

    //setter
    public void setAluno(Aluno aluno) {
        this.aluno = aluno;
    }
}

CLASSE ALUNO
Classe do tipo abstrata, uma vez que possui dois métodos abstratos que vão ser descritos dependendo da subclasse de aluno.
Objetos dessa classe possui as seguintes informações: nome e conhecimento, assim como a fila onde ele deve deixar seu relatório.
Possui um método que cria um relatório de acordo com as características do aluno (inteligência e dedicação) e coloca-o numa fila de relatórios.

public abstract class Aluno {
    int conhecimento = 0;
    String nome;
    RelaQueue queue;

    //constructor
    public Aluno (String nome, RelaQueue queue) {
        this.nome = nome;
        this.queue = queue;
    }

    //metodo que calcula a qualidade e a originalidade do relatorio e usa esses parametros para
    //criar 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(qualidade, originalidade, this);

        queue.queue(rela);
        conhecimento++;
    }

    //getters
    public int getConhecimento (){
        return conhecimento;
    }

    public String getNome () {
        return nome;
    }

    //metodos abstratos de aluno
    public abstract double getInteligencia ();

    public abstract double getDedicacao ();   

}

SUBCLASSE ALUNO_SAFO_PREGUIÇOSO
Subclasse da classe abstrata Aluno descrita anteriormente. Possui duas caracterísitcas a mais: inteligência e dedicação, sendo que esta varia de 0 a 0.5 e aquela é sempre igual a 1.0.
Especifica os métodos abstratos da classe Aluno.

public class AlunoSafoPreguicoso extends Aluno {
    double inteligencia = 1.;

    public AlunoSafoPreguicoso (String nome, RelaQueue queue) {
        super(nome,queue);         //aproveita o constructor de Aluno
    }

    //metodos especificos da subclasse
    public double getInteligencia () {
        return inteligencia;
    }

    public double getDedicacao () {
        return .5*Math.random();
    }    
}

SUBCLASSE ALUNO_ESFORÇADO
Outra subclasse da classe abstrata Aluno. Também possui as mesmas características adicionais em relação à classe Alunos: inteligência e dedicação, sendo que este possui valor 1.0 e aquele 0.5.
Especifica os métodos abstratos da classe Aluno.

public class AlunoEsforcado extends Aluno{
    private double inteligencia = .5;
    private double dedicacao = 1.;

    public AlunoEsforcado (String nome, RelaQueue queue) {
        super(nome,queue);         //aproveita o constructor de Aluno
    }

    //getters
    public double getInteligencia () {
        return inteligencia;
    }

    public double getDedicacao () {
        return dedicacao;
    }
}

CLASSE PROFESSOR
Classe que recebe uma fila de relatórios (adicionados pelos alunos), e possui dois métodos para corrigí-los. O primeiro deles recebe um relatório e retorna a nota, ele é acessado pelo outro método, que tira cada um dos relatórios até que a fila fique vazia.

public class Professor {
    private RelaQueue queue;

    //constructor
    public Professor (RelaQueue queue) {
        this.queue = queue;
    }

    //metodo privado, retorna a nota do relatorio
    private double corrigirRelatorio (Relatorio rela) {
        double fatorAleatorioDe0a1 = Math.random();
        return ( rela.getQualidade() + rela.getOriginalidade() + fatorAleatorioDe0a1 ) / 3 * 10;   
    }

    //tira sempre o primeiro relatorio da fila e chama o metodo anterior para obter a nota
    //faz isso ateh acabarem todos os relatorios da fila
    public void corrigirRelatorios () {
        Relatorio rela = queue.dequeue();

        while (rela != null) {
            double nota = this.corrigirRelatorio (rela);  
            System.out.println (rela.getAluno().getNome() + ": " + nota); 
            rela = queue.dequeue();
        }
    }
}

TESTE
O teste foi feito com o código pronto fornecido na instrução do laboratório. O resultado foi o seguinte:

Untitled.jpg

Conclusão

Este primeiro laboratório foi importante principalmente para nos ambientar com a linguagem Java. Pode-se considerar que o nível de dificuldade não foi elevado, mas mesmo assim foi interessante por ter possibilitado um primeiro contato com a linguagem, assim como para aprender o conceito de herança.

lab1

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