light_Show_#55 Posted March 18, 2020 at 10:19 PM Report Share #617632 Posted March 18, 2020 at 10:19 PM 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 More sharing options...
Rui Carlos Posted March 21, 2020 at 11:02 AM Report Share #617662 Posted March 21, 2020 at 11:02 AM 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. Rui Carlos Gonçalves Link to comment Share on other sites More sharing options...
light_Show_#55 Posted March 21, 2020 at 11:57 AM Author Report Share #617665 Posted March 21, 2020 at 11:57 AM #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 More sharing options...
Rui Carlos Posted March 21, 2020 at 08:08 PM Report Share #617674 Posted March 21, 2020 at 08:08 PM 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]. Rui Carlos Gonçalves Link to comment Share on other sites More sharing options...
antseq Posted March 23, 2020 at 09:41 AM Report Share #617683 Posted March 23, 2020 at 09:41 AM (edited) 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 March 23, 2020 at 09:47 AM by antseq 2 Report Link to comment Share on other sites More sharing options...
light_Show_#55 Posted March 26, 2020 at 02:56 PM Author Report Share #617730 Posted March 26, 2020 at 02:56 PM 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 More sharing options...
antseq Posted March 27, 2020 at 09:09 AM Report Share #617735 Posted March 27, 2020 at 09:09 AM (edited) 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 March 27, 2020 at 09:10 AM by antseq 1 Report 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