Lab1 Italo Aguiar

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.

lab1.png
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.

Screen.jpg
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.

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