Jump to content
Pedro Pinto

Programa euromilhões em c++

Recommended Posts

Pedro Pinto

Boa tarde. Gostaria que me ajudassem a corrigir este algoritmo. Tenho de fazer um programa que simule o euromilhões e ainda verificar quantos números acertei e atribuir prémios respetivos. Os contadores parecem não estar a funcionar corretamente.

O algoritmo é o seguinte:

#include <iostream>
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
using namespace std;
int z;
int y;
int numeros[5];
int i;
int estrelas[2];
int c;
int w,u;
int contador=0;
int contador2=0;
void chave_aleatoria(int numeros_chave[])
{
    srand(time(NULL));
    cout << "os numeros sao"<<endl;
    for(z=0;z<5;z++)
    {
        numeros_chave[z]= 1+rand() % 50;
        cout << numeros_chave[z] << endl;
        if (numeros==numeros_chave[z])
        {
        contador++;
        }
    }
}
void chave_aleatoria2(int estrelas_chave[])
{
    srand(time(NULL));
    cout << "as estrelas sao"<<endl;
    for(y=0;y<2;y++)
    {
        estrelas_chave[y]= 1+rand() % 12;
        cout << estrelas_chave[y] << endl;
        if (estrelas[c]==estrelas_chave[y])
        {
        contador2++;
        }
    }
}
int main()
{
    char a;
    for (i=0;i<5;i++)
    {
        do
        {
        cout << "Introduza um numero "<< endl;
        cin >> numeros;
        a='n';
        for (a=0;a<i;a++)
        {
            if (numeros[a]==numeros)
            {
                a='s';
            }
        }
        }
        while (numeros<1 || numeros>50 || a=='s');
    }
    for (c=0;c<2;c++)
    {
        do
        {
        cout << "Introduza uma estrela " << endl;
        cin >> estrelas[c];
        a='n';
        for (a=0;a<i;a++)
        {
            if (estrelas[a]==estrelas[c])
            {
                a='s';
            }
        }
        }
        while (estrelas[c]<1 || estrelas[c]>12 || a=='s');
    }
    int numeros_chave[5];
    chave_aleatoria(numeros_chave);
    int estrelas_chave[2];
    chave_aleatoria2(estrelas_chave);
    if (contador==2 && contador2==0)
    {
        cout << "acertou 2 numeros e por isso venceu o decimo terceiro premio";
    }
    if (contador==2 && contador2==1)
    {
        cout << "acertou 2 numeros e 1 estrela e por isso venceu o decimo segundo premio";
    }
    if (contador==1 && contador2==2)
    {
        cout << "acertou 1 numero e 2 estrelas e por isso venceu o decimo primeiro premio";
    }
    if (contador==3 && contador2==0)
    {
        cout << "acertou 3 numeros e por isso venceu o decimo premio";
    }
    if (contador==3 && contador2==1)
    {
        cout << "acertou 3 numeros e 1 estrela e por isso venceu o nono premio";
    }
    if (contador==2 && contador2==2)
    {
        cout << "acertou 2 numeros e 2 estrelas e por isso venceu o oitavo premio";
    }
    if (contador==4 && contador2==0)
    {
        cout << "acertou 4 numeros e por isso venceu o setimo premio";
    }
    if (contador==3 && contador2==2)
    {
        cout << "acertou 3 numeros e 2 estrelas e por isso venceu o sexto premio";
    }
    if (contador==4 && contador2==1)
    {
        cout << "acertou 4 numeros e 1 estrela e por isso venceu o quinto premio";
    }
    if (contador==4 && contador2==2)
    {
        cout << "acertou 4 numeros e 2 estrelas e por isso venceu o quarto premio";
    }
    if (contador==5 && contador2==0)
    {
        cout << "acertou 5 numeros e por isso venceu o terceiro premio";
    }
    if (contador==5 && contador2==1)
    {
        cout << "acertou 5 numeros e 1 estrela e por isso venceu o segundo premio";
    }
    if (contador==5 && contador2==2)
    {
        cout << "acertou 5 numeros e 2 estrelas e por isso venceu o primeiro premio";
    }
    if (contador==0 && contador2==0)
    {
        cout << "nao acertou nenhum numero nem nenhuma estrela e por isso nao tem premio";
    }    
    if (contador==0 && contador2==1)
    {
        cout << "acertou apenas 1 estrela e por isso nao tem premio";
    }
    if (contador==0 && contador2==2)
    {
        cout << "acertou apenas 2 estrelas e por isso nao tem premio";
    }
    if (contador==1 && contador2==0)
    {
        cout << "acertou apenas 1 numero e por isso nao tem premio";
    }
    if (contador==1 && contador2==1)
    {
        cout << "acertou apenas 1 numero e 1 estrela e por isso nao tem premio";
    }
    cout << endl;
    system("pause");
}

Agradecia se me dessem uma ajuda

Abraço,

Pedro

 

Edited by Pedro Pinto

Share this post


Link to post
Share on other sites
HappyHippyHippo

bom dia
pensa assim : tens um ciclo de inserção de um número, mas esse ciclo não é na realidade o ciclo de aceitação desse mesmo número.

o que seria necessário para aceitar um número ?


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
Pedro Pinto
5 horas atrás, HappyHippyHippo disse:

bom dia
pensa assim : tens um ciclo de inserção de um número, mas esse ciclo não é na realidade o ciclo de aceitação desse mesmo número.

o que seria necessário para aceitar um número ?

Boa tarde e desde já o meu obrigado pela resposta. Acabei de editar a minha publicação e não sei se o que fiz está correto. Mesmo assim, acho que os contadores não funcionam corretamente e o utilizador consegue introduzir na mesma números repetidos. Em relação à sua resposta não percebi muito bem isso do ciclo de aceitação ou de inserção. Na realidade, eu tenho muito pouca experiência em programação por isso peço desculpa pela minha ignorância. Não tenho a certeza se os contadores devem estar dentro das funções e do ciclo for. Agradecia se me pudesse dizer em que parte do programa estão os meus erros.

Edited by Pedro Pinto

Share this post


Link to post
Share on other sites
antseq
20 minutos atrás, Pedro Pinto disse:

Boa tarde e desde já o meu obrigado pela resposta. Acabei de editar a minha publicação e não sei se o que fiz está correto. Mesmo assim, acho que os contadores não funcionam corretamente e o utilizador consegue introduzir na mesma números repetidos. Em relação à sua resposta não percebi muito bem isso do ciclo de aceitação ou de inserção. Na realidade, eu tenho muito pouca experiência em programação por isso peço desculpa pela minha ignorância. Não tenho a certeza se os contadores devem estar dentro das funções e do ciclo for. Agradecia se me pudesse dizer em que parte do programa estão os meus erros.

notas:

* a sua função aleatória (ambas) também está a gerar chaves com números repetidos. por exemplo na primeira "chave_aleatoria" faz um FOR de 0 a 5 e assume que "1+rand() % 50" chamado 5 vezes dará sempre um número diferente... é pouco provável, mas poderia dar 1, 1, 1, 1, 1; mas muito provável dar algo como 42, 15, 3, 29, 15 (15 aparece 2x;  acabei de gerar com o seu código). Neste último exemplo, como o 15 já lá está, terá de fazer um novo aleatório.. (terá de usar um while/do while porque não sabe quantas vezes terá de gerar números até obter 5 distintos)

* está a tentar fazer tudo em simultâneo, gerar a chave aleatória e ao mesmo tempo calcular os contadores "acertos". Separe o código... faça uma função para gerar uma chave aleatória, faça outra função para calcular os "acertos".

Share this post


Link to post
Share on other sites
Pedro Pinto
49 minutos atrás, antseq disse:

notas:

* a sua função aleatória (ambas) também está a gerar chaves com números repetidos. por exemplo na primeira "chave_aleatoria" faz um FOR de 0 a 5 e assume que "1+rand() % 50" chamado 5 vezes dará sempre um número diferente... é pouco provável, mas poderia dar 1, 1, 1, 1, 1; mas muito provável dar algo como 42, 15, 3, 29, 15 (15 aparece 2x;  acabei de gerar com o seu código). Neste último exemplo, como o 15 já lá está, terá de fazer um novo aleatório.. (terá de usar um while/do while porque não sabe quantas vezes terá de gerar números até obter 5 distintos)

* está a tentar fazer tudo em simultâneo, gerar a chave aleatória e ao mesmo tempo calcular os contadores "acertos". Separe o código... faça uma função para gerar uma chave aleatória, faça outra função para calcular os "acertos".

boa tarde, tentei seguir as suas instruções mas acho que não deu resultado. será que fiz algo errado?

envio aqui o novo código:

#include <iostream>
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
using namespace std;
char a;
int z;
int y;
int numeros[5];
int i;
int estrelas[2];
int c;
int w,u;
int contador=0;
int contador2=0;
int numeros_chave[5];
int estrelas_chave[2];
void chave_aleatoria(int numeros_chave[])
{
    srand(time(NULL));
    cout << "os numeros sao"<<endl;
    do
    {
    for(z=0;z<5;z++)
    {
        numeros_chave[z]= 1+rand() % 50;
        cout << numeros_chave[z] << endl;    
    }
    a='n';
        for (a=0;a<z;a++)
        {
            if (numeros_chave[z]==numeros_chave[a])
            {
                a='s';
            }
        }
    }
    while(a=='s');
}
void chave_aleatoria2(int estrelas_chave[])
{
    srand(time(NULL));
    cout << "as estrelas sao"<<endl;
    do
    {
    for(y=0;y<2;y++)
    {
        estrelas_chave[y]= 1+rand() % 12;
        cout << estrelas_chave[y] << endl;
    }
    a='n';
        for (a=0;a<z;a++)
        {
            if (estrelas_chave[y]==estrelas_chave[a])
            {
                a='s';
            }
        }
    }
    while(a=='s');
}
void funcao_para_primeiro_contador()
{
    for (z=0;z<5;z++)
    {
    if (numeros==numeros_chave[z])
        {
        contador++;
        }
    }
}
void funcao_para_segundo_contador()
{
    for (y=0;y<2;y++)
    {
    if (estrelas[c]==estrelas_chave[y])
        {
        contador2++;
        }
    }
}
int main()
{
    for (i=0;i<5;i++)
    {
        do
        {
        cout << "Introduza um numero "<< endl;
        cin >> numeros;
        a='n';
        for (a=0;a<i;a++)
        {
            if (numeros[a]==numeros)
            {
                a='s';
            }
        }
        }
        while (numeros<1 || numeros>50 || a=='s');
    }
    for (c=0;c<2;c++)
    {
        do
        {
        cout << "Introduza uma estrela " << endl;
        cin >> estrelas[c];
        a='n';
        for (a=0;a<i;a++)
        {
            if (estrelas[a]==estrelas[c])
            {
                a='s';
            }
        }
        }
        while (estrelas[c]<1 || estrelas[c]>12 || a=='s');
    }
    int numeros_chave[5];
    chave_aleatoria(numeros_chave);
    int estrelas_chave[2];
    chave_aleatoria2(estrelas_chave);
    funcao_para_primeiro_contador();
    funcao_para_segundo_contador();
    if (contador==2 && contador2==0)
    {
        cout << "acertou 2 numeros e por isso venceu o decimo terceiro premio";
    }
    if (contador==2 && contador2==1)
    {
        cout << "acertou 2 numeros e 1 estrela e por isso venceu o decimo segundo premio";
    }
    if (contador==1 && contador2==2)
    {
        cout << "acertou 1 numero e 2 estrelas e por isso venceu o decimo primeiro premio";
    }
    if (contador==3 && contador2==0)
    {
        cout << "acertou 3 numeros e por isso venceu o decimo premio";
    }
    if (contador==3 && contador2==1)
    {
        cout << "acertou 3 numeros e 1 estrela e por isso venceu o nono premio";
    }
    if (contador==2 && contador2==2)
    {
        cout << "acertou 2 numeros e 2 estrelas e por isso venceu o oitavo premio";
    }
    if (contador==4 && contador2==0)
    {
        cout << "acertou 4 numeros e por isso venceu o setimo premio";
    }
    if (contador==3 && contador2==2)
    {
        cout << "acertou 3 numeros e 2 estrelas e por isso venceu o sexto premio";
    }
    if (contador==4 && contador2==1)
    {
        cout << "acertou 4 numeros e 1 estrela e por isso venceu o quinto premio";
    }
    if (contador==4 && contador2==2)
    {
        cout << "acertou 4 numeros e 2 estrelas e por isso venceu o quarto premio";
    }
    if (contador==5 && contador2==0)
    {
        cout << "acertou 5 numeros e por isso venceu o terceiro premio";
    }
    if (contador==5 && contador2==1)
    {
        cout << "acertou 5 numeros e 1 estrela e por isso venceu o segundo premio";
    }
    if (contador==5 && contador2==2)
    {
        cout << "acertou 5 numeros e 2 estrelas e por isso venceu o primeiro premio";
    }
    if (contador==0 && contador2==0)
    {
        cout << "nao acertou nenhum numero nem nenhuma estrela e por isso nao tem premio";
    }    
    if (contador==0 && contador2==1)
    {
        cout << "acertou apenas 1 estrela e por isso nao tem premio";
    }
    if (contador==0 && contador2==2)
    {
        cout << "acertou apenas 2 estrelas e por isso nao tem premio";
    }
    if (contador==1 && contador2==0)
    {
        cout << "acertou apenas 1 numero e por isso nao tem premio";
    }
    if (contador==1 && contador2==1)
    {
        cout << "acertou apenas 1 numero e 1 estrela e por isso nao tem premio";
    }
    cout << endl;
    system("pause");
}

Share this post


Link to post
Share on other sites
antseq
7 horas atrás, Pedro Pinto disse:

boa tarde, tentei seguir as suas instruções mas acho que não deu resultado. será que fiz algo errado?

 

Eu até gosto de C, C++ mas para mim "C++" é "OOP" no seu explendor (Class,Objects,Encapsulation,Abstraction,Polymorphism,Inheritance,Dynamic Binding,Message Passing,etc).
Acho que nunca fiz um programa [excepto o que segue abaixo...] com "cout" e "std".. e não lhe quero tirar o "rumo" do que aprendeu...

Acerca do que disse de usar um "While" para a função aleatória, abaixo tem um exemplo, CONTINUA com repetidos, MAS BASTA implementar o "exists" para o LOOP While continuar a gerar número aleatórios, até ter a quantidade de números pretendido (distintos uns dos outros).

Como também bastaria UMA única função para gerar "numeros" e "estrelas"...

Pode ser que daqui tire ideias para simplificar o seu código... e desculpas pelo meu C++ de "cout".. (não é a minha praia).
[com umas classes C++ e printf isto ficava lindo]

#include <iostream>
using namespace std;

void chave_aleatoria(int chave[], int qtd, int vmin, int vmax)
{
    int cnt=0;
    while(cnt < qtd){
        int newRnd = vmin + rand() % vmax;
        bool exists = false;
        //TODO
        //bool exists = (verificar se "newRnd" existe em "Chave")
        if (!exists){
            chave[cnt] = newRnd;
            cnt++;
        }
    }
}

int main()
{
    int numeros_chave[5];
    int estrelas_chave[2];
    
    chave_aleatoria(numeros_chave, 5, 1, 50);
    chave_aleatoria(estrelas_chave, 2, 1, 12);
    
    cout<<"Chave\n";
    for(int i=0; i<5; i++) std::cout << numeros_chave[i] << ",";
    cout<<"  ";
    for(int i=0; i<2; i++) std::cout << estrelas_chave[i] << ",";
    return 0;
}

 

Share this post


Link to post
Share on other sites
HappyHippyHippo

bem ... acho que lá vai um tempo jeitoso que não venho aqui ...

esta é a maneira mais simples de obter 5 números aleatórios sem repetição:

- crias um array com o número total do domínio onde irás tirar os números (neste caso um array preenchido com os números de 1 a 50)

- baralhas o array (simples, imagina como podes fazer)

- escolher os 5 primeiros números ... são aleatórios e não repetidos


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
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.