Pontifícia Universidade Católica de São Paulo Departamento de Ciência da Computação LP: Laboratório de Programação Prof. ISVega Apontamento 21 Setembro de 2004 Milhao da Computação III: Ações do Aluno CONTEÚDO 21.1 Ações do Aluno . . . . . . . . . . . . . . . . . . . . 21.2 Refinamento do Jogo . . . . . . . . . . . . . . . . Exercícios . . . . . . . . . . . . . . . . . . . . . . . . . . 1 3 5 21.1 Ações do Aluno aumentar(acumulado) [ ordem = correta ] mostrar(acumulado) perguntar [ ∃ pergunta ] gerar pergunta iniciarJogo mostrar(acumulado) responder(ordem) parar pergunta mostrada [ ordem ≠ correta ] ERROU dividir(acumulado) [¬ ∃ pergunta ] GANHOU PAROU mostrar(acumulado) Figura 21.1: Mapa de execução do Jogo. 1 Laboratório de Programação Setembro de 2004 h Tela: responder à pergunta i≡ public void responder() { // @do: Acao a = pergunta.analisarAlternativa( ordem ); jogo.analisarAcao( a ); } h Tela: parar o questionário i≡ public void parar() { // @do: pergunta.parar(); } Ação do Aluno h Classe Ação i≡ public abstract class Acao { public abstract void processar( Aluno a, int aposta, Jogo jogo ); } Aluno Acertou a Pergunta h Classe Acertou i≡ public class Acertou extends Acao { public void processar( Aluno a, int aposta, Jogo jogo ) { a.mudar( aposta ); System.out.println( "Resposta correta!" ); System.out.println( "Voce ganhou= " + a.pontos ); jogo.gerarPerguntaSeguinte(); jogo.perguntar(); } } Aluno Errou a Pergunta h Classe Errou i≡ public class Errou extends Acao { public void processar( Aluno a, int aposta, Jogo jogo ) { a.dividir(); System.out.println( "Resposta ERRADA!" ); System.out.println( "Voce ganhou apenas= " + a.pontos ); jogo.terminar(); } } Parada do Questionário h Classe Parou i≡ public class Parou extends Acao { c Copyright °1999-2004, Dr. Italo S. Vega 21-2 Laboratório de Programação Setembro de 2004 public void processar( Aluno a, int aposta, Jogo jogo ) { System.out.println( "Voce ganhou= " + a.pontos ); jogo.terminar(); } } 21.2 Refinamento do Jogo h Jogo: analisar ação do aluno i≡ public void analisarAcao( Acao x ) { // <- v3 x.processar( aluno, aposta, this ); } h Pergunta: analisar alternativa i≡ public Acao analisarAlternativa( int ordem ) { // <- v3 // @pre: ordem corresponde a alguma alternativa assert( ( 1 <= ordem )&&(ordem <= 4) ); // @do: if( ordem == correta ) { return new Acertou(); } else { return new Errou(); } } h Pergunta: parar questionário i≡ public Acao parar() { // @do: return new Parou(); } c Copyright °1999-2004, Dr. Italo S. Vega 21-3 Laboratório de Programação Setembro de 2004 Figura 21.2: Vista do modelo estático final do jogo (diagrama de classes UML). c Copyright °1999-2004, Dr. Italo S. Vega 21-4 Laboratório de Programação Setembro de 2004 E XERCÍCIOS 21.1 C ONTRATOS M ÉTODOS Em relação definirAlternativaCorreta(), tem-se o seguinte contrato: DE ao método // @pre: int n = alternativas.size(); assert( (0 <= n) && (n < 4) ); // @do: corpo do método // @post: assert( (0 < alternativas.size()) && (alternativas.size() <= 4) ); assert( ( 1 <= correta )&&(correta <= 4) ); Tarefa 21.1.1 Qual o significado da pré-condição? Tarefa 21.1.2 Qual o significado das pós-condições? 21.2 C ONTRATOS V ISUALIZAÇÃO DE UMA P ERGUNTA Em relação ao método mostrar() da classe Pergunta, tem-se o seguinte contrato: DA // @pre: tem 4 alternativas, uma delas correta assert( alternativas.size() == 4 ); assert( ( 1 <= correta )&&(correta <= 4) ); // @do: corpo do método // @post: ? Tarefa 21.2.1 Qual o significado da pré-condição? Tarefa 21.2.2 Qual o conjunto de pós-condições deste método? 21.3 M ODELO DE A LTERNATIVAS E P ERGUNTAS Tarefa 21.3.1 Crie um novo projeto denominado “ex21.3”. Tarefa 21.3.2 Codifique a classe Alternativa conforme indicado no texto. Tarefa 21.3.3 Codifique a classe Pergunta conforme indicado no texto. Tarefa 21.3.4 Codifique a classe TestePergunta conforme indicado no texto. Tarefa 21.3.5 Crie o objeto t da classe TestePergunta. O que acontece quando ele recebe a mensagem t.cenario()? Tarefa 21.3.6 Altere o cenário de teste de modo que sejam criadas e mostradas três perguntas: p11, p12 e p13. Repita a tarefa anterior. 21.4 T ELA DE A ÇÕES Tarefa 21.4.1 Crie um novo projeto denominado “ex21.4”. (No BlueJ, salve o projeto anterior como “ex21.4”.) Tarefa 21.4.2 Codifique a classe Tela conforme indicado no texto. Tarefa 21.4.3 Codifique a classe TesteTela conforme indicado no texto. c Copyright °1999-2004, Dr. Italo S. Vega 21-5 Laboratório de Programação Setembro de 2004 Tarefa 21.4.4 Crie o objeto t da classe TesteTela. Envie, para ele, uma mensagem ativando a operação cenario(). Tarefa 21.4.5 tela e p11. Inspecione o objeto t criado na tarefa anterior e recupere os objetos Tarefa 21.4.6 ada? O que acontece quando a mensagem tela.responder(1) é envi- Tarefa 21.4.7 O que acontece quando a mensagem tela.parar() é enviada? Tarefa 21.4.8 ada? O que acontece quando a mensagem tela.responder(2) é envi- 21.5 I MPLEMENTAÇÃO DOS N ÍVEIS Em relação ao modelo da classe Nivel: Tarefa 21.5.1 Crie um novo projeto denominado “ex21.5”. Tarefa 21.5.2 Codifique o modelo da classe Nivel conforme mostrado no texto. Tarefa 21.5.3 Codifique a classe TesteNivel. Tarefa 21.5.4 Crie o objeto t da classe TesteNivel. O que acontece quando ele recebe uma mensagem ativando a operação cenario1()? Tarefa 21.5.5 Altere a classe TesteNivel de modo que sejam criados dois outros nívels: medio e dificil. Tarefa 21.5.6 Crie o objeto t da classe TesteNivel. O que acontece quando ele recebe uma mensagem ativando a operação cenario1()? c Copyright °1999-2004, Dr. Italo S. Vega 21-6 Laboratório de Programação Setembro de 2004 Anexo: Listagem do Protótipo Pacote milhao Classe Acao.java public abstract class Acao { public abstract void processar( Aluno a, int aposta, Jogo jogo ); } Classe Acertou.java public class Acertou extends Acao { public void processar( Aluno a, int aposta, Jogo jogo ) { a.mudar( aposta ); System.out.println( "Resposta correta!" ); System.out.println( "Voce ganhou= " + a.pontos ); jogo.gerarPerguntaSeguinte(); jogo.perguntar(); } } Classe Alternativa.java public class Alternativa { public String texto; public Alternativa( String novoTexto ) { // @do: texto = novoTexto; } public void mostrar() { // @do: System.out.println( texto ); } } Classe Aluno.java public class Aluno { public int pontos; public Aluno() { // @do: pontos = 0; } public void mudar( int aposta ) { // @do: pontos = aposta; } public void dividir() { // @do: pontos = pontos / 2; } } Classe BaseDePerguntas.java import java.util.Vector; import java.util.Collections; public class BaseDePerguntas { public Vector perguntas; public BaseDePerguntas() { // @do: perguntas = new Vector(); } public void carregar( String nivel ) { // @pre: c Copyright °1999-2004, Dr. Italo S. Vega 21-7 Laboratório de Programação assert( Setembro de 2004 "FACIL".equals( nivel ) || "MEDIO".equals( nivel ) || "DIFICIL".equals( nivel ) || "MILHAO".equals( nivel ) ); // @do: if( "FACIL".equals( nivel ) ) { carregarBaseFacil(); } if( "MEDIO".equals( nivel ) ) { carregarBaseMedio(); } if( "DIFICIL".equals( nivel ) ) { carregarBaseDificil(); } if( "MILHAO".equals( nivel ) ) { carregarBaseMilhao(); } } public void carregarBaseFacil() { Pergunta nova = new Pergunta( "O que é computação?" ); nova.definirAlternativaCorreta( "É um cálculo." ); nova.definirAlternativa( "É uma variável." ); nova.definirAlternativa( "É um metodo." ); nova.definirAlternativa( "É um array." ); perguntas.add(nova); nova = new Pergunta( "O que é um array?" ); nova.definirAlternativa( "É um valor." ); nova.definirAlternativaCorreta( "É uma estrutura de info." ); nova.definirAlternativa( "É uma ativação." ); nova.definirAlternativa( "É uma fila." ); perguntas.add(nova); nova = new Pergunta( "Uma variável ..." ); nova.definirAlternativa( "É um dado." ); nova.definirAlternativa( "Controla o programa." ); nova.definirAlternativa( "É um comando." ); nova.definirAlternativaCorreta( "Armazena um valor." ); perguntas.add(nova); nova = new Pergunta( "Pergunta facil..." ); nova.definirAlternativaCorreta( "A F1." ); nova.definirAlternativa( "A F2." ); nova.definirAlternativa( "A F3." ); nova.definirAlternativa( "A F4." ); perguntas.add(nova); nova = new Pergunta( "Algoritmos ..." ); nova.definirAlternativaCorreta( "Descrevem computações." ); nova.definirAlternativa( "São valores." ); nova.definirAlternativa( "São variáveis." ); nova.definirAlternativa( "São estruturas de info." ); perguntas.add(nova); // @post: assert( perguntas.size() >= 5 ); } public void carregarBaseMedio() { Pergunta nova = new Pergunta( "Um Vector..." ); nova.definirAlternativa( "É igual a um array." ); nova.definirAlternativaCorreta( "Permite acesso posicional." ); nova.definirAlternativa( "Não armazena char." ); nova.definirAlternativa( "É um algoritmo." ); perguntas.add(nova); nova = new Pergunta( "Uma atribuição..." ); nova.definirAlternativaCorreta( "Troca um valor." ); nova.definirAlternativa( "É um cálculo." ); nova.definirAlternativa( "É uma expressão." ); nova.definirAlternativa( "Não é um comando." ); perguntas.add(nova); c Copyright °1999-2004, Dr. Italo S. Vega 21-8 Laboratório de Programação Setembro de 2004 nova = new Pergunta( "Pergunta media 1..." ); nova.definirAlternativaCorreta( "A M1." ); nova.definirAlternativa( "A M2." ); nova.definirAlternativa( "A M3." ); nova.definirAlternativa( "A M4." ); perguntas.add(nova); nova = new Pergunta( "Pergunta media 2..." ); nova.definirAlternativaCorreta( "A F1." ); nova.definirAlternativa( "A M2." ); nova.definirAlternativa( "A M3." ); nova.definirAlternativa( "A M4." ); perguntas.add(nova); nova = new Pergunta( "Pergunta media 3..." ); nova.definirAlternativaCorreta( "A M1." ); nova.definirAlternativa( "A M2." ); nova.definirAlternativa( "A M3." ); nova.definirAlternativa( "A M4." ); perguntas.add(nova); // @post: assert( perguntas.size() >= 5 ); } public void carregarBaseDificil() { Pergunta nova = new Pergunta( "Um pacote..." ); nova.definirAlternativa( "Introduz acoplamentos." ); nova.definirAlternativa( "É um componente." ); nova.definirAlternativa( "É instanciável." ); nova.definirAlternativaCorreta( "Organiza classes." ); perguntas.add(nova); nova = new Pergunta( "Pergunta dificil 1..." ); nova.definirAlternativaCorreta( "A D1." ); nova.definirAlternativa( "A D2." ); nova.definirAlternativa( "A D3." ); nova.definirAlternativa( "A D4." ); perguntas.add(nova); nova = new Pergunta( "Pergunta dificil 2..." ); nova.definirAlternativaCorreta( "A D1." ); nova.definirAlternativa( "A D2." ); nova.definirAlternativa( "A D3." ); nova.definirAlternativa( "A D4." ); perguntas.add(nova); nova = new Pergunta( "Pergunta dificil 3..." ); nova.definirAlternativaCorreta( "A D1." ); nova.definirAlternativa( "A D2." ); nova.definirAlternativa( "A D3." ); nova.definirAlternativa( "A D4." ); perguntas.add(nova); nova = new Pergunta( "Pergunta dificil 4..." ); nova.definirAlternativaCorreta( "A D1." ); nova.definirAlternativa( "A D2." ); nova.definirAlternativa( "A D3." ); nova.definirAlternativa( "A D4." ); perguntas.add(nova); // @post: assert( perguntas.size() >= 5 ); } public void carregarBaseMilhao() { Pergunta nova = new Pergunta( "Um objeto..." ); nova.definirAlternativa( "É uma variável." ); nova.definirAlternativa( "É uma classe." ); nova.definirAlternativa( "Só tem atributos." ); nova.definirAlternativaCorreta( "Realiza computações." ); perguntas.add(nova); // @post: assert( perguntas.size() >= 1 ); } public void embaralhar() { c Copyright °1999-2004, Dr. Italo S. Vega 21-9 Laboratório de Programação Setembro de 2004 // @pre: assert( perguntas.size() > 0 ); // @do: Collections.shuffle( perguntas ); } public Pergunta obter( int i ) { // @pre: int n = perguntas.size(); assert( (0 <= i)&&(i < n) ); // @do: return (Pergunta)perguntas.get( i ); } } Classe Errou.java public class Errou extends Acao { public void processar( Aluno a, int aposta, Jogo jogo ) { a.dividir(); System.out.println( "Resposta ERRADA!" ); System.out.println( "Voce ganhou apenas= " + a.pontos ); jogo.terminar(); } } Classe Jogo.java public class Jogo { public BaseDePerguntas[] bases; int facil = 0; int medio = 1; int dificil = 2; int milhao = 3; public Nivel[] niveis; int na; // nivel atual de perguntas public Aluno aluno; public Pergunta pergunta; int aposta; // da pergunta atual public Tela tela; public Jogo() { configurarBases(); configurarNiveis(); na = facil; gerarPerguntaInicial(); aluno = new Aluno(); tela = new Tela(); tela.mudar( this ); } public void configurarNiveis() { // @pre: assert( bases != null ); assert( bases.length == 4 ); // @do: niveis = new Nivel[4]; niveis[facil] = new Nivel(); niveis[facil].carregar( 5, bases[facil] ); niveis[facil].aposta = 1000; niveis[medio] = new Nivel(); niveis[medio].carregar( 5, bases[medio] ); niveis[medio].aposta = 10000; niveis[dificil] = new Nivel(); niveis[dificil].carregar( 5, bases[dificil] ); niveis[dificil].aposta = 100000; niveis[milhao] = new Nivel(); niveis[milhao].carregar( 1, bases[milhao] ); niveis[milhao].aposta = 1000000; // @post: assert( niveis != null ); assert( niveis.length == 4 ); } c Copyright °1999-2004, Dr. Italo S. Vega 21-10 Laboratório de Programação Setembro de 2004 public void configurarBases() { bases = new BaseDePerguntas[ 4 ]; for( int i = facil; i <= milhao; i++ ) { bases[i] = new BaseDePerguntas(); } bases[facil].carregar( "FACIL" ); bases[medio].carregar( "MEDIO" ); bases[dificil].carregar( "DIFICIL" ); bases[milhao].carregar( "MILHAO" ); // @post: assert( bases.length == 4 ); assert( bases[facil].perguntas.size() >= 5 ); assert( bases[medio].perguntas.size() >= 5 ); assert( bases[dificil].perguntas.size() >= 5 ); assert( bases[milhao].perguntas.size() >= 1 ); } public void gerarPerguntaInicial() { // @pre: assert( (facil <= na)&&(na <= milhao) ); // @do: pergunta = niveis[ na ].obter(); aposta = niveis[na].aposta; } public void gerarPerguntaSeguinte() { // @pre: assert( (facil <= na)&&(na <= milhao) ); assert( (niveis[na].aposta <= aposta)&&(aposta <= niveis[na].aposta*5) ); // @do: pergunta = niveis[ na ].obter(); if( pergunta == null ) { na++; if( na < 4 ) { gerarPerguntaInicial(); } else { na--; terminar(); } } else { aposta += niveis[na].aposta; } // @post: assert( (facil <= na)&&(na <= milhao) ); assert( (niveis[na].aposta <= aposta)&&(aposta <= niveis[na].aposta*5) ); } public void perguntar() { System.out.println( "Valendo... " + aposta ); tela.mostrar( pergunta ); } public void terminar() { System.out.println( "Terminado." ); } public void analisarAcao( Acao x ) { // <- v3 x.processar( aluno, aposta, this ); } } Classe Nivel.java import java.util.Vector; public class Nivel { public String nome; // do nível, ex: "Fácil", "Médio", "Difícil" public Vector perguntas; // do nível public int aposta; public Nivel() { perguntas = new Vector(); aposta = 0; nome = "?"; } public void carregar( int n, BaseDePerguntas base ) { // @pre: c Copyright °1999-2004, Dr. Italo S. Vega 21-11 Laboratório de Programação Setembro de 2004 assert( base.perguntas.size() >= n ); // @do: for( int i = 0; i < n; i++ ) { Pergunta p = base.obter( i ); perguntas.add( p ); } } public Pergunta obter() { // @do: if( perguntas.isEmpty() ) { return null; } else { return (Pergunta)perguntas.remove( 0 ); } } public void mostrar() { System.out.println( nome ); System.out.println( "\tTotal de perguntas= " + perguntas.size() ); } } Classe Parou.java public class Parou extends Acao { public void processar( Aluno a, int aposta, Jogo jogo ) { System.out.println( "Voce ganhou= " + a.pontos ); jogo.terminar(); } } Classe Pergunta.java import java.util.Vector; public class Pergunta { public String enunciado; public Vector alternativas; public int correta; public Pergunta( String novoEnunciado ) { // @do: enunciado = novoEnunciado; alternativas = new Vector(); correta = -1; } public void definirAlternativa( String texto ) { // @pre: menos do que 4 alternativas int n = alternativas.size(); assert( (0 <= n) && (n < 4) ); // @do: int ordem = n + 1; Alternativa nova = new Alternativa( "" + ordem + ") " + texto ); alternativas.add( nova ); // @post: até 4 alternativas assert( (0 < alternativas.size()) && (alternativas.size() <= 4) ); } public void definirAlternativaCorreta( String texto ) { // @pre: menos do que 4 alternativas int n = alternativas.size(); assert( (0 <= n) && (n < 4) ); // @do: int ordem = n + 1; Alternativa nova = new Alternativa( "" + ordem + ") " + texto ); alternativas.add( nova ); correta = ordem; // @post: até 4 alternativas, uma delas correta assert( (0 < alternativas.size()) && (alternativas.size() <= 4) ); assert( ( 1 <= correta )&&(correta <= 4) ); } public void mostrar() { // @pre: tem 4 alternativas, uma delas correta c Copyright °1999-2004, Dr. Italo S. Vega 21-12 Laboratório de Programação Setembro de 2004 assert( alternativas.size() == 4 ); assert( ( 1 <= correta )&&(correta <= 4) ); // @do: System.out.println( enunciado ); for( int i = 0; i < alternativas.size(); i++ ) { Alternativa a = (Alternativa)alternativas.get(i); a.mostrar(); } } public Acao analisarAlternativa( int ordem ) { // <- v3 // @pre: ordem corresponde a alguma alternativa assert( ( 1 <= ordem )&&(ordem <= 4) ); // @do: if( ordem == correta ) { return new Acertou(); } else { return new Errou(); } } public Acao parar() { // @do: return new Parou(); } } Classe Tela.java public class Tela { public Pergunta pergunta; public int ordem; public Jogo jogo; // <- v2 public void mudar( Jogo dono ) { // <- v2 jogo = dono; } public void mostrar( Pergunta p ) { // @do: pergunta = p; System.out.println( "=====" ); pergunta.mostrar(); } public void selecionar( int nova ) { // @do: ordem = nova; } public void responder() { // @do: Acao a = pergunta.analisarAlternativa( ordem ); jogo.analisarAcao( a ); } public void parar() { // @do: pergunta.parar(); } } Pacote teste Classe TesteBaseDePerguntas.java package teste; public class TesteBaseDePerguntas { public BaseDePerguntas facil; public BaseDePerguntas medio; public BaseDePerguntas dificil; public BaseDePerguntas milhao; c Copyright °1999-2004, Dr. Italo S. Vega 21-13 Laboratório de Programação Setembro de 2004 public TesteBaseDePerguntas() { // @do: criação das bases facil = new BaseDePerguntas(); medio = new BaseDePerguntas(); dificil = new BaseDePerguntas(); milhao = new BaseDePerguntas(); } public void mostrarEnunciados( BaseDePerguntas base ) { for( int i = 0; i < base.perguntas.size(); i++ ) { Pergunta p = base.obter( i ); System.out.println( p.enunciado ); } System.out.println( ".........." ); } public void cenario1() { // @do: carga das bases facil.carregar( "FACIL" ); medio.carregar( "MEDIO" ); dificil.carregar( "DIFICIL" ); milhao.carregar( "MILHAO" ); System.out.println("> ENUNCIADOS da base milhao:" ); mostrarEnunciados( milhao ); } public void cenario2() { // @do: embaralhamento System.out.println("> ANTES de embaralhar o nivel Facil:" ); mostrarEnunciados( facil ); facil.embaralhar(); System.out.println("> DEPOIS de embaralhar o nivel Facil:" ); mostrarEnunciados( facil ); } public Pergunta cenario3() { Pergunta p = facil.obter( 0 ); p.mostrar(); return p; } } Classe TesteNivel.java package teste; public class TesteNivel { public BaseDePerguntas bpFacil; public Nivel facil; public TesteNivel() { bpFacil = new BaseDePerguntas(); bpFacil.carregar( "FACIL" ); facil = new Nivel(); } public void cenario1() { facil.mostrar(); } public void cenario2() { facil.carregar( 5, bpFacil ); facil.mostrar(); } public Pergunta cenario3() { return facil.obter(); } } Classe TestePergunta.java package teste; public class TestePergunta { public Pergunta p11; public void cenario() { // @do: p11 = new Pergunta( "O que é computação?" ); p11.definirAlternativaCorreta( "É um cálculo." ); p11.definirAlternativa( "É um procedimento." ); c Copyright °1999-2004, Dr. Italo S. Vega 21-14 Laboratório de Programação } Setembro de 2004 p11.definirAlternativa( "É uma rotina." ); p11.definirAlternativa( "É um método." ); p11.mostrar(); public Alternativa obter( int i ) { // @do: return (Alternativa)p11.alternativas.get(i); } } Classe TesteTela.java package teste; public class TesteTela { public Pergunta p11; public Tela tela; public void cenario() { // @do: p11 = new Pergunta( "O que é computação?" ); p11.definirAlternativaCorreta( "É um cálculo." ); p11.definirAlternativa( "É um procedimento." ); p11.definirAlternativa( "É uma rotina." ); p11.definirAlternativa( "É um método." ); tela = new Tela(); } } c Copyright °1999-2004, Dr. Italo S. Vega 21-15