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












corrigido.