Ir para o conteúdo
ap27

Fazer Euromilhões em C++

Mensagens Recomendadas

ap27    0
ap27

Boa tarde,

Tenho como trabalho final de uma cadeira de programação a tarefa de desenvolver um programa que simule um euromilhões, cuja chave é gerada pelo programa aleatoriamente, utilizando as funções rand e srand da biblioteca stdlib.h, mas o problema é que não faço a mais pequena ideia de como funcionam estas funções, alguém me pode ajudar??

O programa terá de gerar 5 números [1 a 50] e 2 estrelas [1 a 11], e guardá-las num array, já que posteriormente vão ser necessárias para ser comparadas com a chave introduzida pelo utilizador para serem divulgados os prémios

Obrigado

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
HappyHippyHippo    1134
HappyHippyHippo

srand : serve para iniciar o gerador de números aleatório (normalmente usasse uma "semente" relativa a tempo para que os número não sejam sempre os mesmos)

http://www.cplusplus.com/reference/clibrary/cstdlib/srand/

rand : serve para criar um número aleatório

http://www.cplusplus.com/reference/clibrary/cstdlib/rand/

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
pikax    172
pikax

Eu fiz um programa do género e coloquei aqui no forum, devias de fazer pesquisas primeiro.

...utilizando as funções rand e srand da biblioteca stdlib.h, mas o problema é que não faço a mais pequena ideia de como funcionam estas funções, alguém me pode ajudar??

http://www.cplusplus.com/reference/clibrary/cstdlib/rand/

http://www.portugal-a-programar.pt/forums/topic/0-find-topic/?do=findComment&comment=401882

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
pmg    102
pmg

[...] utilizando as funções rand e srand da biblioteca stdlib.h [...]

Só umas picuinhices ...

1) Não uses <stdlib.h> em C++

2) stdlib.h não é uma biblioteca: é um header; o header contem, entre possivelmente outras coisas, protótipos de funções; uma biblioteca contem, entre possivelmente outras coisas, funções pré-compiladas.

O header é necessário para a compilação; a biblioteca é necessária para a "linkagem".

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
ap27    0
ap27

Eu pesquisei e até passei pelo programa que fizeste, mas esta é uma cadeira de programação do primeiro semestre do  curso de electrotecnia, pareceu-me portanto um código, um pouco elaborado demais, para os meus conhecimentos, para já ficaria contente de saber como gerar uma chave aleatoriamente e guardando essa chave num array

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
ap27    0
ap27

Eu pesquisei e até passei pelo programa que fizeste, mas esta é uma cadeira de programação do primeiro semestre do  curso de electrotecnia, pareceu-me portanto um código, um pouco elaborado demais, para os meus conhecimentos, para já ficaria contente de saber como gerar uma chave aleatoriamente e guardando essa chave num array

Muito bem peço desculpa pela minha "ignorância" na matéria, mas é que sou mesmo um novato nisto e preciso mesmo de ajuda  :wallbash:

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
pikax    172
pikax

eu não utilizei rand para gerar as chaves, criei um vector com todos os numeros do euro-milhoes, depois baralhava-os e retirava o ultimo elemento.

eu criei uma class chamado chaves, com 5 numeros e 2 estrelas:

class chave
{
    public:
        chave(){}
        chave(uint n1,uint n2,uint n3,uint n4,uint n5,uint e1,uint e2):m_n1(n1),m_n2(n2),m_n3(n3),m_n4(n4),m_n5(n5),m_e1(e1),m_e2(e2),repeticao(1){}

        unsigned int repeticao;
        uint m_n1;
        uint m_n2;
        uint m_n3;
        uint m_n4;
        uint m_n5;

        uint m_e1;
        uint m_e2;

};

para me facilitar a vida, criei um função inline para sempre que fizesse chaveX==chaveY, ele comparava-me automaticamente e returnava true ou false:

inline bool operator==(const chave& ch1, const chave& ch2)
        {
            if(ch1.m_n1!=ch2.m_n1)
                return false;
            if(ch1.m_n2!=ch2.m_n2)
                return false;
            if(ch1.m_n3!=ch2.m_n3)
                return false;
            if(ch1.m_n4!=ch2.m_n4)
                return false;
            if(ch1.m_n5!=ch2.m_n5)
                return false;
            if(ch1.m_e1!=ch2.m_e1)
                return false;
            if(ch1.m_e2!=ch2.m_e2)
                return false;

            return true;
        }

Quando eu estou a inserir os valores em chave eles tão ordenados, por isso se a chave for igual o 1ºelemento de cada é igual e por ai adiante.

tens que gerar as chamaves:

int gera_num_aleatorio()
{
  int num=/*metes a função rand a funcinar*/ %50+1;//para te dar valores 1->50

return num;
}

tens que ver qual é a melhor forma para fazeres, basicamente tens que estudar como se utiliza o rand e o srand e depois basta só chamar a função gera_num_aleatorio para gerar o numero.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
ap27    0
ap27

int numero[5];
for(int i=0; i<5; i++)
{
int	aux=rand()%50+1;

if(i==0)
	numero[i]=aux;

for(int j=0; j<i; j++)

	if (aux==numero[j])
		break;
numero[i]= aux;
printf("%d\n\n", aux);
} 

Eu coloquei desta forma mas ele gera-me sempre a mesma chave de numeros. qual é o erro?

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
ap27    0
ap27

A seed é sempre a mesma. Usa:

srand(time(NULL));

Obrigado funcionou na perfeição, já tenho uma para os números e outro para as estrelas, no entanto como posso garantir que não há repetição entre números ou entre estrelas..

alguma ideia?

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
ap27    0
ap27

A função rand() gere numeros pseudo-aleatórios, se queres um bom algoritmo para função aleatória tens estes:

Mother-of-All e Xorshift

http://www.stat.fsu.edu/pub/diehard

http://en.wikipedia.org/wiki/George_Marsaglia

ftp://ftp.forth.org/pub/C/mother.c

http://www.agner.org/random

http://www.jstatsoft.org/v08/i14/paper

Parecem-me algoritmos complexos demais para aquilo que é uma cadeira de um curso de electrotecnia. Trata-se de um trabalho de final de semestre e por isso terei de utilizar os algoritmos que demos nas aulas com uma ou outra alterações.

Obrigado na mesma

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
pmg    102
pmg

Tens basicamente duas maneiras:

1) escolhe numeros aleatorios e verifica que ainda nao foram escolhidos. Se ja tiverem sido escolhidos, escolhe outro (ou o seguinte que ainda nao foi escolhido)

2) cria um array com todas as hipoteses, "baralha" o array e devolve os N primeiros elementos

Especificamente para gerar combinacoes para o euromilhoes, acho que a primeira hipotese e suficientemente boa.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
ap27    0
ap27

Tens basicamente duas maneiras:

1) escolhe numeros aleatorios e verifica que ainda nao foram escolhidos. Se ja tiverem sido escolhidos, escolhe outro (ou o seguinte que ainda nao foi escolhido)

2) cria um array com todas as hipoteses, "baralha" o array e devolve os N primeiros elementos

Especificamente para gerar combinacoes para o euromilhoes, acho que a primeira hipotese e suficientemente boa.

Aquilo que dizes na primeira hipótese é algo parecido com isto?

srand ( time(NULL) );
int numero[5];
for(int i=0; i<5; i++)
{
int	aux=rand()%50+1;

if(i==0)
	numero[i]=aux;

for(int j=0; j<i; j++)

	if (aux==numero[j])
		break;
numero[i]= aux;

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
pmg    102
pmg

Mais ou menos ;)

Tens ai uns problemas de indentacao e chavetas ...

E a logica nao esta certa.

Eu faria assim, em pseudo codigo

int numero[5];
for (int i = 0; i < 5; i++) {
    <GERA NUMERO INEXISTENTE>;
    numero[i] = <NUMERO INEXISTENTE>;
}

Para gerar o <NUMERO INEXISTENTE> uma funcao que verifica se um numero faz parte dum array daria jeito.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
ap27    0
ap27

Mais ou menos ;)

Tens ai uns problemas de indentacao e chavetas ...

E a logica nao esta certa.

Eu faria assim, em pseudo codigo

int numero[5];
for (int i = 0; i < 5; i++) {
    <GERA NUMERO INEXISTENTE>;
    numero[i] = <NUMERO INEXISTENTE>;
}

Para gerar o <NUMERO INEXISTENTE> uma funcao que verifica se um numero faz parte dum array daria jeito.

O meu problema está exactamente na função que verifica se um numero faz ou não parte de um array

Sou muito novato nesta coisa da programação

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
pikax    172
pikax


int array[5]={0,1,2,3,4};
int num=6;
for(int i=0;i<5;i++)
  if(array[i]==num)
  {
     cout<<"numero encontrado"<<endl;
     return 1;
  }

cout<<"numero nao encontrado"<<endl;

assim??

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
KTachyon    272
KTachyon

Queres outra solução? Crias um array com as posições todas possíveis (50) e, antes de marcares verificas se esse número já foi marcado, se não for marcas e incrementas o contador de números gerados:

while (numeros_gerados < TOTAL_A_GERAR) {
    int w = gera_numero();
    
    if (numeros[w] != 1) {
        numeros_gerados++;
        numeros[w] = 1;
    }
}

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
vrael    0
vrael

Ou guardas os numeros saidos em variaveis, e comparas com um if, se for igual volta a simular.

Se calhar ainda é mais acessível aos teus conhecimentos, eu faria assim :) ou usando os arrays

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
ap27    0
ap27

já consegui avançar mais no programa, como o apostador pode fazer mais que uma aposta ao mesmo tempo, e pode decidir que seja o programa a dar essas apostas aleatoriamente ou ser o proprio a inserir os palpites, fiz um switch... case em que o case 2 é ser o computador a inserir as apostas aleatoriamente, consoante o numero de apostas que o utilizador quer fazer [1 a 5], decidi fazer isso como uma matriz em que o numero de apostas é as linhas e os numeros e estrelas são as colunas, no entanto estou com problemas na impressão das mesmas.

O código é o seguinte:

case 2:

	srand ( time(NULL) );
for(int l=0;l<num_apostas;l++)
{

	for(int i=0; i<5; i++)
	{
		int	aux=rand()%50+1;

		if(i==0)
		aposta_numero[l][i]=aux;

		for(int j=0; j<i; j++)

			if (aux==aposta_numero[l][i])
			break;
			aposta_numero[l][i]= aux;

	} 


	for(int i=0; i<2; i++)
	{
		int	aux=rand()%11+1;

		if(i==0)
		aposta_estrelas[l][i]=aux;

		for(int j=0; j<i; j++)

			if (aux==aposta_estrelas[l][i])
			break;
			aposta_estrelas[l][i]= aux;

	}


	for (int i=0; i<l; i++)
	{

		for (int j=0; j<5; j++)
		printf ("%d ", aposta_numero[i][j]);

		for (int j=0; j<2; j++)
		printf ("%d ", aposta_estrelas[i][j]);

		printf("\n");
	}

}

break;



}

Na compilação não tenho nenhum problema com declaração de variaveis, já que esta já foi feita logo no inicio do programa.

Alguém me consegue ajudar?

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
pikax    172
pikax

Não percebi bem qual é o problema, deves sempre explicar bem qual é o problema que tens, porque muita gente daqui não tem tempo para compilar, e não pode perder tempo a ler o código todo e a perceber o teu problema.

já consegui avançar mais no programa, como o apostador pode fazer mais que uma aposta ao mesmo tempo, e pode decidir que seja o programa a dar essas apostas aleatoriamente ou ser o proprio a inserir os palpites, fiz um switch... case em que o case 2 é ser o computador a inserir as apostas aleatoriamente, consoante o numero de apostas que o utilizador quer fazer [1 a 5], decidi fazer isso como uma matriz em que o numero de apostas é as linhas e os numeros e estrelas são as colunas, no entanto estou com problemas na impressão das mesmas.

Em vez de criares uma matriz, porque que não te abstrais desse código criando uma estrutura ou uma class chamada chaves, assim, escusas de estar com uma matriz, e ficas com um simples array para guardar os valores.

struct chaves
{
   int numeros[5];
   int estrelas[2];
}

facilita-te mais, porque te abstrais da matriz em que as colunas são numeros e linhas sao estrelas.

EDIT:

for(int i=0; i<5; i++)
                {
                        int     aux=rand()%50+1;

                        if(i==0)
                        aposta_numero[l][i]=aux;

                        for(int j=0; j<i; j++)
       
                                if (aux==aposta_numero[l][i])
                                break;
                                aposta_numero[l][i]= aux;

                } 

isto está a funcionar???

é que no segundo for tens o 'j' que é a veriavel que irá incrementar no final de cada passagem, mas o 'j' não é utilizado.

não deveria ser algo assim?:

for(int i=0; i<5; i++)
                {
                        int     aux=rand()%50+1;

                        //if(i==0)
                           //aposta_numero[l][i]=aux;
                          //no for já te faz isso
                        for(int j=0; j<i; j++) 
       
                                if (aux==aposta_numero[l][j])
                                {
                                   i--;//porque para que o for anterior faça mais uma passagem, ja que esta não deu em nada
                                   break;
                                }
                                else
                                   aposta_numero[l][i]= aux;

                } 

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
ap27    0
ap27

Mas criando uma estrutura chaves depois como faço para que o programa grave cada uma das chaves num array diferente? o problema é que eu tenho de ter as chaves todas disponíveis  para que no fim as consiga comparar com a chave vencedora.

Alguma sugestão?

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
pikax    172
pikax

podes fazer algo assim:


struct chaves
{
   int numeros[5];
   int estrelas[2];
   int NumeroDeVezes;
}

int gerar_num_aleatorio();//retorna um valor
bool compara_chaves();//compara as chaves, retorna true se forem iguais

int gerar_chave(chaves &chve, chaves *array_chaves, int nr_chaves)
{
  for(int i=0;i<5;i++)
    chve.numeros[i]=gerar_num_aleatorio()%50+1;

  for(int i=0;i<2;i++)
    chve.estrelas[i]=gerar_num_aleatorio()%10+1;
  
  chve.NumeroDeVezes=0;

  for(int i=0;i<nr_chaves;i++)
   if(compara_chaves(array_chave[i], chve))//se returnar true então acrescentamos
   {
       array_chave[i].NumeroDeVezes++;
       return 1;
   }

  return 0;
}

bool

int main()
{

  chaves _chaves[MAX_NUM_CHAVES];//MAX_NUM_CHAVES definido em algum lado
  int num_chaves=0;

  cout<<"Quantas chaves gerar: "<<endl;
  cin>>num_chaves;

  for(int i=0;i<num_chaves;i++)
   gerar_chave(_chaves[i],_chaves,i);

  //agora basta percorreres o array e ver qual é o que tem o NumeroDeVezes mais elevado
  
}

EDIT PS: Não testei, mesmo se não funcionar a ideia é esta, não fiz algumas funções porque não era relevantes para perceberes o código.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
ap27    0
ap27

Boas noites,

Entretanto surgiu-me um problema com o qual não sei como lidar.

É necessário escrever todos os numeros da aposta como cruzes tal e qual como se apresenta no euromilhões, ou seja, quando a aposta é por exemplo: 21 27 31 49 50 e as estrelas 3 9, deve aparecer

1    2  3  4  5  6  7  8  9 10

11 12 13 14 15 16 17 18 19 20

X  22 23 24 25 26  X  28 29 30

...

... e assim sucessivamente

e o mesmo para as estreas

1 2 X 4 5 6 7 8 X 10 11

tenho um algoritmo que escreve a matriz dos numeros que é o seguinte:

for(int k=1;k<51;k++)
	{

		if(k<10)
			printf(" %d ",k);
		else
			printf("%d ",k);

		if((k==10)||(k==20)||(k==30)||(k==40))
			printf("\n");

		if(k==50)
			printf("\n\n");

	}

e decidi colocar mais uma condição para que quando o numero da matriz [j] (numeros x numero de apostas) for igual ao k ele escrever X, então coloquei:

for(int k=1;k<51;k++)
	{

		if(k<10)
			printf(" %d ",k);
		else if(k!=aposta_numero[i][j])
			printf("%d ",k);
		else
			printf(" X ");
		if((k==10)||(k==20)||(k==30)||(k==40))
			printf("\n");

		if(k==50)
			printf("\n\n");

	}

quando imprimo os resultados ele dá-me todos os numeros possiveis, mas só me marca como X o 3º numero de cada aposta, nao consigo entender o porque.

O codigo para atribuição dos numeros das apostas é o seguinte:

for(int i=0;i<5;i++)
		{
			do
			{
				scanf("%d",&aposta_numero[l][i]);
				if((aposta_numero[l][i]<1)||(aposta_numero[l][i]>50))
				printf("Numero invalido. Insira outro numero [1 a 50]\n");
			}
			while((aposta_numero[l][i]<1)||(aposta_numero[l][i]>50));

		}

Obrigado

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
lesiano16    0
lesiano16

Antes de ver o problema vou te dar umas dicas para poupares linhas de código.

if(k<10)
         printf(" %d ",k);
    else
         printf("%d ",k);

Basta meteres printf("%2d ",k); e ele mete duas posições.

if((k==10)||(k==20)||(k==30)||(k==40))

Por acaso só tens até 40 mas se tivesses até 1000 ?

if( k % 10 == 0 ) Tá feito, mas como tu não queres o 50 tmb incluido if( k != 50 && k % 10 == 0).

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora


×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade