Milhão da Computação- Ações - PUC-SP

Propaganda
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
Download