Arabian Nights in C++: Difference between revisions

From Wiki**3

Root (talk | contribs)
New page: == Implementation == The following corresponds to a possible implementation of a special version of the Arabian Nights stories. * Arabian Nights in C++ (implementation) [[category:...
 
Root (talk | contribs)
No edit summary
Line 1: Line 1:
== 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;
<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
  <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
  <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.
  <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
  <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> ).
  <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
  <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>
  <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
  <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.
<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>
  <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>
  <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>
</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
  <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
  <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>
  <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>
</ol>
</span>


== Implementation ==
== Implementation ==

Revision as of 22:45, 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.

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

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

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

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

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.