Jump to content

Euromilhões


light_Show_#55

Recommended Posts

A alguma coisa que se pode simplificar ou melhorar ?

#include <iostream>
#include <stdlib.h>
#include <time.h>

using namespace std;

//as posições foram retiradas do seguinte site: https://www.jogossantacasa.pt/web/SCCartazResult/
//parti do principio que o euromilhões tem 5 números e 2 estrelas ...
int main()
{
    srand ( time(NULL));
    // fim da geração da seed...
    int n[7],i;
    for(i=0;i<5;i++)
    {
        n=rand()%(50) + 1;
    }
    for(i=5;i<7;i++)
    {
        n=rand()%(12) + 1;
    }
    //fim da geração da chave... 
    int num_uti[7];
    cout << "Tenha atencao que os numeros sao de 1 a 50 e as estrelas sao de 1 a 12...";
    for(i=0;i<5;i++)
    {
        cout << "\nQual e o numero que desja colucar em " << i +1 << " lugar no euromilhoes ? ";
        cin >> num_uti;
        while((num_uti<1) || (num_uti > 50))
        {
            cout << "\nErro... Volte a colocar o numero que deseje em " << i +1 << " lugar no euromilhoes ? ";
            cin >> num_uti;
        }
    }
    for(i=5;i<7;i++)
    {
        cout << "\nQual e a estrela que desja colocar  em " << i -4 << " lugar do euromilhoes ? ";
        cin >> num_uti;
        while((num_uti< 1) || (num_uti> 12))
        {
            cout << "\nErro... Volte a colocar a estrela que deseja em " << i -4 << " lugar no euromilhoes ? ";
            cin >> num_uti;
        }
    }
    //fim da inserção da chave do utilizador...
    int prem_n=0;
    for(i=0;i<5;i++)
    {
        if(n == num_uti)
        {
            prem_n++;
        }
    }
    //fim da quantificação do numero de "números" certos... 
    int prem_est=0;
    for(i=5;i<7;i++)
    {
        if(n == num_uti)
        {
            prem_est++;
        }
    }
    //fim da quantificação do numero de "estrelas" certos... 
    int lugar_do_podio=0; 
    switch (prem_n)
    {    
        case 5 :
        if(prem_est==2)
        {
            lugar_do_podio=1;
        }
        else
        {
            if(prem_est==1)
            {
                lugar_do_podio=2;
            }
            else
            {
                lugar_do_podio=3;
            }
        }
        break;
        
        case 4 :
        if(prem_est==2)
        {
            lugar_do_podio=4;
        }
        else
        {
            if(prem_est==1)
            {
                lugar_do_podio=5;
            }
            else
            {
                lugar_do_podio=7;
            }
        }
        break;
        
        case 3 :
        if(prem_est==2)
        {
            lugar_do_podio=6;
        }
        else
        {
            if(prem_est==1)
            {
                lugar_do_podio=9;
            }
            else
            {
                lugar_do_podio=10;
            }
        }
        break;
        
        case 2 :
        if(prem_est==2)
        {
            lugar_do_podio=8;
        }
        else
        {
            if(prem_est==1)
            {
                lugar_do_podio=12;
            }
            else
            {
                lugar_do_podio=13;
            }
        }
        break;
        
        case 1 :
        if(prem_est==2)
        {
            lugar_do_podio=11;
        }
        
        break;    
        
    }
    //fim da verificação dos dados com as suas posições respetivas...
    if(lugar_do_podio>0)
    {
        cout << "A sua aposta esta em " << lugar_do_podio << " lugar...\n";
    }
    else
    {
        cout << "A suma aposta não tem premio ...\n";
    }
    //fim da localização da aposta no pódio... 
    cout << "Obrigado por usar este simulador do euromilhoes...\n" ;
    system("pause");    
}
Link to comment
Share on other sites

O código que tens actualmente está errado.  Exemplo:

    for(i=0;i<5;i++)
    {
        n=rand()%(50) + 1;
    }

Isto provavelmente foi causado pela falta de formatação inicial.  Ainda assim, dá ideia que no segundo ciclo escreves por cima dos valores gerados no primeiro.

De um modo geral, devias dividir o teu código por várias funções/procedimentos, em vez de colocares tudo na main.

Link to comment
Share on other sites

#include <iostream>
#include <stdlib.h>
#include <time.h>

using namespace std;
int n[7];
int num_uti[7];

void gerador(int x,int y,int z)
{
	int i;
 	for(i=x;i<y;i++)
	{
		n[i]=rand()%(z) + 1;
	}
}
void chave(int x,int y,int z,char nome)
{
	int i;
	for(i=x;i<y;i++)
	{
		cout << "\nQual e o " << nome << " que desja colucar em " << i +1 << " lugar no euromilhoes ? ";
		cin >> num_uti[i];
		while((num_uti[i]<1) || (num_uti[i] > z))
		{
			cout << "\nErro... Volte a colocar o " << nome << " que deseje em " << i +1 << " lugar no euromilhoes ? ";
			cin >> num_uti[i];
		}
	}
}
int main()
{
	srand ( time(NULL));
	gerador(0,5,50);
	gerador(5,7,12);
	cout << "Tenha atencao que os numeros sao de 1 a 50 e as estrelas sao de 1 a 12...";
	chave(0,5,50,'numero');
	chave(5,7,12,'estrela');
	int prem_n=0;
	int i;
	for(i=0;i<5;i++)
	{
		if(n[i] == num_uti[i])
		{
			prem_n++;
		}
	}
	int prem_est=0;
	for(i=5;i<7;i++)
	{
		if(n[i] == num_uti[i])
		{
			prem_est++;
		}
	}
	int lugar_do_podio=0; 
	switch (prem_n)
	{	
		case 5 :
		if(prem_est==2)
		{
			lugar_do_podio=1;
		}
		else
		{
			if(prem_est==1)
			{
				lugar_do_podio=2;
			}
			else
			{
				lugar_do_podio=3;
			}
		}
		break;
		
		case 4 :
		if(prem_est==2)
		{
			lugar_do_podio=4;
		}
		else
		{
			if(prem_est==1)
			{
				lugar_do_podio=5;
			}
			else
			{
				lugar_do_podio=7;
			}
		}
		break;
		
		case 3 :
		if(prem_est==2)
		{
			lugar_do_podio=6;
		}
		else
		{
			if(prem_est==1)
			{
				lugar_do_podio=9;
			}
			else
			{
				lugar_do_podio=10;
			}
		}
		break;
		
		case 2 :
		if(prem_est==2)
		{
			lugar_do_podio=8;
		}
		else
		{
			if(prem_est==1)
			{
				lugar_do_podio=12;
			}
			else
			{
				lugar_do_podio=13;
			}
		}
		break;
		
		case 1 :
		if(prem_est==2)
		{
			lugar_do_podio=11;
		}
		
		break;	
	}
	if(lugar_do_podio>0)
	{
		cout << "A sua aposta esta em " << lugar_do_podio << " lugar...\n";
	}
	else
	{
		cout << "A suma aposta não tem premio ...\n";
	}
	cout << "Obrigado por usar esse simulador do euromilhoes...\n" ;
	system("pause");	
}

Está melhor ?

Obrigado pelo o seu tempo

Link to comment
Share on other sites

Sim, está melhor 🙂

Sem dar muita atenção à correcção, parece-me que tens alguns erros (exemplo: o parâmetro nome da função chave devia ser uma string e não um char).

Quanto a outras melhorias, devias evitar o uso de variáveis globais (n e num_uti), as variáveis podiam ter nomes mais descritivos (exemplo: z), e a função main continua enorme.  Em particular, aquele switch devia ser extraído para uma função, e penso que podias simplificar a lógica com uma matriz que te permitisse fazer simplesmente lugar_do_podio = matriz[prem_n][prem_est].

Link to comment
Share on other sites

Em 21/03/2020 às 11:57, light_Show_#55 disse:

Esta melhor ?

Obrigado pelo o seu tempo

Viva,

Tem 2 erros no seu programa de euromilhões...

1) a função gerador, está a gerar números repetidos, quer para os conjunto de números, quer para o conjunto de estrelas.

32;3;49;24;39;10;10; [2x a mesma estrela 10]
27;7;21;13;27;8;3; [2x o mesmo número 27]
46;1;41;32;35;11;11; [2x a mesma estrela 11]
39;33;10;8;33;12;1; [2x o mesmo número 33]

2) a contagem de prémios não está correcta.
Se n[] for 10, 15, 23, 34, 45 + 4, 7
e num_uti[] for 15, 23, 34, 45, 49 + 7, 9
deveria ter 4 números + 1 estrela certos e o seu programa dá 0 números e 0 estrelas certos.

podes comprovar (1) e (2) com este (seu) código:

// Example program
#include <iostream>
#include <string>
using namespace std;

int n[7];
int num_uti[7];

void gerador(int x,int y,int z)
{
	int i;
 	for(i=x;i<y;i++)
	{
		n[i]=rand()%(z) + 1;
	}
}

int main()
{
    srand (time(NULL));
    
    // Testar aleatorio
    gerador(0,5,50);
    gerador(5,7,12);
    for(int i=0; i<7; i++) cout << n[i] << ";";
    cout << "\n";
    
    // Testar prémios
    // 10, 15, 23, 34, 45 + 4, 7
    n[0]=10;
    n[1]=15;
    n[2]=23;
    n[3]=34;
    n[4]=45;
    n[5]=4;
    n[6]=7;
    
    // 15, 23, 34, 45, 49 + 7, 9
    num_uti[0]=15;
    num_uti[1]=23;
    num_uti[2]=34;
    num_uti[3]=45;
    num_uti[4]=49;
    num_uti[5]=7;
    num_uti[6]=9;
        
    // Devia acertar 4 numeros + 1 estrela
	int prem_n=0;
	int i;
	for(i=0;i<5;i++)
	{
		if(n[i] == num_uti[i])
		{
			prem_n++;
		}
	}
	int prem_est=0;
	for(i=5;i<7;i++)
	{
		if(n[i] == num_uti[i])
		{
			prem_est++;
		}
	}    
	cout << "numeros certos:" << prem_n;
	cout << "estrelas certos:" << prem_est;
}
Edited by antseq
  • Vote 2
Link to comment
Share on other sites

Em 23/03/2020 às 10:41, antseq disse:

Viva,

Tem 2 erros no seu programa de euromilhões...

1) a função gerador, está a gerar números repetidos, quer para os conjunto de números, quer para o conjunto de estrelas.

32;3;49;24;39;10;10; [2x a mesma estrela 10]
27;7;21;13;27;8;3; [2x o mesmo número 27]
46;1;41;32;35;11;11; [2x a mesma estrela 11]
39;33;10;8;33;12;1; [2x o mesmo número 33]

2) a contagem de prémios não está correcta.
Se n[] for 10, 15, 23, 34, 45 + 4, 7
e num_uti[] for 15, 23, 34, 45, 49 + 7, 9
deveria ter 4 números + 1 estrela certos e o seu programa dá 0 números e 0 estrelas certos.

podes comprovar (1) e (2) com este (seu) código:


// Example program
#include <iostream>
#include <string>
using namespace std;

int n[7];
int num_uti[7];

void gerador(int x,int y,int z)
{
	int i;
 	for(i=x;i<y;i++)
	{
		n[i]=rand()%(z) + 1;
	}
}

int main()
{
    srand (time(NULL));
    
    // Testar aleatorio
    gerador(0,5,50);
    gerador(5,7,12);
    for(int i=0; i<7; i++) cout << n[i] << ";";
    cout << "\n";
    
    // Testar prémios
    // 10, 15, 23, 34, 45 + 4, 7
    n[0]=10;
    n[1]=15;
    n[2]=23;
    n[3]=34;
    n[4]=45;
    n[5]=4;
    n[6]=7;
    
    // 15, 23, 34, 45, 49 + 7, 9
    num_uti[0]=15;
    num_uti[1]=23;
    num_uti[2]=34;
    num_uti[3]=45;
    num_uti[4]=49;
    num_uti[5]=7;
    num_uti[6]=9;
        
    // Devia acertar 4 numeros + 1 estrela
	int prem_n=0;
	int i;
	for(i=0;i<5;i++)
	{
		if(n[i] == num_uti[i])
		{
			prem_n++;
		}
	}
	int prem_est=0;
	for(i=5;i<7;i++)
	{
		if(n[i] == num_uti[i])
		{
			prem_est++;
		}
	}    
	cout << "numeros certos:" << prem_n;
	cout << "estrelas certos:" << prem_est;
}

 

Boas.

Primeiro  obrigado pelas as suas criticas e sua ajuda.

1)Eu fis o seguinte  para empedir números de se repetir (tem algum erro de logica  mas não sei qual...)

void gerador(int x,int y,int z)
{
	int i;
 	for(i=x;i<y;i++)
	{
		n[i]=rand()%(z) + 1;
	}
	int k;
	for(i=x;i<y;i++)
	{
		for(k=x;k<y;k++)
		{
			if((n[i]==n[k]) && (k=!i) )
			{	
				do
				{
					n[k]=rand()%(z) + 1;
					
				}while(n[i]==n[k]);
			}   
			
		}
	}
}

2)  Consegui compor acho eu...

int n_e(int x,int y)
{
	int i;
	int k=0;
	int a;
	for(i=x;i<y;i++)
	{
		for(a=x;a<y;a++)
		{
			if(n[i] == num_uti[a])
			{
				k++;
			}
		}
	}
	return k;		
}

Obrigado pela ajuda!!!

 

O código actual é o seguinte:

#include <iostream>
#include <stdlib.h>
#include <time.h>

using namespace std;
int n[7];
int num_uti[7];
void gerador(int x,int y,int z)
{
	int i;
 	for(i=x;i<y;i++)
	{
		n[i]=rand()%(z) + 1;
	}
	int k;
	for(i=x;i<y;i++)
	{
		for(k=x;k<y;k++)
		{
			if((n[i]==n[k]) && (k=!i) )
			{	
				do
				{
					
					n[k]=rand()%(z) + 1;
					
				}while(n[i]==n[k]);
			}   
			
		}
	}
}
void chave(int x,int y,int z,string nome)
{
	int i;
	for(i=x;i<y;i++)
	{
		cout << "\nQual e o " << nome << " que desja colucar em " << i +1 << " lugar no euromilhoes ? ";
		cin >> num_uti[i];
		while((num_uti[i]<1) || (num_uti[i] > z))
		{
			cout << "\nErro... Volte a colocar o " << nome << " que deseje em " << i +1 << " lugar no euromilhoes ? ";
			cin >> num_uti[i];
		}
	}
}
int n_e(int x,int y)
{
	int i;
	int k=0;
	int a;
	for(i=x;i<y;i++)
	{
		for(a=x;a<y;a++)
		{
			if(n[i] == num_uti[a])
			{
				k++;
			}
		}
	}
	return k;		
}
int main()
{
	srand ( time(NULL));
	gerador(0,5,50);
	gerador(5,7,12);
	cout << "Tenha atencao que os numeros sao de 1 a 50 e as estrelas sao de 1 a 12...";
	chave(0,5,50,"numero");
	chave(5,7,12,"chave");
	int prem_n=n_e(0,5);
	int prem_est=n_e(5,7);
	int i;
	int lugar_do_podio=0; 
	switch (prem_n)
	{	
		case 5 :
		if(prem_est==2)
		{
			lugar_do_podio=1;
		}
		else
		{
			if(prem_est==1)
			{
				lugar_do_podio=2;
			}
			else
			{
				lugar_do_podio=3;
			}
		}
		break;
		
		case 4 :
		if(prem_est==2)
		{
			lugar_do_podio=4;
		}
		else
		{
			if(prem_est==1)
			{
				lugar_do_podio=5;
			}
			else
			{
				lugar_do_podio=7;
			}
		}
		break;
		
		case 3 :
		if(prem_est==2)
		{
			lugar_do_podio=6;
		}
		else
		{
			if(prem_est==1)
			{
				lugar_do_podio=9;
			}
			else
			{
				lugar_do_podio=10;
			}
		}
		break;
		
		case 2 :
		if(prem_est==2)
		{
			lugar_do_podio=8;
		}
		else
		{
			if(prem_est==1)
			{
				lugar_do_podio=12;
			}
			else
			{
				lugar_do_podio=13;
			}
		}
		break;
		
		case 1 :
		if(prem_est==2)
		{
			lugar_do_podio=11;
		}
		
		break;	
		
	}
	if(lugar_do_podio>0)
	{
		cout << "A sua aposta esta em " << lugar_do_podio << " lugar...\n";
	}
	else
	{
		cout << "A suma aposta não tem premio ...\n";
	}
	cout << "Obrigado por usar esse simulador do euromilhoes...\n" ;
	system("pause");	
}
Link to comment
Share on other sites

18 horas atrás, light_Show_#55 disse:

Boas.

Primeiro  obrigado pelas as suas criticas e sua ajuda.

1) Eu fis o seguinte  para empedir números de se repetir (tem algum erro de logica  mas não sei qual...)

2)  Consegui compor acho eu...

Obrigado pela ajuda!!!

Viva,

Não eram críticas no mal sentido, eram observações no bom sentido para o ajudar.

do ponto 1)
. há lá um erro que deixou-me uns bons minutos para descobrir o que era. k diferente de i é escrito como "k != i" e não " k =!i" (aqui estava a atribuir k = NOT i e baralhava completamente as variáveis dos ciclos)
. infelizmente, apesar do esforço, continua a gerar repetidos... penso que podes ver aqui o exemplo do seu código a gerar repetidos => http://cpp.sh/4fwvm
. não pode fazer um for de 0 < 5 (no caso dos números) e depois tentar "corrigir" os repetidos num passo seguinte, só com uma passagem e ignorando os que estão para trás. a dada altura vai corrigir um "repetido" numa posição "3" e que agora este novo deu origem a outro repetido numa posição anterior. [volta a ter o problema original]
. o melhor é ter um "while" [enquanto não tem números (qtd) suficientes] em vez de "for" [fixo] e logo no sorteio do número verifica se já existe no array: Se não existir OK => adiciona o número na posição e incrementa qtd, Se já existir => mantém a posição em aberto e sorteia novo número;
. não é exactamente como está a fazer, mas neste outro meu "post" ilustrei um pouco o pretendido (pode adaptar ao seu caso): https://www.portugal-a-programar.pt/forums/topic/78146-programa-euromilhões-em-c/?tab=comments#comment-617622

do ponto 2)
. não testei, mas pelo o que vi no código. sim parece correcto e no bom caminho.

* muitas vezes as pessoas pensam que fazer um programa de euromilhões é fácil... por exemplo, quando aprendo uma nova linguagem a primeira coisa que faço depois do "hello world" é um sorteio de "euromilhões": tenho de aprender ARRAY, tenho de aprender ciclos DO/WHILE, tenho de aprender algo sobre MATH/random, tenho de aprender fazer os OUTPUTS, para ficar ainda melhor tenho de aprender como ordenar (SORT) dos ARRAYs para a chave sair ordenada. entre outras dificuldades... [é um bom exercício]

Edited by antseq
  • Vote 1
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.