Trabalho / Loterias

Introdução

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.

Descrição

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.

Quina

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.

Lotogol

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.

Precisão numérica

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.

Desenvolvimento

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.

Execução dos testes

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

Envio do trabalho

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.

Avaliação

O trabalho será avaliado de acordo com os critérios:

Dicas

Esta seção contém algumas dicas de implementação. Use as que achar útil.