Lab2 Fabio Imada

aluno: Nome do Aluno
ano/sem: 2008/2o.
data do laboratório (num. da semana) : 21/08/2008 (4)

Introdução

Este laboratório foi uma continuação do laboratório anterior. Nele foi trabalhado algumas qualidades da Orientação a Objetos como: uma nova abstração à classe Aluno, que atendesse melhor ao programa; o encapsulamento e o desacoplamento que permitem que a estrutura da classe Aluno seja modificada sem a necessidade de alterar os códigos das classes ligadas à ele e sem que estes percebam as mudanças efetuadas. Também foram utilizados métodos de entrada de dados pelo console e tratamento de exceções.

Desenvolvimento

Simulador para o Lab01

Primeiramente foi criada uma interface para o usuário leigo.
Para tanto, criou-se uma classe Simulador com um método estático main que pode ser executado e o usuário pode criar a quantidade desejada de alunos.

import java.io.*;
import java.util.Scanner;
 
public class Simulador
{
    public static void main(){
        int i;
        Aluno[] listaAlunos;
        RelaQueue queue = new RelaQueue();
        BufferedReader inReader;
        inReader = new BufferedReader ( new InputStreamReader ( System.in ));
        System.out.println("Insira a quantidade de alunos: ");
        Scanner sc = new Scanner (System.in);
        int nAlunos = sc.nextInt();
        listaAlunos = new Aluno[nAlunos];
        String nome;
        int tipo;
        for( i=1 ; i <= nAlunos ; i++ ){
            try {
                System.out.println("\nAluno "+i+"\nDigite o nome do aluno: ");
                nome = inReader.readLine();
                System.out.println("O aluno é:\n\t1.Esforcado\n\t2.SafoPreguicoso\nDigite o numero: ");
                do {
                    tipo = sc.nextInt();
                    if(tipo==1){
                        listaAlunos[i-1]=new AlunoEsforcado(nome,queue);
                    }
                    else if(tipo==2){
                        listaAlunos[i-1]=new AlunoSafoPreguicoso(nome,queue);
                    }
                    if(tipo!=1 && tipo!=2)System.out.println("Digite novamente: ");
                } while ( tipo!=1 && tipo!=2 );
            } catch (IOException e){
                System.err.println(e.getMessage());
            }
            listaAlunos[i-1].fazEEntregaRelatorio();
        }
        if(nAlunos == 0)System.out.println("Não há alunos!");
        else{
            System.out.println("\n\nNotas dos alunos:");
            Professor prof = new Professor(queue);
            prof.corrigirRelatorios();
        }
        /*A classe simulador deverá possibilitar a criação de quantos alunos quanto 
        o usuário desejar, perguntando, o nome e tipo do aluno 
        ("esforçado", "safo preguiçoso"). Em seguida, deverá mandar os alunos 
        fazerem e entregarem o relatório. Por último, irá pedir que o professor 
        corrija os relatórios.*/
    }
}

Teste para nenhum aluno

Simulador10

Outros Testes (Saída no Terminal)

Insira a quantidade de alunos:
2

Aluno 1
Digite o nome do aluno: 
Fabio Eigi Imada
O aluno é:
    1.Esforcado
    2.SafoPreguicoso
Digite o numero: 
1

Aluno 2
Digite o nome do aluno: 
Zezinho da Esquina
O aluno é:
    1.Esforcado
    2.SafoPreguicoso
Digite o numero:
3
Digite novamente:
0
Digite novamente:
2

Notas dos alunos:
Fabio Eigi Imada: 6.301761965238959
Zezinho da Esquina: 6.545052778560486

Utilização de uma Classe Abstrata Comportamento

Como no Lab01 o comportamento do aluno era uma característica de classe, não era possível alterar o comportamento de uma instância. Para solucionar o problema foi criado uma classe abstrata Comportamento e suas sub-classes Safo, Preguiçoso, etc. Desse modo, o Aluno pode deixar de ser abstrato.
Ainda foram criadas sub-classes para Aluno: AlunoITA, AlunoUnicamp e AlunoUSP. Estes utilizados para estudar o tratamento de exceções do Java.
Além disso, também criou-se uma fila de genéricos, a qual passou a ser subclasse de RelaQueue.
Seguem os códigos criados e modificados:

Comportamento

public abstract class Comportamento
{
    private Aluno aluno;
 
    public Comportamento(Aluno aluno){
        this.aluno=aluno;
    }
    public abstract double getInteligencia();
    public abstract double getDedicacao();
}

Extensões de Comportamento

import java.util.*;
public class Extensao extends Comportamento
{
    public Extensao(Aluno aluno){
        super(aluno);
    }
    public double getInteligencia(){
    //Aqui o valor retornado varia de extensão para extensão
    }
    public double getDedicacao(){
    //idem
    }
}

QueueGenérica

public class Queue<T>{
    private Object[] array = new Object[10];//Não foi possível aplicar o códgo passado em aula
    private int inicio=0,fim=0;
 
    public void queue(T obj){
        array[fim] = obj;
        fim = (fim+1)%10;
    }
    public T dequeue(){
        T obj;
        if(inicio==fim)return null;
        else{
            obj = (T)array[inicio];//Como a fila criada foi de Object, é necessário o cast para validar o código
            inicio = (inicio+1)%10;
            return obj;
        }
    }
}

Novo Aluno

public class Aluno
{    
 
    private int conhecimento = 0;
    private String nome = new String();    
    private RelaQueue queue = new RelaQueue();        
    private Comportamento comportamento;
 
    public Aluno(String nome, RelaQueue queue)    
    {        
        this.nome = nome;        
        this.queue = queue;    
        comportamento = new Esforcado(this);
    }        
 
    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);        
        this.conhecimento ++;    
    }
 
    public int getConhecimento(){
        return conhecimento;
    }
 
    public double getInteligencia(){
        return this.comportamento.getInteligencia();//Delegação do getInteligencia para seu comportamento
    }
 
    public double getDedicacao(){
        return this.comportamento.getDedicacao();//idem
    }
 
    public String getNome(){
        return nome;
    }
 
    public void setComportamento(Comportamento comportamento) throws Exception {
        this.comportamento = comportamento;
    }
}

Sub-classes de Aluno com tratemento de exceções (AlunoITA)

public class AlunoITA extends Aluno
{
    public AlunoITA(String nome,RelaQueue queue)
    {
        super(nome,queue);
    }
    public void setComportamento(Comportamento comportamento) throws Exception{
        if(comportamento instanceof Burro) throw new Exception();
        super.setComportamento(comportamento);
    }
}

Resultados dos Testes

Test0
Test1

Simulador 2.0

Segue abaixo o código do Simulador atualizado:

import java.io.*;
import java.util.Scanner;
 
public class Simulador
{
    public static void main(String args[]){
        int i;
        Aluno[] listaAlunos;
        RelaQueue queue = new RelaQueue();
        BufferedReader inReader;
        inReader = new BufferedReader ( new InputStreamReader ( System.in ));
        System.out.println("Insira a quantidade de alunos: ");
        Scanner sc = new Scanner (System.in);
        int nAlunos=0;
        try{
            nAlunos = sc.nextInt();
        }catch(Exception e){
            System.out.println("Entrada inválida");
            nAlunos = 0;
        }
 
        listaAlunos = new Aluno[nAlunos];
        String nome;
        int tipo;
 
        for( i=1 ; i <= nAlunos ; i++ ){
            try {
                System.out.println("\nAluno "+i+"\nDigite o nome do aluno: ");
                nome = inReader.readLine();
                System.out.println("O aluno é de qual Faculdade:\n\t1.ITA\n\t2.Unicamp\n\t3.USP\n\t4.Outro\nDigite o numero: ");
                do {
                    tipo = sc.nextInt();
                    if(tipo==1){
                        listaAlunos[i-1]=new AlunoITA(nome,queue);
                    }
                    else if(tipo==2){
                        listaAlunos[i-1]=new AlunoUnicamp(nome,queue);
                    }
                    else if(tipo==3){
                        listaAlunos[i-1]=new AlunoUSP(nome,queue);
                    }
                    else if(tipo==4){
                        listaAlunos[i-1]=new Aluno(nome,queue);
                    }
                    if( tipo==0 || tipo>4 )System.out.println("Digite novamente: ");
                } while ( tipo==0 || tipo>4 );
                System.out.println("O aluno é:\n\t1.Safo\n\t2.Esforçado\n\t3.Pemba\n\t4.Summa\n\t5.Imprevisível\n\t6.Burro\nDigite o numero: ");
                do {
                    tipo = sc.nextInt();
                    try{
                        if(tipo==1){
                            listaAlunos[i-1].setComportamento(new Safo(listaAlunos[i-1]));
                        }
                        else if(tipo==2){
                            listaAlunos[i-1].setComportamento(new Esforcado(listaAlunos[i-1]));
                        }
                        else if(tipo==3){
                            listaAlunos[i-1].setComportamento(new Pemba(listaAlunos[i-1]));
                        }
                        else if(tipo==4){
                            listaAlunos[i-1].setComportamento(new Summa(listaAlunos[i-1]));
                        }
                        else if(tipo==5){
                            listaAlunos[i-1].setComportamento(new Imprevisivel(listaAlunos[i-1]));
                        }
                        else if(tipo==6){
                            listaAlunos[i-1].setComportamento(new Burro(listaAlunos[i-1]));
                        }
                    } catch(Exception e){
                        System.out.println("Você tentou criar algo inexistente!");
                        tipo=0;
                    }
                    if( tipo==0 || tipo>6 )System.out.println("Digite novamente: ");
                } while ( tipo==0 || tipo>6 );
            } catch (IOException e){
                System.err.println(e.getMessage());
            }
            listaAlunos[i-1].fazEEntregaRelatorio();
        }
        if(nAlunos == 0)System.out.println("Não há alunos!");
        else{
            System.out.println("\n\nNotas dos alunos:");
            Professor prof = new Professor(queue);
            prof.corrigirRelatorios();
        }
        /*A classe simulador deverá possibilitar a criação de quantos alunos quanto
        * o usuário desejar, perguntando, o nome e tipo do aluno
        * ("esforçado", "safo preguiçoso"). Em seguida, deverá mandar os alunos
        * fazerem e entregarem o relatório. Por último, irá pedir que o professor 
        * corrija os relatórios.*/
    }
}

Resultado dos testes no simulador atualizado

Simulador21
Simulador22
Insira a quantidade de alunos: 
2

Aluno 1
Digite o nome do aluno: 
Juleuzinho da Unicamp
O aluno é de qual Faculdade:
    1.ITA
    2.Unicamp
    3.USP
    4.Outro
Digite o numero: 
2
O aluno é:
    1.Safo
    2.Esforçado
    3.Pemba
    4.Summa
    5.Imprevisível
    6.Burro
Digite o numero: 
1
Você tentou criar algo inexistente!
Digite novamente: 
4
Você tentou criar algo inexistente!
Digite novamente: 
2

Aluno 2
Digite o nome do aluno: 
Zezinho da USP
O aluno é de qual Faculdade:
    1.ITA
    2.Unicamp
    3.USP
    4.Outro
Digite o numero: 
3
O aluno é:
    1.Safo
    2.Esforçado
    3.Pemba
    4.Summa
    5.Imprevisível
    6.Burro
Digite o numero: 
5

Notas dos alunos:
Juleuzinho da Unicamp: 5.346365288091728
Zezinho da USP: 4.471057248787138

Diagrama de Classes do Lab02

Diagrama

Conclusão

O laboratório foi dificultado devido aos conteúdos não vistos ou vistos posteriormente em sala, como programação genérica, a entrada de dados, o tratamento de excessões, etc.
Desse modo, só foi possível concluir o laboratório consultando-se livros e tutoriais na internet, o que o tornou muito trabalhoso.
Arquivo .zip do Lab02

Obs. Link para o exercicio do Diagrama de Classes.

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