Pedro Pinto Posted March 16, 2020 at 06:46 PM Report Share #617607 Posted March 16, 2020 at 06:46 PM (edited) 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 March 18, 2020 at 01:48 PM by Pedro Pinto Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted March 18, 2020 at 07:43 AM Report Share #617619 Posted March 18, 2020 at 07:43 AM 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 Portugol Plus Link to comment Share on other sites More sharing options...
Pedro Pinto Posted March 18, 2020 at 01:40 PM Author Report Share #617621 Posted March 18, 2020 at 01:40 PM (edited) 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 March 18, 2020 at 01:43 PM by Pedro Pinto Link to comment Share on other sites More sharing options...
antseq Posted March 18, 2020 at 02:10 PM Report Share #617622 Posted March 18, 2020 at 02:10 PM 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". Link to comment Share on other sites More sharing options...
Pedro Pinto Posted March 18, 2020 at 03:02 PM Author Report Share #617623 Posted March 18, 2020 at 03:02 PM 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"); } Link to comment Share on other sites More sharing options...
antseq Posted March 18, 2020 at 10:27 PM Report Share #617633 Posted March 18, 2020 at 10:27 PM 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; } Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted March 29, 2020 at 09:21 PM Report Share #617761 Posted March 29, 2020 at 09:21 PM 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 Portugol Plus Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now