Mega sena

1. Mega sena

Bruno Henrique Pavão Inácio
pavon

(usa Outra)

Enviado em 11/06/2017 - 07:42h

Olá amigos!

tenho um trabalho da faculdade para ser feito, mas não estou conseguindo fazer tudo que foi pedido, poderiam me ajudar?

foi passado essas condições:Criar um programa sobre a MEGASENA com as seguintes funções:

1) Gerar 5000 sorteios realmente aleatórios, em um vetor, cada um com 6 números únicos (01 a 60)
(Exibir os dados na tela para simples conferência).

2) Gerar uma lista de estatística com os seguintes dados:
a) Quantidade de vezes que cada número saiu nos sorteios (Ordem crescente.
Por exemplo: Numero 01 = 224 vezes. Numero 02 = 290 vezes.
b) Listar as 15 duplas que mais saíram nos sorteios.
Por exemplo: Números 03 e 29 = 156 vezes. Números 15 e 42 = 113 vezes.

c) Listar os 15 números únicos que mais saíram nos sorteios (Ordem decrescente de repetições).
Por exemplo: Numero 02 = 360 vezes. Numero 27 = 352 vezes. Numero 36 = 312 vezes.
d) Listar de 01 a 60 a quantidade de jogadas desde a última vez que o número foi sorteado.

Por exemplo: Nº 01 = não sai a 7 sorteios seguidos. Nº 02 = não sai a 15 sorteios seguidos. Nº 03 = saiu no ultimo sorteio. Nº 04 = não sai a 31 sorteios seguidos Nº 05 = não sai a 3 sorteios seguidos .... Até o Nº 60.

3) Simular uma jogada para 3 usuários diferentes, com os seguintes dados:
a) Capturar o nome do apostador.
b) Capturar o CPF do apostador.
c) Capturar 6 números para o sorteio.


4) Após as jogadas dos 3 usuários, indicar quantos números cada usuário acertou, em um único sorteio, com base nos 5000 sorteios anteriores. Informar de acordo com o seguinte exemplo:

Parabéns <nome do apostador>, ocê acertou X números! Sorteio [ numero ] Substitua os valores nome do apostador e X números pelos valores correspondentes.


eu só conseguir fazer esse programa até agora.


#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define n 6
int main(){
int i,j,vetor[5000][6],aux , c , a, numeroSorteado; ;

srand((unsigned)time(NULL));
for (j = 0; j < 5000; j++){
for(i=0;i<6;i++){
vetor[j][i]=1 + rand()%60;
}
}
for( j=1; j < 5000; j++ ) {
for(i=0;i<5;i++){
c = i;
while(c >= 0 && vetor[j][c] > vetor[j][c+1]) {
aux = vetor[j][c];
vetor[j][c] = vetor[j][c+1];
vetor[j][c+1] = aux;
c--;
}
}
}



for( j=1; j < 5000; j++ ) {
for(i=0;i<5;i++){
if (vetor[j][i] == vetor[j][i+1]) {
vetor[j][i+1]=1 + rand()%60;
}
if (vetor[j][i] == vetor[j][i+2]) {
vetor[j][i+2]=1 + rand()%60;
}
if (vetor[j][i] == vetor[j][i+3]) {
vetor[j][i+3]=1 + rand()%60;
}
if (vetor[j][i] == vetor[j][i+4]) {
vetor[j][i+4]=1 + rand()%60;
}
if (vetor[j][i] == vetor[j][i+5]) {
vetor[j][i+5]=1 + rand()%60;
}
if (vetor[j][i+1] == vetor[j][i+2]) {
vetor[j][i+2]=1 + rand()%60;
}
if (vetor[j][i+1] == vetor[j][i+3]) {
vetor[j][i+3]=1 + rand()%60;
}
if (vetor[j][i+1] == vetor[j][i+4]) {
vetor[j][i+4]=1 + rand()%60;
}
if (vetor[j][i+1] == vetor[j][i+5]) {
vetor[j][i+5]=1 + rand()%60;
}
if (vetor[j][i+2] == vetor[j][i+3]) {
vetor[j][i+3]=1 + rand()%60;
}
if (vetor[j][i+2] == vetor[j][i+4]) {
vetor[j][i+4]=1 + rand()%60;
}
if (vetor[j][i+2] == vetor[j][i+5]) {
vetor[j][i+5]=1 + rand()%60;
}
if (vetor[j][i+3] == vetor[j][i+4]) {
vetor[j][i+4]=1 + rand()%60;
}
if (vetor[j][i+3] == vetor[j][i+5]) {
vetor[j][i+1]=1 + rand()%60;
}
if (vetor[j][i+4] == vetor[j][i+5]) {
vetor[j][i+5]=1 + rand()%60;
}

}
}

for( j=1; j < 5000; j++ ) {
for(i=0;i<5;i++){
c = i;
while(c >= 0 && vetor[j][c] > vetor[j][c+1]) {
aux = vetor[j][c];
vetor[j][c] = vetor[j][c+1];
vetor[j][c+1] = aux;
c--;
}
}
}



for (j = 0; j < 5000; j++){
printf("Sorteio %04d : ",j+1);
for(i=0;i<6;i++){
printf("%02d " , vetor[j][i]);
}
printf("\n");
}
}



  


2. Re: Mega sena

Paulo
paulo1205

(usa Ubuntu)

Enviado em 11/06/2017 - 16:48h

Este é basicamente um exercício de arrays, e com a ordenação de elementos desses arrays tendo um papel importante em muitas das subquestões. Cada sorteio de 6 números é um array. O conjunto de 5000 sorteios é um array de sorteios (e como cada sorteio é um array, então os 5000 sorteios serão representados com um array de arrays). A combinação de pares é um array. As apostas de cada apostador são arrays.

(Tenho de sair agora. Mais tarde continuo.)


3. VLW

Bruno Henrique Pavão Inácio
pavon

(usa Outra)

Enviado em 11/06/2017 - 18:10h

Tudo bem, obrigado até o momento...

Aguardo o final da sua conclusão com ansiedade!


4. Re: Mega sena

Paulo
paulo1205

(usa Ubuntu)

Enviado em 12/06/2017 - 03:38h

Bom, basicamente é isso. Todas as questões estão ligadas a algum tipo de array.

Arrays em C começam sempre com índice 0. Assim, para facilitar sua vida, sorteie números entre 0 e 59, pois isso vai facilitar o uso desses números como índices de alguns dos arrays. Apenas na hora de interagir com o usuário você precisaria de ajustar para 1 a 60, somando 1 (ou eventualmente subtraindo, na hora de ler as apostas).

Ordenar os elementos do arrays de números sorteados a cada concurso e dos das apostas feitas pelos jogadores certamente vai facilitar sua vida.

Quando você quiser ter contadores associados a cada número ou a cada par de números, os índices serão os números, e o dado de cada número será o valor guardado na posição do array dada pelo índice que é o próprio número. Esse array não pode ser ordenado de uma forma normal, do contrário você estaria modificando o valor associado a cada número. Nesse caso, você teria de ter um array em auxiliar paralelo, cujos elementos são os índices para o primeiro array. Na hora de ordenar, você vai ordenar o array de índices, mas decidindo ou não sobre uma eventual mudança da ordem desses índices dentro do array auxiliar com base no valor associado a cada índice.

Por exemplo: digamos que, em vez de Mega Sena, seja simplesmente um jogo de dados, e que eu o tenha jogado dez vezes e obtido a seguinte contagem: 1 (duas vezes), 2 (três vezes), 3 (0 vezes), 4 (uma vez), 5 (0 vezes), 6 (4 vezes). Eu poderia representar isso, inicialmente, através de dois arrays: A={2, 3, 0, 1, 0, 4} e B={0, 1, 2, 3, 4, 5}. Ao ordenar, eu levo em consideração os valores de A, mas não mexo nele. Em vez disso, eu mexo em B, de modo que, no fim da ordenação, eu tenha B={5, 1, 0, 3, 2, 4}. Se eu percorrer, então, os três primeiro elementos de B, e usar os valores desses elementos como índices de A, eu poderei imprimir os três números que saíram mais vezes, e dizer quantas vezes cada um saiu.

O array mais interessante, porém, é o que vai representar as duplas. Uma representação natural dessas duplas de sorteios poderia ser uma matriz, na forma em que o primeiro número corresponde ao número da linha, e o segundo fica na coluna. Algo mais ou menos como abaixo.

nn\mm|   00      01      02      03     ...     ...     ...      57      58      59
-----+--------------------------------------------------------------------------------
00 | Q00,00 Q00,01 Q00,02 Q00,03 ... ... ... Q00,57 Q00,58 Q00,59
01 | Q01,00 Q01,01 Q01,02 Q01,03 ... ... ... Q01,57 Q01,58 Q01,59
02 | Q02,00 Q02,01 Q02,02 Q02,03 ... ... ... Q02,57 Q02,58 Q02,59
03 | Q03,00 Q03,01 Q03,02 Q03,03 ... ... ... Q03,57 Q03,58 Q03,59
... | ... ... ... ... ... ... ... ... ... ...
... | ... ... ... ... ... ... ... ... ... ...
... | ... ... ... ... ... ... ... ... ... ...
57 | Q57,00 Q57,01 Q57,02 Q57,03 ... ... ... Q57,57 Q57,58 Q57,59
58 | Q58,00 Q58,01 Q58,02 Q58,03 ... ... ... Q58,57 Q58,58 Q58,59
59 | Q59,00 Q59,01 Q59,02 Q59,03 ... ... ... Q59,57 Q59,58 Q59,59


Os dados dessa matriz, Qnn,mm, representam quantas vezes a dupla nn-mm apareceu ao longo dos 5000 sorteios.

Você pode usar essa representação matricial, mas pode também transformá-la num array linear de dimensão 60×60 (3600), com índices na forma nn*60+mm. Linearizando-a, fica mais fácil de fazer o array de índices paralelo e sua ordenação. E com um índice qualquer, você pode reconstruir nn e mm da seguinte forma: nn=int(indice/60) e mm=indice%60.

Essa matriz linearizada não precisaria ter estritamente 3600 elementos. Qnn,mm não precisa existir se nn>=mm. Isso lhe permitiria trabalhar com uma matriz triangular de dimensão 59, com um total de 59*(59+1)/2=59*30=1770 elementos. Contudo, a relação entre nn, mm e o índice ficaria um pouco mais complexa.


5. Re: Mega sena

Paulo
paulo1205

(usa Ubuntu)

Enviado em 12/06/2017 - 11:32h

Outra coisa: dependendo de como seja a implementação de rand(), ela pode ter um nível baixo de aleatoriedade nos bits de baixa ordem, e a forma rand()%N fica ainda mais prejudicada. Para transferir aleatoriedade dos bits de mais alta ordem para os de baixa ordem, é melhor fazer da seguinte forma.

rand()/(RAND_MAX+1.0)*N 


Isso vai produzir como saída um valor do tipo double no intervalo [0, N). Se N for inteiro e positivo e o valor sorteado for convertido para inteiro por truncamento, a conversão será equivalente a rand()%N, mas com aleatoriedade maior.






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts