Arabian Nights in C++: Difference between revisions

From Wiki**3

Root (talk | contribs)
No edit summary
Root (talk | contribs)
No edit summary
Line 1: Line 1:
{{TOCright}}
== The Problem (in Portuguese) ==
== The Problem (in Portuguese) ==
<span lang="pt">Aplicando os conceitos OO que já conhece, concretize as classes necessárias para representar a funcionalidade que se descreve de seguida. Pode ser necessária a criação de classes adicionais não descritas abaixo. Todas as classes indicadas devem pertencer ao &quot;namespace&quot;  
<span lang="pt">Aplicando os conceitos OO que já conhece, concretize as classes necessárias para representar a funcionalidade que se descreve de seguida. Pode ser necessária a criação de classes adicionais não descritas abaixo. Todas as classes indicadas devem pertencer ao &quot;namespace&quot; <tt><span style="color: #cc0000">arabiannights</span></tt>.  
<tt>
<span style="color: #cc0000">arabiannights</span></tt>.  
<br />
<ol>
  <li>Funcionalidade da lâmpada mágica (classe
  <span style="color: #cc0000">
  <tt>MagicLamp</tt></span>):
  <br /> Uma lâmpada mágica liberta génios quando esfregada (método
  <span style="color: #cc0000">


  <tt>rub</tt></span>). Os génios podem ser bem ou mal-humorados. O humor dos génios é determinado pelas condições da lâmpada: sempre que a lâmpada tiver sido esfregada um número par de vezes (sem contar a actual), o génio sai mal-humorado. A quantidade de génios disponíveis é determinada no momento de encantamento da lâmpada (criação). Depois de esgotados os génios disponíveis, já não adianta esfregar a lâmpada para obter um génio, bem ou mal-humorado: nestas condições, a lâmpada cria um pequeno demónio que responde a pedidos de forma literal mas perversa. Devido a requisitos de sustentabilidade ambiental, as normas de produção exigem que as lâmpadas sejam recarregáveis. Assim, é possível voltar a obter génios quando se esfrega a lâmpada (em número igual ao inicial). O processo de recarregamento exige apenas que um demónio seja alimentado à lâmpada (método
=== Funcionalidade da lâmpada mágica (classe <span style="color: #cc0000"><tt>MagicLamp</tt></span>) ===
  <tt>
  <span style="color: #cc0000">feedDemon</span></tt>).
  <br />
  <br />Quando se cria uma nova lâmpada é necessário indicar a quantidade inicial de génios que é possível invocar (a lâmpada cria internamente os génios e apenas retorna referências ou ponteiros para eles). É possível saber quantos génios ainda estão disponíveis na lâmpada (método
  <tt>
  <span style="color: #cc0000">nGenies</span></tt> ). É ainda possível saber quantas vezes a lâmpada já foi recarregada (método
  <tt>
  <span style="color: #cc0000">nDemons</span></tt> ). Quando se esfrega a lâmpada, deve-se indicar quantos desejos se espera que o génio realize (independentemente de o génio os poder negar).
  <br />


  <br /> Deve ser possível comparar duas instâncias da classe
Uma lâmpada mágica liberta génios quando esfregada (método <span style="color: #cc0000"><tt>rub</tt></span>). Os génios podem ser bem ou mal-humorados. O humor dos génios é determinado pelas condições da lâmpada: sempre que a lâmpada tiver sido esfregada um número par de vezes (sem contar a actual), o génio sai mal-humorado. A quantidade de génios disponíveis é determinada no momento de encantamento da lâmpada (criação). Depois de esgotados os génios disponíveis, já não adianta esfregar a lâmpada para obter um génio, bem ou mal-humorado: nestas condições, a lâmpada cria um pequeno demónio que responde a pedidos de forma literal mas perversa. Devido a requisitos de sustentabilidade ambiental, as normas de produção exigem que as lâmpadas sejam recarregáveis. Assim, é possível voltar a obter génios quando se esfrega a lâmpada (em número igual ao inicial). O processo de recarregamento exige apenas que um demónio seja alimentado à lâmpada (método <tt><span style="color: #cc0000">feedDemon</span></tt>).
  <tt>
  <span style="color: #cc0000">MagicLamp</span></tt> através do operador
  <tt>
  <span style="color: #cc0000">==</span></tt>. Considera-se que duas lâmpadas são iguais se tiverem a mesma capacidade e se os valores retornados pelos métodos
  <tt>
  <span style="color: #cc0000">nGenies</span></tt> e
  <tt>


  <span style="color: #cc0000">nDemons</span></tt> forem iguais.
Quando se cria uma nova lâmpada é necessário indicar a quantidade inicial de génios que é possível invocar (a lâmpada cria internamente os génios e apenas retorna referências ou ponteiros para eles). É possível saber quantos génios ainda estão disponíveis na lâmpada (método <tt><span style="color: #cc0000">nGenies</span></tt> ). É ainda possível saber quantas vezes a lâmpada já foi recarregada (método <tt><span style="color: #cc0000">nDemons</span></tt> ). Quando se esfrega a lâmpada, deve-se indicar quantos desejos se espera que o génio realize (independentemente de o génio os poder negar).
  <br />
  <br /> Nota: a lâmpada liberta apenas um génio de cada vez.
  <br />
  <br /></li>
  <li>Funcionalidade do génio bem-humorado (classe
  <tt>
  <span style="color: #cc0000">FriendlyGenie</span></tt>):
  <br />O génio bem-humorado concede todos os desejos que lhe forem colocados (método
  <tt>


  <span style="color: #cc0000">grantWish</span></tt> e retorno
Deve ser possível comparar duas instâncias da classe <tt><span style="color: #cc0000">MagicLamp</span></tt> através do operador <tt><span style="color: #cc0000">==</span></tt>. Considera-se que duas lâmpadas são iguais se tiverem a mesma capacidade e se os valores retornados pelos métodos <tt><span style="color: #cc0000">nGenies</span></tt> e <tt><span style="color: #cc0000">nDemons</span></tt> forem iguais.
  <tt>
  <span style="color: #cc0000">true</span></tt>), até ao limite com que foi chamado da lâmpada. Depois do limite já não são concedidos desejos (retorno
  <tt>
  <span style="color: #cc0000">false</span></tt>). É possível saber quantos desejos já foram concedidos (método
  <tt>
  <span style="color: #cc0000">nGrantedWishes</span></tt> ) e quantos ainda existem disponíveis (método
  <tt>


  <span style="color: #cc0000">nRemainingWishes</span></tt> ).
Nota: a lâmpada liberta apenas um génio de cada vez.
  <br />
  <br /> Nota: o génio concede apenas um desejo de cada vez.
  <br />
  <br /></li>
  <li>Funcionalidade do génio mal-humorado (classe
  <tt>
  <span style="color: #cc0000">GrumpyGenie</span></tt>):
  <br /> O génio mal-humorado concede apenas o primeiro desejo que lhe for colocado (método
  <span style="color: #cc0000">


  <tt>grantWish</tt></span> e retorno
=== Funcionalidade do génio bem-humorado (classe <tt><span style="color: #cc0000">FriendlyGenie</span></tt>) ===
  <tt>
  <span style="color: #cc0000">true</span></tt>), independentemente do limite com que foi chamado da lâmpada (retorno
  <tt>
  <span style="color: #cc0000">false</span></tt> após o primeiro). É possível saber se o desejo já foi realizado (método
  <tt>
  <span style="color: #cc0000">nGrantedWishes</span></tt> retorna 1).
  <br />


  <br /></li>
O génio bem-humorado concede todos os desejos que lhe forem colocados (método <tt><span style="color: #cc0000">grantWish</span></tt> e retorno <tt><span style="color: #cc0000">true</span></tt>), até ao limite com que foi chamado da lâmpada. Depois do limite já não são concedidos desejos (retorno <tt><span style="color: #cc0000">false</span></tt>). É possível saber quantos desejos já foram concedidos (método <tt><span style="color: #cc0000">nGrantedWishes</span></tt> ) e quantos ainda existem disponíveis (método <tt><span style="color: #cc0000">nRemainingWishes</span></tt>).
  <li>Funcionalidade do demónio reciclável (classe
  <tt>
  <span style="color: #cc0000">RecyclableDemon</span></tt>):
  <br /> O demónio concede todos os desejos que lhe forem colocados (método  
  <tt>
  <span style="color: #cc0000">grantWish</span></tt> e retorno
  <tt>
  <span style="color: #cc0000">true</span></tt>), independentemente do limite com que foi chamado da lâmpada. Se o demónio for recolocado na lâmpada (para a recarregar), já não pode realizar mais desejos (retorno
  <tt>


  <span style="color: #cc0000">false</span></tt>). É possível saber quantos desejos já foram concedidos (método
Nota: o génio concede apenas um desejo de cada vez.
  <tt>
  <span style="color: #cc0000">nGrantedWishes</span></tt> ).
  <br />
  <br /> Nota: o demónio concede apenas um desejo de cada vez.</li>
</ol>Todas as classes devem ter métodos de acesso
<em>- get</em> e


<em>set</em> (quando apropriado) - para os seus atributos.
=== Funcionalidade do génio mal-humorado (classe <tt><span style="color: #cc0000">GrumpyGenie</span></tt>) ===
<br /> O operador
<tt>
<span style="color: #cc0000">&lt;&lt;</span></tt>, aplicado aos génios e ao demónio, deve enviar para o stream de saída correspondente uma das seguintes cadeias de caracteres:
<br />
<ul>
  <li>
  <span style="color: #cc0000">
  <tt>Friendly genie has granted</tt></span>
  <tt>#</tt>
  <span style="color: #cc0000">


  <tt>wishes and still has</tt></span>  
O génio mal-humorado concede apenas o primeiro desejo que lhe for colocado (método <span style="color: #cc0000"><tt>grantWish</tt></span> e retorno <tt><span style="color: #cc0000">true</span></tt>), independentemente do limite com que foi chamado da lâmpada (retorno <tt><span style="color: #cc0000">false</span></tt> após o primeiro). É possível saber se o desejo já foi realizado (método <tt><span style="color: #cc0000">nGrantedWishes</span></tt> retorna 1).
  <tt>#</tt>
  <span style="color: #cc0000">
  <tt>to grant.</tt></span> (# representam os contadores apropriados)</li>
  <li>
  <span style="color: #cc0000">
  <tt>Grumpy genie has granted a wish.</tt></span> /
  <span style="color: #cc0000">


  <tt>Grumpy genie has a wish to grant.</tt></span> (consoante já concedeu ou não o pedido)</li>
=== Funcionalidade do demónio reciclável (classe <tt><span style="color: #cc0000">RecyclableDemon</span></tt>) ===
  <li>
  <span style="color: #cc0000">
  <tt>Recyclable demon has granted</tt></span>  
  <tt>#</tt>  
  <span style="color: #cc0000">
  <tt>wishes.</tt></span> /
  <span style="color: #cc0000">


  <tt>Demon has been recycled.</tt></span> (antes e depois de recarregar uma lâmpada)</li>
O demónio concede todos os desejos que lhe forem colocados (método <tt><span style="color: #cc0000">grantWish</span></tt> e retorno <tt><span style="color: #cc0000">true</span></tt>), independentemente do limite com que foi chamado da lâmpada. Se o demónio for recolocado na lâmpada (para a recarregar), já não pode realizar mais desejos (retorno <tt><span style="color: #cc0000">false</span></tt>). É possível saber quantos desejos já foram concedidos (método <tt><span style="color: #cc0000">nGrantedWishes</span></tt>).
</ul>A função
<tt>
<span style="color: #cc0000">main</span></tt> deve executar a seguinte sequência de operações:  
<br />  
<ol>
  <li>Criar uma lâmpada mágica com capacidade para 4 génios.</li>
  <li>Esfregar 5 vezes a lâmpada, indicando os números de desejos 2, 3, 4, 5, 1.</li>


  <li>Imprimir em
Nota: o demónio concede apenas um desejo de cada vez.
  <tt>
  <span style="color: #cc0000">std::cout</span></tt> (utilizando o operador
  <tt>
  <span style="color: #cc0000">&lt;&lt;</span></tt>) cada um dos génios.</li>
  <li>Pedir um desejo a cada um dos génios.</li>
  <li>Imprimir em
  <tt>


  <span style="color: #cc0000">std::cout</span></tt> (utilizando o operador
=== Observações ===
  <tt>
  <span style="color: #cc0000">&lt;&lt;</span></tt>) cada um dos génios.</li>
  <li>Pedir um desejo a cada um dos génios.</li>
  <li>Imprimir em
  <tt>
  <span style="color: #cc0000">std::cout</span></tt> (utilizando o operador
  <tt>


  <span style="color: #cc0000">&lt;&lt;</span></tt>) cada um dos génios.</li>
Todas as classes devem ter métodos de acesso (<em>get</em> e <em>set</em>) (quando apropriado) para os seus atributos.
  <li>Colocar o demónio reciclável na lâmpada.</li>
  <li>Esfregar a lâmpada, indicando 7 como número de desejos.</li>
  <li>Imprimir em  
  <tt>
  <span style="color: #cc0000">std::cout</span></tt> (utilizando o operador
  <tt>


  <span style="color: #cc0000">&lt;&lt;</span></tt>) o génio obtido.</li>
O operador <tt><span style="color: #cc0000">&lt;&lt;</span></tt>, aplicado aos génios e ao demónio, deve enviar para o stream de saída correspondente uma das seguintes cadeias de caracteres:
</ol>
* <span style="color: #cc0000"><tt>Friendly genie has granted</tt></span> <tt>#</tt> <span style="color: #cc0000"><tt>wishes and still has</tt></span> <tt>#</tt> <span style="color: #cc0000"><tt>to grant.</tt></span> (# representam os contadores apropriados)
</span>
* <span style="color: #cc0000"><tt>Grumpy genie has granted a wish.</tt></span> / <span style="color: #cc0000"><tt>Grumpy genie has a wish to grant.</tt></span> (consoante já concedeu ou não o pedido)
* <span style="color: #cc0000"><tt>Recyclable demon has granted</tt></span> <tt>#</tt> <span style="color: #cc0000"><tt>wishes.</tt></span> / <span style="color: #cc0000"><tt>Demon has been recycled.</tt></span> (antes e depois de recarregar uma lâmpada)
 
A função <tt><span style="color: #cc0000">main</span></tt> deve executar a seguinte sequência de operações:
# Criar uma lâmpada mágica com capacidade para 4 génios.
# Esfregar 5 vezes a lâmpada, indicando os números de desejos 2, 3, 4, 5, 1.
# Imprimir em <tt><span style="color: #cc0000">std::cout</span></tt> (utilizando o operador <tt><span style="color: #cc0000">&lt;&lt;</span></tt>) cada um dos génios.
# Pedir um desejo a cada um dos génios.
# Imprimir em <tt><span style="color: #cc0000">std::cout</span></tt> (utilizando o operador <tt><span style="color: #cc0000">&lt;&lt;</span></tt>) cada um dos génios.
# Pedir um desejo a cada um dos génios.
# Imprimir em <tt><span style="color: #cc0000">std::cout</span></tt> (utilizando o operador <tt><span style="color: #cc0000">&lt;&lt;</span></tt>) cada um dos génios.
# Colocar o demónio reciclável na lâmpada.
# Esfregar a lâmpada, indicando 7 como número de desejos.
# Imprimir em <tt><span style="color: #cc0000">std::cout</span></tt> (utilizando o operador <tt><span style="color: #cc0000">&lt;&lt;</span></tt>) o génio obtido.


== Implementation ==
== Implementation ==

Revision as of 22:58, 27 February 2008

The Problem (in Portuguese)

Aplicando os conceitos OO que já conhece, concretize as classes necessárias para representar a funcionalidade que se descreve de seguida. Pode ser necessária a criação de classes adicionais não descritas abaixo. Todas as classes indicadas devem pertencer ao "namespace" arabiannights.

Funcionalidade da lâmpada mágica (classe MagicLamp)

Uma lâmpada mágica liberta génios quando esfregada (método rub). Os génios podem ser bem ou mal-humorados. O humor dos génios é determinado pelas condições da lâmpada: sempre que a lâmpada tiver sido esfregada um número par de vezes (sem contar a actual), o génio sai mal-humorado. A quantidade de génios disponíveis é determinada no momento de encantamento da lâmpada (criação). Depois de esgotados os génios disponíveis, já não adianta esfregar a lâmpada para obter um génio, bem ou mal-humorado: nestas condições, a lâmpada cria um pequeno demónio que responde a pedidos de forma literal mas perversa. Devido a requisitos de sustentabilidade ambiental, as normas de produção exigem que as lâmpadas sejam recarregáveis. Assim, é possível voltar a obter génios quando se esfrega a lâmpada (em número igual ao inicial). O processo de recarregamento exige apenas que um demónio seja alimentado à lâmpada (método feedDemon).

Quando se cria uma nova lâmpada é necessário indicar a quantidade inicial de génios que é possível invocar (a lâmpada cria internamente os génios e apenas retorna referências ou ponteiros para eles). É possível saber quantos génios ainda estão disponíveis na lâmpada (método nGenies ). É ainda possível saber quantas vezes a lâmpada já foi recarregada (método nDemons ). Quando se esfrega a lâmpada, deve-se indicar quantos desejos se espera que o génio realize (independentemente de o génio os poder negar).

Deve ser possível comparar duas instâncias da classe MagicLamp através do operador ==. Considera-se que duas lâmpadas são iguais se tiverem a mesma capacidade e se os valores retornados pelos métodos nGenies e nDemons forem iguais.

Nota: a lâmpada liberta apenas um génio de cada vez.

Funcionalidade do génio bem-humorado (classe FriendlyGenie)

O génio bem-humorado concede todos os desejos que lhe forem colocados (método grantWish e retorno true), até ao limite com que foi chamado da lâmpada. Depois do limite já não são concedidos desejos (retorno false). É possível saber quantos desejos já foram concedidos (método nGrantedWishes ) e quantos ainda existem disponíveis (método nRemainingWishes).

Nota: o génio concede apenas um desejo de cada vez.

Funcionalidade do génio mal-humorado (classe GrumpyGenie)

O génio mal-humorado concede apenas o primeiro desejo que lhe for colocado (método grantWish e retorno true), independentemente do limite com que foi chamado da lâmpada (retorno false após o primeiro). É possível saber se o desejo já foi realizado (método nGrantedWishes retorna 1).

Funcionalidade do demónio reciclável (classe RecyclableDemon)

O demónio concede todos os desejos que lhe forem colocados (método grantWish e retorno true), independentemente do limite com que foi chamado da lâmpada. Se o demónio for recolocado na lâmpada (para a recarregar), já não pode realizar mais desejos (retorno false). É possível saber quantos desejos já foram concedidos (método nGrantedWishes).

Nota: o demónio concede apenas um desejo de cada vez.

Observações

Todas as classes devem ter métodos de acesso (get e set) (quando apropriado) para os seus atributos.

O operador <<, aplicado aos génios e ao demónio, deve enviar para o stream de saída correspondente uma das seguintes cadeias de caracteres:

  • Friendly genie has granted # wishes and still has # to grant. (# representam os contadores apropriados)
  • Grumpy genie has granted a wish. / Grumpy genie has a wish to grant. (consoante já concedeu ou não o pedido)
  • Recyclable demon has granted # wishes. / Demon has been recycled. (antes e depois de recarregar uma lâmpada)

A função main deve executar a seguinte sequência de operações:

  1. Criar uma lâmpada mágica com capacidade para 4 génios.
  2. Esfregar 5 vezes a lâmpada, indicando os números de desejos 2, 3, 4, 5, 1.
  3. Imprimir em std::cout (utilizando o operador <<) cada um dos génios.
  4. Pedir um desejo a cada um dos génios.
  5. Imprimir em std::cout (utilizando o operador <<) cada um dos génios.
  6. Pedir um desejo a cada um dos génios.
  7. Imprimir em std::cout (utilizando o operador <<) cada um dos génios.
  8. Colocar o demónio reciclável na lâmpada.
  9. Esfregar a lâmpada, indicando 7 como número de desejos.
  10. Imprimir em std::cout (utilizando o operador <<) o génio obtido.

Implementation

The following corresponds to a possible implementation of a special version of the Arabian Nights stories.