Você está na página 1de 6

Universidade Federal do Espírito Santo

Programação II – 2015/2
2º Trabalho Computacional - Entrega: 26/11/2015

Jogo de Bingo

Um jogo de bingo é realizado em várias rodadas. Em uma rodada, cada participante


recebe uma cartela numerada (uma matriz bidimensional de números inteiros) e são
sorteados sucessivamente vários números até que todos os possíveis prêmios sejam
concedidos. Normalmente, o prêmio é concedido para quem primeiro tem todos os
números de sua cartela sorteados. No entanto, um mesmo jogo pode conceder outros
tipos de prêmios. Por exemplo, pode-se premiar também quem primeiro completa
uma linha ou coluna com números sorteados.
Este trabalho requer que você implemente um programa em C que gerencie um jogo
de bingo. Este programa deve manter um cadastro dos participantes, gerar as cartelas
de cada participante em cada rodada, sortear os números de cada rodada e controlar a
premiação, verificando automaticamente quem ganhou cada prêmio, e mantendo o
valor total de premiação de cada participante. Ao final do jogo, o programa deve
indicar quem obteve premiação e qual foi o total premiado a cada participante, além
de indicar também quem não conseguiu qualquer premiação.
Os prêmios deste jogo de bingo serão obtidos por quem primeiro completar a diagonal
principal da cartela, a diagonal secundária da cartela, a moldura da cartela (isto é,
todas as casas que ficam nas linhas e colunas das extremidades da cartela) e toda a
cartela. O valor a ser distribuído como prêmios em cada rodada (vdr) é função do total
de participantes t, do valor pago por cada participante v, do número de rodadas r e é
obtido pela seguinte fórmula:
vdr = t * v / r
O valor de cada premiação depende do valor vdr e do tipo de premiação obtida. A
tabela seguinte apresenta as fórmulas utilizadas para obter o valor de cada tipo de
premiação.
Tabela de Premiação
Diagonal Principal 0.125 * vdr
Diagonal Secundária 0.125 * vdr
Moldura 0.25 * vdr
Cartela 0.5 * vdr

Em caso de mais de um participante completar uma mesma premiação ao mesmo


tempo, o valor do prêmio deve ser dividido igualmente entre eles.
Os dados referentes a cada participante são: seu nome (cadeia com até 30 caracteres),
sua idade (número inteiro positivo), seu RG (número inteiro positivo) e seu CPF
(número inteiro positivo). Os dados dos participantes do jogo serão lidos de um
arquivo texto denominado “entrada.txt”. O nome do participante ocupará uma linha
do arquivo texto e a idade, RG e CPF ocuparão a linha seguinte separados por espaço.
Entre os dados de um participante e outro se deve pular uma linha. Os dados de
participantes terminam quando for lida o nome “FIM” seguido de linha com 0 0 0
para idade, rg e cpf.
A partir daí, o arquivo “entrada.txt” fornecerá dados adicionais sobre o jogo e sobre
cada rodada, os quais são necessários para a execução do programa. Após pular uma
linha, serão fornecidos em uma única linha o valor pago por cada participante, o
número de linhas das cartelas e o número de colunas das cartelas. As linhas seguintes
do arquivo contém dados de cada rodada. Estes são uma semente para geração das
cartelas da rodada (semente de cartela) e uma semente para seleção dos números
sorteados na rodada (semente de sorteio). Cada par de sementes de uma rodada é
disposto em uma linha no arquivo. O jogo de bingo termina quando for lida uma linha
com 0 0 para as sementes.

Desta forma, o formato de entrada dos dados no arquivo “entrada.txt” deve ser o
seguinte:
<nome1>
<idade1> <rg1> <cpf1>

<nome2>
<idade2> <rg2> <cpf2>

<nomeN>
<idadeN> <rgN> <cpfN>

FIM
000

<valor pago por participante> <número de linhas> <número de colunas>


<semente de cartela da rodada 1> <semente de sorteio da rodada 1>
<semente de cartela da rodada 2> <semente de sorteio da rodada 2>

<semente de cartela da rodada M> <semente de sorteio da rodada M>
00
Um exemplo da disposição dos dados no arquivo “entrada.txt” é mostrado a seguir:
Exemplo de arquivo “entrada.txt”:
Flávio Miguel Varejão
41 561345 92837683405

Fulano de Tal
17 122321 92885664054

João da Silva
25 654321 98778998789

FIM
000

100.00 10 13
324 765
201 103
099 345
00

Note que a semente de cartela deve ser utilizada juntamente com as funções srand e
rand da biblioteca padrão <stdlib.h> de C para montar as cartelas de cada
participante em uma rodada, obedecendo a ordem de participantes apresentada no
arquivo “entrada.txt”. Assim, para cada rodada, o programa deve inicialmente usar a
função srand para definir a semente de geração aleatória com o valor lido da semente
de cartela correspondente àquela rodada. Então, para cada participante do jogo, na
sequência em que se encontra no arquivo “entrada.txt”, o programa deve utilizar
sucessivamente a função rand para gerar os números que farão parte da cartela do
participante. A cartela deve ser preenchida obrigatoriamente por linha, isto é,
preenche-se as casas da primeira linha, depois da segunda e assim por diante. O
programa deve garantir ainda que em uma mesma cartela não existem números
repetidos, desconsiderando, portanto, as repetições e substituindo-as pelo próximo
número gerado que não ocorre na cartela.
Tendo sido gerados todos os números de todas as cartelas de todos os participantes em
uma rodada, é possível começar o sorteio daquela rodada. A semente de sorteio
correspondente àquela rodada deve ser usada com a função srand para definir a nova
semente de geração aleatória. A partir daí, a função rand pode ser usada para gerar a
sequência de números sorteados em uma rodada. Não custa lembrar que uma rodada
se encerra quando algum participante obtém a premiação por completar a cartela.
Um exemplo de código que utiliza as funções rand e srand é apresentado a seguir.
Exemplo de programa que usa rand e srand:
#include <stdio.h> /* as funções rand() e srand() estão no cabeçalho stdlib.h */
#include <stdlib.h>
main() {
int i, max;
max = 50;
srand(100); /* inicializar o gerador de números aleatórios com a semente */
for (i=0; i<5; i++) {
printf("%d ", (rand() % max) + 1); /* para gerar números aleatórios de 1 a max */
}
return 0;
}
Note que, no programa do bingo, o intervalo de valores dos números gerados para as
cartelas e para os sorteios varia entre 1 e (nl*nc+10), onde os termos nl e nc indicam
respectivamente o número de linhas e colunas da cartela. Em outras palavras, o valor
de max utilizado no programa exemplo deve ser calculado pela expressão (nl*nc+10).
Observe ainda que, obrigatoriamente, uma cartela deve ter pelo menos 3 linhas e 3
colunas e, no máximo, 10 linhas e 12 colunas.
O programa deve gerar como resultado um arquivo texto denominado “saida.txt” com
duas listagens. Na primeira listagem devem ser apresentados os dados (nome, idade,
RG e CPF) de cada participante premiado juntamente com o valor acumulado de suas
premiações em todo o jogo. Essa listagem deve estar ordenada descrescentemente
pelo valor acumulado das premiações. Em caso de empate no valor acumulado das
premiações, ordenar os participantes empatados segundo a ordem crescente dos seus
cpfs.
A segunda listagem deve conter os dados (nome, idade, RG e CPF) dos participantes
não premiados durante todo o jogo. Essa listagem deve estar ordenada segundo a
ordem crescente dos cpfs dos participantes. Tanto na listagem de premiados quanto de
não premiados se deve pular uma linha entre os dados de cada participante. Um
exemplo da disposição dos resultados no arquivo “saida.txt” é mostrado a seguir:
Exemplo de arquivo “saida.txt”:
PREMIADOS:
Nome: Fulano de Tal
Idade: 17
RG: 122321
CPF: 92885664054
Prêmio: R$ 1729.34

Nome: Sicrano de Tal


Idade: 65
RG: 321456
CPF: 98778998789
Prêmio: R$ 1023.62

NÃO PREMIADOS:

Nome: Flávio Miguel Varejão


Idade: 41
RG: 561345
CPF: 92837683405

Nome: José da Silva


Idade: 53
RG: 456123
CPF: 89989877789
Requisitos da implementação
1. Modularize seu código adequadamente. O uso de variáveis globais é proibido,
mas constantes globais são permitidas;
2. Crie códigos claros e organizados. Utilize um estilo de programação consistente,
Comente seu código.
3. O arquivo entrada.txt deve ser colocado na mesma pasta onde se encontra o
arquivo fonte do seu programa. O arquivo saida.txt será gerado nesta mesma
pasta.
Condições de Entrega
O trabalho deve ser feito individualmente e submetido por e-mail até as 23:59 horas
de 25/11/2015. Note que a data limite já leva em conta um dia adicional de tolerância
para o caso de problemas de submissão via rede. Isso significa que o aluno deve sub-
meter seu trabalho até no máximo um dia antes da data limite. Se o aluno resolver
submeter o trabalho na data limite, estará fazendo isso assumindo o risco do trabalho
ser cadastrado no sistema após o prazo. Em caso de recebimento do trabalho após a
data limite, o trabalho não será avaliado e a nota será ZERO. Aluno que receber zero
por este motivo e vier pedir para o professor considerar o trabalho estará cometendo
um ato de DESRESPEITO ao professor e estará sujeito a perda adicional de pontos na
média.
Formato de Entrega dos Trabalhos
O recebimento dos trabalhos é automatizado. Portanto, as regras a seguir devem ser
seguidas à risca para evitar que seu trabalho não possa ser avaliado.
O código-fonte de sua solução deverá ser compactado e entregue por e-mail (anexo ao
e-mail) para o endereço fvarejao@phoenix.inf.ufes.br. Não adianta enviar trabalhos
para outro e-mail do professor ou em formato diferente do especificado. Esses e-mails
serão descartados sem sequer serem lidos.
Serão aceitos trabalhos entregues até as 23h59 da data limite. O assunto do e-mail de-
verá ser o seguinte:
prog2:trab2:<nome>:
O termo “<nome>” deverá ser substituído pelo nome e o último sobrenome do aluno,
sem acentos, til ou cedilha, como no exemplo abaixo:
prog2:trab2:Flavio Varejao:
ATENÇÃO:
a. No assunto, a disciplina (prog2) e a identificação do trabalho (trab2) devem ser
escritos todos em letras MINÚSCULAS.
b. NÃO escreva o seu nome com caracteres estendidos (ã, ç, etc).
c. NÃO utilize contas de e-mail do BOL, HOTMAIL ou TERRA, pois as mensagens
enviadas por esses servidores não seguem o padrão normal. Assim, o programa de re-
cebimento automático não consegue receber o seu e-mail.
O arquivo compactado deve estar no formato tar.gz com o nome trab2.tar.gz e conter
apenas o arquivo fonte do programa (não deve conter executáveis ou arquivos compi-
lados). Para isso, abra um console, mude o diretório de trabalho para a pasta onde se
encontra o código-fonte do trabalho e execute o seguinte comando:
tar -zcvf trab2.tar.gz *
Preste bastante atenção para fazer com que o codigo fonte não seja colocado em sub-
diretórios dentro do arquivo compactado. Se isso ocorrer a compilação automática não
funcionará e sua nota será ZERO. Atente também que o nome usado no arquivo
DEVE ser bingo.c.
Um exemplo de um e-mail de envio do trabalho:
Para: fvarejao@ninfa.inf.ufes.br
De: Joao da Silva
Assunto: prog2:trab2:Joao Silva:
Anexo: trab2.tar.gz
Para a compilação e execução dos programas, em princípio, serão utilizadas as ver-
sões instaladas no labgrad do gcc. Caso haja alguma modificação de versão de corre-
ção, ela será divulgada oportunamente.
O comando usado para compilação dos programas será:
gcc -std=c11 -pedantic bingo.c -o trab2
Recomendamos que o desenvolvimento do trabalho seja feito no Linux. No caso da-
queles que insistirem em usar outro compilador no sistema operacional Windows,
aconselhamos que testem seu trabalho no ambiente de verificação (gcc com Linux)
antes de submeter o trabalho pois é MUITO COMUM acontecer de um programa apa-
rentemente funcionar em um ambiente e NÃO compilar ou funcionar no outro. Acon-
selhamos ainda que o teste no ambiente Linux seja feito com antecedência para evitar
que percam o prazo de entrega. Portanto, para que não haja problemas na correção do
seu trabalho e você seja prejudicado, garanta que ele é compilado na versão de corre-
ção e executado no sistema operacional linux.
Os programas serão executados através da seguinte linha de comando:
./trab2 <entrada.txt >saida.txt
Se tudo correr bem, você receberá um e-mail de confirmação do recebimento do tra-
balho. Neste e-mail haverá um hash MD5 do arquivo recebido. Para garantir que o ar-
quivo foi recebido sem ser corrompido, gere o hash MD5 do arquivo que você enviou
e compare com o hash recebido na confirmação. Para gerar o hash, utilize o seguinte
comando:
md5sum trab2.tar.gz
Caso você não receba o e-mail de confirmação ou caso o valor do hash seja diferente,
envie o trabalho novamente.
Avaliação
Os trabalhos terão nota zero se:
 A data de entrega for fora do prazo estabelecido;
 O trabalho não compilar;
 O trabalho não gerar o arquivo com o resultado e formato esperado;
 For detectada a ocorrência de plágio pelo sistema. Os trabalhos serão
verificados automaticamente por uma ferramenta de detecção de plágio. Em
caso de detecção de cópia (parcial ou integral), todos os envolvidos recebem
nota ZERO. Em outras palavras, tanto os alunos que copiaram quanto o que
deixou copiar recebem ZERO. Portanto, não deixem seus colegas copiarem ou
mesmo verem seus trabalhos.
Ainda, os trabalhos poderão ser avaliados segundo os seguintes critérios:
 Cumprimento dos requisitos de implementação especificados neste
documento;
 Os programas serão avaliados pela sua correção durante a execução e também
pelo estilo de programação. Serão observados particularmente se os programas
possuem os comentários apropriados, se usam nomes significativos para as
variáveis e funções, se o código está indentado corretamente e se utilizam
modularização sempre que possível e é apropriado.
 Ausência de uso de variáveis globais;
 Legibilidade (nomes de variáveis bem escolhidos, código bem formatado, uso
de comentários quando necessário, etc.);
 Consistência (utilização de um mesmo padrão de código);
 Eficiência (sem exageros, tentar evitar grandes desperdícios de recursos);

Observação importante:
Caso haja algum erro neste documento, serão publicadas novas versões e divul-
gadas erratas em sala de aula. É responsabilidade do aluno manter-se informado,
freqüentando as aulas ou acompanhando as novidades na página da disciplina na
Internet.
BOM TRABALHO!!!

Você também pode gostar