Arabian Nights in C++: Difference between revisions
From Wiki**3
No edit summary |
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 "namespace" | <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 "namespace" <tt><span style="color: #cc0000">arabiannights</span></tt>. | ||
<tt> | |||
<span style="color: #cc0000">arabiannights</span></tt>. | |||
=== Funcionalidade da lâmpada mágica (classe <span style="color: #cc0000"><tt>MagicLamp</tt></span>) === | |||
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>). | |||
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). | |||
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. | |||
Nota: a lâmpada liberta apenas um génio de cada vez. | |||
=== Funcionalidade do génio bem-humorado (classe <tt><span style="color: #cc0000">FriendlyGenie</span></tt>) === | |||
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>). | |||
Nota: o génio concede apenas um desejo de cada vez. | |||
=== Funcionalidade do génio mal-humorado (classe <tt><span style="color: #cc0000">GrumpyGenie</span></tt>) === | |||
<tt> | |||
<span style="color: #cc0000"> | |||
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). | |||
=== Funcionalidade do demónio reciclável (classe <tt><span style="color: #cc0000">RecyclableDemon</span></tt>) === | |||
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>). | |||
<tt> | |||
<span style="color: #cc0000"> | |||
< | |||
< | |||
Nota: o demónio concede apenas um desejo de cada vez. | |||
=== Observações === | |||
Todas as classes devem ter métodos de acesso (<em>get</em> e <em>set</em>) (quando apropriado) para os seus atributos. | |||
O operador <tt><span style="color: #cc0000"><<</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: | |||
</ | * <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"><<</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"><<</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"><<</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"><<</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:
- 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 std::cout (utilizando o operador <<) cada um dos génios.
- Pedir um desejo a cada um dos génios.
- Imprimir em std::cout (utilizando o operador <<) cada um dos génios.
- Pedir um desejo a cada um dos génios.
- Imprimir em std::cout (utilizando o operador <<) 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 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.