relas:Lab1_Pedro_Cau

aluno: Pedro de Sousa Cau Ramos Salles
2008/2o.
22/08/2008

Introdução

Neste laboratório foi possível aplicar os primeiros conceitos de orientação a objetos em Java aprendidos em aula, com base num programa que simula a produção e entrega de relatórios feitos por alunos e a correção realizada por um professor.
Com base no diagrama de classes fornecido, foram criadas 6 classes:

Aluno : Classe abstrata com alguns métodos e atributos que definem um aluno, como nome, conhecimento, entregar relatório.

AlunoEsforcado : Subclasse de aluno que define os atributos inteligência e dedicação

AlunoSafoPreguicoso: Subclasse de aluno que define o atributo inteligência com valor maior que o dedicado, porem a dedicação passa a ser um valor aleatório.

RelaQueue: Classe para mandar uma fila de relatórios enviados a serem corrigidos pelo professor.

Relatorio: O relatório propriamente dito, que contem atributos qualidade e originalidade e o aluno autor.

Professor: Classe que define o professor que vai corrigir os relatórios. Essa classe tem acesso ao RelaQueue de onde retira todos os relatórios e atribui uma nota a cada um baseado na qualidade e originalidade.

Desenvolvimento

O diagrama de classes da aplicação produzido no BlueJ está mostrado a seguir:

261299s.jpg

Temos então os seguintes codigos fonte das classes definidas:

Classe Aluno:

public abstract class Aluno
{
 
        int conhecimento = 0; //conhecimento adquirido fazendo relas
        String nome; //nome do aluno
        RelaQueue queue; // referencia para a fila de relas
 
        public Aluno(String nome , RelaQueue queue)
        {  //inicializaçoes
            this.nome = nome; 
            this.queue = queue;
        }
 
        public void fazEEntregaRelatorio()
        {
            //equaçao que define as caracteristicas do rela baseado nas capacidades do aluno 
            float qualidade = (2.0f * this.getDedicacao() + 1.0f * this.getInteligencia()) / 3.0f;
            float originalidade = (1.0f * this.getDedicacao() + 2.0f * this.getInteligencia()) / 3.0f;
            //adicionando o rela na fila
            queue.queue(new Relatorio(qualidade,originalidade,this));
            //adquirindo conhecimento
            conhecimento++;
        }
 
        public int getConhecimento()
        {
            return conhecimento;
        }
 
        abstract public float getInteligencia();
 
        abstract public float getDedicacao();
 
        public String getNome()
        {
            return nome;
        }
}

Classe AlunoEsforcado:

public class AlunoEsforcado extends Aluno
{
        float inteligencia = 0.5f; //inteligencia definida menor que a do alunosafopreguicoso
        float dedicacao = 1.0f;     //dedicacao definida maior que a do alunosafopreguicoso
 
        public AlunoEsforcado(String nome , RelaQueue queue)
        {
            super(nome,queue); 
        }
 
        public float getInteligencia()
        {
            return inteligencia;
        }
 
        public float getDedicacao()
        {
            return dedicacao;
        }
}

Classe AlunoSafoPreguicoso:

public class AlunoSafoPreguicoso extends Aluno
    {
        float inteligencia = 1.0f; //inteligencia definida maior que o alunodedicado
 
        public AlunoSafoPreguicoso(String nome, RelaQueue queue)
        {     
            super(nome,queue);
        }
 
        public float getInteligencia()
        {
            //O método getInteligencia de AlunoSafoPreguicoso deve retornar um double randômico de 0 a 0,5.
            return inteligencia;
        }
 
        public float getDedicacao()
        {
            //gerando um valor aleatorio para a dedicacao de 0 a 0.5
            return (float)Math.random()/ 2.0f;
        }
    }

Classe RelaQueue:

public class RelaQueue
{
        private Relatorio[] listaRela = new Relatorio[10];//vetor de relatorios
        int inicio = 0; //cursor do inicio da fila
        int fim = 0; //cursor do final da fila
 
        public void queue(Relatorio rela)
        {
            listaRela[fim] = rela; // salva o rela no vetor
            fim = (fim + 1) % 10; //incrementa o fim da fila com loop sobre o vetor
        }
 
        public Relatorio dequeue()
        {
            if (fim != inicio) //se houver algum rela na fila
            {
                Relatorio dequeued = listaRela[inicio];
                inicio = (inicio + 1) % 10; //retira um rela do inicio da fila
                return dequeued; // e retorna
            }
            else return null; // se nao tem rela, vai null
        }
}

Classe Relatorio:

public class Relatorio
{
        Aluno autor;
        private float qualidade;
        private float originalidade;
 
        public Relatorio(float qualidade, float originalidade, Aluno aluno)
        {
            this.qualidade = qualidade;
            this.originalidade = originalidade;
            autor = aluno;
        }
 
        public float getQualidade()
        {
            return qualidade;
        }
 
        public Aluno getAluno()
        {
            return autor;
        }
 
        public float getOriginalidade()
        {
            return originalidade;
        }
}

Classe Professor:

public class Professor
{
    RelaQueue queue; //referencia para a fila de relas
 
    public Professor(RelaQueue queue)
    {
        this.queue = queue; //inicializacao
    }
 
    private float corrigirRelatorio(Relatorio rela)
    {
        //a nota do rela eh calculada baseado na qualidade, originalidade e num
        //fator aleatorio de 0 a 1 pra nao ficar deterministico
        float fatorAleatorioDe0a1 = (float)Math.random();
 
        float nota = (rela.getQualidade() + rela.getOriginalidade() + fatorAleatorioDe0a1) / 3 * 10;
        //e a nota eh impressa na tela
        System.out.println(rela.getAluno().getNome() + ": " + nota);
        return nota;
    }
 
    public void corrigirRelatorios()
    {
        Relatorio rela;
        while ((rela = queue.dequeue()) != null)
        {  
            //realizar a correcao de todos os relas na fila
            corrigirRelatorio(rela);
        }
    }
}

Para verificar o funcionamento do programa, foi primeiramente realizado um teste manual, mostrando que dois relas foram adicionados ao rela queue por dois alunos diferentes, mostrando seu conteudo:

2v13zw0.jpg

Em seguinda foi realizado o teste final usando a classe de teste definida no roteiro, na imagem abaixo está o resultado do teste:

29uu1yu.jpg

Onde podemos ver que e o programa passou no teste e portanto está funcionando corretamente. Os dados impressos no console também estão condizentes com o esperado.

Conclusão

Esse laboratorio foi bom para uma primeira familiarização com Orientação a Objeto em Java, por ser um programa bem simples, mas que aborta varios conceitos importantes como herança, classe abstrata e as relações entre as classes. O BlueJ é uma IDE interessante por integrar o diagrama de classes com a interface de desenvolvimento, porém o BlueJ nao possui correções de sintaxe, autocompletar e outras facilidades que outras IDEs costumam ter, o que dificulta a programação para quem não esta acostumado com a linguagem. O tema abordado no laboratorio, que foi relacionado com confecção e entrega de relatorios por alunos ao professor foi bom para obter uma visão de como orientação a objetos pode se encaixar com sistuações mais reais, porém não possui muita utilidade pratica , espero que nas proximas vezes sejam sugeridos programas que façam algo mais pratico. Em linhas gerais, o laboratorio foi muito produtivo no que se diz respeito à compreenção dos conceitos visto em sala.

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