O objetivo deste trabalho é a implementação de um sistema de loterias em Java.
O trabalho é em equipe de até duas pessoas. O compartilhamento de informações entre as equipes é permitido (e aconselhado), mas o compartilhamento de código não é permitido. Trabalhos que tenham porções significativas de código iguais, ou copiados da internet, serão anulados. Veja a resolução Nº 008/2007-COU para as possíveis sansões disciplinares. Cada membro da equipe deverá apresentar o trabalho individualmente para o professor.
Este trabalho vale 5,0 pontos na nota do quarto bimestre.
Data de entrega: até o dia 25/11/2013 às 23:00h.
Uma loteria é um tipo de jogo de azar onde o apostador escolhe um subconjunto de itens de um conjunto pré-definido e os ganhadores são definidos por sorteio ou por resultados de algum esporte. Em geral, os prêmios são definidos em termos de porcentagem da arrecadação das apostas. No Brasil, as únicas loterias permitidas são aquelas gerenciadas pela Caixa.
Um sistema de loterias deve ser capaz de ler as apostas e o resultado (do sorteio) e calcular os ganhadores e os valores dos prêmios.
Este trabalho consiste na implementação de um sistema de loterias em Java. Um aspecto importante deste sistema é que ele seja extensível, isto é, que uma nova loteria possa ser adicionada facilmente ao sistema. O uso correto da orientação a objetos é essencial para isto. Inicialmente o sistema deve suportar dois tipos de loterias: Quina e Lotogol.
O programa deve receber como parâmetro na linha de comando o nome da loteria e
um diretório. No diretório devem existir dois arquivos: apostas
e
resultado
. Cada linha do arquivo de apostas contém uma aposta em formato
específico para cada loteria. O arquivo de resultado contém apenas um linha com
o resultado. O programa deve escrever na saída padrão o total arrecadado, o
total de prêmios, o valor de cada prêmio e a quantidade de ganhadores de cada
prêmio.
Na Quina o apostador escolhe 5, 6 ou 7 números entre 1 e 80. Estas apostas custam respectivamente R$ 0,75, R$ 3,00 e R$ 7,50. São sorteados 5 números, o apostador ganha se acertar 5, 4 ou 3 números. Do total arrecadado, 32,20% (o total arrecadado equivale a 104,5%) são destinados aos prêmios. O valor destinado ao pagamento dos prêmios tem a seguinte distribuição:
Cada linha de um arquivo de apostas para Quina consiste dos números de uma aposta, separados por espaço. Podem existir 5, 6 ou 7 números por linha. De maneira semelhante, a única linha do arquivo de resultado contém os 5 números sorteados.
Considere um diretório exemplo-quina
, com o arquivo apostas
, com o seguinte
conteúdo
8 25 36 37 49 60 74
5 22 31 36 37 50 60
7 37 63 64 74
5 8 25 32 37 60
11 21 44 47 62
8 25 36 37 60
6 8 17 25 44 60
4 27 30 32 33 38 76
e o arquivo resultado
, com o seguinte conteúdo
8 25 36 37 60
Se o programa for chamado com os parâmetros quina exemplo-quina
, o programa
deve escrever na tela a seguinte resposta:
30,75
9,48
Quina 2 1,66
Quadra 1 2,37
Terno 2 1,18
O que significa que a arrecadação foi de R$ 30,75 e o valor destinado aos prêmios foi de R$ 9,48. Houveram duas apostas que acertaram a quina e cada uma ganhou o prêmio de R$ 1,66. Houve uma aposta que acertou a quadra e ganhou R$ 2,37. Houveram duas apostas que acertaram o terno e cada uma ganhou R$ 1,18.
Na Lotogol o apostador escolhe o placar de 5 jogos de futebol. Para cada jogo ele deve escolher a quantidade de gols, entre as opções 0, 1, 2, 3 ou + (que significa mais do que 3 gols), dos dois times. O apostador pode concorrer com 1, 2 ou 4 apostas iguais. Os custo de cada tipo de aposta é respectivamente R$ 0,50, R$ 1,00 e R$ 2,00. O apostador ganha se acertar 5, 4 ou 3 placares dos jogos. Do total arrecadado, 28% (o total arrecadado equivale a 104,5%) são destinados aos prêmios. O valor destinado ao pagamento dos prêmios tem a seguinte distribuição:
Cada linha de um arquivo de apostas para a Lotogol consiste de 11 itens
separados por espaços. O primeiro item é a quantidade de vezes (1, 2 ou 4) que
a aposta esta concorrendo. Os próximos 10 itens representam os placares de cada
jogo. Por exemplo, a linha 4 3 1 + 2 0 0 + 1 1 2
, representa uma aposta que
está concorrendo 4 vezes, com os placares 3 1, + 2, 0 0, + 1 e 1 2. O arquivo
resultado contém apenas uma linha com 10 itens, que são os placares dos 5 jogos.
Considere um diretório exemplo-lotogol
, com o arquivo apostas
, com o
seguinte conteúdo
1 3 2 + 2 3 3 0 + 2 3
2 2 + + 2 0 0 0 + 2 3
1 3 3 + 2 3 3 0 + 2 3
1 + 0 0 2 2 + 3 + + 1
2 3 2 0 2 + 2 0 + 2 3
1 2 0 3 0 3 3 0 + 1 3
1 3 2 + 2 3 3 0 + 2 3
2 3 2 + 2 1 3 0 + 2 3
2 0 0 3 1 2 + 0 1 2 +
e o arquivo resultado
, com o seguinte conteúdo
3 2 + 2 3 3 0 + 2 3
Se o programa for chamado com os parâmetros lotogol exemplo-lotogol
, o
programa deve escrever na tela a seguinte resposta:
6,50
1,74
1º (5 acertos) 2 0,35
2º (4 acertos) 3 0,17
3º (3 acertos) 4 0,13
O que significa que a arrecadação foi de R$ 6,50 e o valor destinado aos prêmios foi de R$ 1,74. Houveram duas apostas que acertaram 5 placares e cada uma ganhou o prêmio de R$ 0,35. Houveram três apostas que acertaram 4 placares e cada uma ganhou R$ 0,17. Houveram quadro apostas que acertaram 3 placares e cada uma ganhou R$ 0,13.
Em nenhum sistema deve ser usado tipo ponto flutuante para representar valores monetários. As operações com ponto flutuantes não são precisas. O correto é trabalhar com tipo decimal. No entanto, trabalhar com a valores decimais (no caso do Java, a classe BigDecimal), requer algum prática. Como o tempo para fazer o trabalho é curto, você poderá utilizar tipos flutuantes para representar os valores monetários neste trabalho. No entanto, é possível que existam pequenas diferenças entre o resultado do seu programa e os testes. Como o testador verifica apenas a saída textual do programa, ele não tolera estes erros. Isto significa que se houver qualquer diferença (mesmo que de 1 centavo) no resultado o testador considera que o caso de teste falhou. Você terá que ignorar estes falsos/positivos do testador e verificar se a sua resposta está próxima o bastante da esperada.
Para facilitar o desenvolvimento do programa, está disponível um “projeto”
com os arquivos iniciais de código, um programa testador e um Makefile
para
testar e enviar os programas. Este projeto pode ser aberto pelo Netbeans 7.3 ou
Eclipse Kepler.
Para fazer o download do projeto é necessário ter o git
instalado. Se você
utiliza um sistema GNU/Linux baseado no Debian (Mint, Ubuntu, etc), o git
pode ser instalado com o comando
sudo apt-get install git
Para fazer o download do projeto, execute o comando
git clone http://malbarbo.pro.br/git/loterias
Após a execução deste comando, um diretório chamado loterias
terá sido criado.
O método main
está no arquivo src/main/java/loteria/Main.java
. Você pode
criar outros arquivo e outros pacotes.
Para executar os testes, é necessário ter o maven instalado. Para instalar o maven execute o comando
sudo apt-get install maven
Para executar os testes, entre no diretório loterias
(raiz do projeto) e
execute o comando
make teste
Para enviar o trabalho, execute o comando
make enviar
O script de envio criará um arquivo compactado com os arquivos a serem entregues para correção e enviará para a página do professor.
Após enviar o trabalho, o aluno deverá entrar na página da disciplina, imprimir e assinar o termo de autoria. O termo de autoria é um documento em que o aluno afirma que ele é o autor do código do trabalho que ele enviou e que portanto, não copiou parte significativa do programa de outra pessoa ou da internet.
O trabalho será avaliado de acordo com os critérios:
Esta seção contém algumas dicas de implementação. Use as que achar útil.