BrunoSantos Posted March 25, 2015 at 03:20 PM Report Share #580208 Posted March 25, 2015 at 03:20 PM (edited) BOAS! Há sensivelmente 2 dias fui ajudado a realizar um programa de totoloto o que correu bastante bem, mas agora o meu colega está com um problema no programa dele e como usei Array's no meu programa não consigo decifrar onde está o erro no programa dele. Era suposto quando o utilizador acerta-se em pelo menos 2 números, aparecia uma mensagem a dizer que tinha ganho mas não aparece nada. Será que alguem me podia dar uma ajudinha? OBRIGADO 🙂 Random random = new Random(); private int gerarNumeros(int min, int max) { //Gerar um número entre 1 e 50: int res = random.Next(1, 50); return res; } private int gerarNumeroDaSorte(int min, int max) { //Gerar um número entre 1 e 14: int res = random.Next(1, 14); return res; } private void btGerar_Click(object sender, EventArgs e) { int num1, num2, num3, num4, num5, numSup; if(cbNum1.SelectedItem != null && cbNum2.SelectedItem != null && cbNum3.SelectedItem != null && cbNum4.SelectedItem != null && cbNum5.SelectedItem != null && cbNumsup.SelectedItem != null) //Verificar se as caixas de texto estão todas preenchidas if (cbNum1.SelectedItem != cbNum2.SelectedItem && cbNum1.SelectedItem != cbNum3.SelectedItem && cbNum1.SelectedItem != cbNum4.SelectedItem && cbNum1.SelectedItem != cbNum5.SelectedItem && cbNum2.SelectedItem != cbNum3.SelectedItem && cbNum2.SelectedItem != cbNum4.SelectedItem && cbNum2.SelectedItem != cbNum5.SelectedItem && cbNum3.SelectedItem != cbNum4.SelectedItem && cbNum3.SelectedItem != cbNum5.SelectedItem && cbNum4.SelectedItem != cbNum5.SelectedItem) //Verificar se não existem números repetidos { do //Do While para não existirem números gerados repetidos: { num1 = gerarNumeros(1, 50); //Gerar valores de 1 a 50 para a variável num1 num2 = gerarNumeros(1, 50); //Gerar valores de 1 a 50 para a variável num2 num3 = gerarNumeros(1, 50); //Gerar valores de 1 a 50 para a variável num3 num4 = gerarNumeros(1, 50); //Gerar valores de 1 a 50 para a variável num4 num5 = gerarNumeros(1, 50); //Gerar valores de 1 a 50 para a variável num5 numSup = gerarNumeroDaSorte(1, 14); //Gerar valores de 1 a 14 para a variável numSup } while ((num1 == num2) || (num1 == num3) || (num1 == num4) || (num1 == num5) || (num2 == num3) || (num2 == num4) || (num2 == num5) || (num3 == num4) || (num3 == num5) || (num4 == num5)); MessageBox.Show("Os números gerados foram: " + num1 + " " + num2 + " " + num3 + " " + num4 + " " + num5 + " e o número da sorte foi: " + numSup); verificarPremio(); } else { MessageBox.Show("Não podem existir número iguais."); } else { MessageBox.Show("Por favor, preencha todas as Combo-Box"); } } private void verificarPremio() { int resnumeros, resSup; resnumeros = verificarNumeros(); resSup = verificarNumeroDaSorte(); switch(resnumeros) { case 2: MessageBox.Show("Ganhou o 5º Prémio!"); break; case 3: MessageBox.Show("Ganhou o 4º Prémio!"); break; case 4: MessageBox.Show("Ganhou o 3º Prémio!"); break; case 5: switch (resSup) { case 0: MessageBox.Show("Ganhou o 2º Prémio!"); break; case 1: MessageBox.Show("PARABÉNS! Ganhou o 1º Prémio!"); break; } break; default: MessageBox.Show("Não ganhou prémio"); break; } } private int verificarNumeros() { int res = 0; int num1, num2, num3, num4, num5; int numero1, numero2, numero3, numero4, numero5; do //Do While para não existirem números gerados repetidos: { num1 = gerarNumeros(1, 50); //Gerar valores de 1 a 50 para a variável num1 num2 = gerarNumeros(1, 50); //Gerar valores de 1 a 50 para a variável num2 num3 = gerarNumeros(1, 50); //Gerar valores de 1 a 50 para a variável num3 num4 = gerarNumeros(1, 50); //Gerar valores de 1 a 50 para a variável num4 num5 = gerarNumeros(1, 50); //Gerar valores de 1 a 50 para a variável num5 } while ((num1 == num2) || (num1 == num3) || (num1 == num4) || (num1 == num5) || (num2 == num3) || (num2 == num4) || (num2 == num5) || (num3 == num4) || (num3 == num5) || (num4 == num5)); numero1 = Convert.ToInt16(cbNum1.SelectedItem); //Converter o número da combo-box e guarda-lo na variável numero1 numero2 = Convert.ToInt16(cbNum2.SelectedItem); //Converter o número da combo-box e guarda-lo na variável numero2 numero3 = Convert.ToInt16(cbNum3.SelectedItem); //Converter o número da combo-box e guarda-lo na variável numero3 numero4 = Convert.ToInt16(cbNum4.SelectedItem); //Converter o número da combo-box e guarda-lo na variável numero4 numero5 = Convert.ToInt16(cbNum5.SelectedItem); //Converter o número da combo-box e guarda-lo na variável numero5 if (numero1 == num1 || numero1 == num2 || numero1 == num3 || numero1 == num4 || numero1 == num5) //Verificar se o Primeiro número que o utilizador escolheu é igual a algum dos valores gerados: { res++; } if (numero2 == num1 || numero2 == num2 || numero2 == num3 || numero2 == num4 || numero2 == num5) //Verificar se o Segundo número que o utilizador escolheu é igual a algum dos valores gerados: { res++; } if (numero3 == num1 || numero3 == num2 || numero3 == num3 || numero3 == num4 || numero3 == num5) //Verificar se o Terceiro número que o utilizador escolheu é igual a algum dos valores gerados: { res++; } if (numero4 == num1 || numero4 == num2 || numero4 == num3 || numero4 == num4 || numero4 == num5) //Verificar se o Quarto número que o utilizador escolheu é igual a algum dos valores gerados: { res++; } if (numero5 == num1 || numero5 == num2 || numero5 == num3 || numero5 == num4 || numero5 == num5) //Verificar se o Quinto número que o utilizador escolheu é igual a algum dos valores gerados: { res++; } return res; } private int verificarNumeroDaSorte() { int res = 0; int numSup, numeroSup; numSup = gerarNumeroDaSorte(1, 14); //Gerar número de 1 a 14 e guarda-lo na variável numSup numeroSup = Convert.ToInt16(cbNumsup.SelectedItem); if (numeroSup == numSup) //Verificar se o Número Da Sorte que o utilizador escolheu é igual ao número da sorte gerado: { res++; } return res; } } } Edited March 26, 2015 at 02:05 PM by BrunoSantos geshi Link to comment Share on other sites More sharing options...
BrunoSantos Posted March 27, 2015 at 12:14 AM Author Report Share #580290 Posted March 27, 2015 at 12:14 AM Ninguem? 😞 Link to comment Share on other sites More sharing options...
KTachyon Posted March 27, 2015 at 01:28 AM Report Share #580293 Posted March 27, 2015 at 01:28 AM Utilizar um do...while para evitar repetição de números não é uma boa forma de resolveres o problema. Se colocares os números todos num array, escolheres uma posição aleatória até à posição máxima do array e removeres esse número do array resolve-te logo o problema de teres que verificar se existem números repetidos. Para além disso estás a verificar se existe uma igualdade e, se existir, mandas gerar tudo outra vez, o que aumenta drasticamente a probabilidade de isso te acontecer. Depois, tens duas funções que têm exactamente o mesmo procedimento (gerar 5 números aleatórios). Devias isolar isso numa única função para evitares repetições de código. Em projectos mais complexos, se detectares um erro num desses procedimentos vais ter que ir à caça de todos os sítios onde utilizaste o código. Provavelmente irá escapar-te um, o que te irá causar imensas dores de cabeça quando acontecer. Isto é a "filosofia" chamada DRY (Don't Repeat Yourself), que é oposta da WET (We Enjoy Typing). Isto sem falar de estares a gerar duas vezes os números, ou seja, geras os números, apresentas ao utilizador e depois, quando fores verificar o prémio, os números já são outros. Relativamente a comparar cada número introduzido com todos os números gerados, parece-me que existem alternativas mais elegantes que espetares 5 ifs uns a seguir aos outros. Se reparares, os ifs são todos iguais e a única coisa que varia é a variável que estás a comparar. Mais uma vez, DRY. Passas a variável para uma função que compara com todos os números gerados. O ideal seria encapsulares os conjuntos de números em objectos que têm uma função para realizar comparações. A isto chama-se SoC (Separation of Concerns). O switch case também não me parece uma boa abordagem para aquilo que pretendes fazer. Para além das estrelas só serem contabilizadas caso acertes nos números, coisa que penso que não funciona dessa forma, tu consegues criar uma função que calcule o prémio de outra forma e retorne a "posição" que depois podes utilizar para montar uma string que vais apresentar ao utilizador. Se fizeres tudo isto, o teu código fica bastante mais simples, fácil de ler e de detectar os problemas que existem. Quando tens funções que fazem demasiadas coisas, a tendência é sempre perderes mais tempo a descobrir o problema. Como não sei se o teu problema é não aparecer nada, ou não aparecer a mensagem correcta, vou, para já, assumir que o teu problema está no facto de apresentares um conjunto vencedor ao utilizador e depois gerares novos números. Se não for o caso, já te dei aqui imensos conselhos daquilo que deves fazer para melhorar o teu código e facilitar o debugging do mesmo. “There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.” -- Tony Hoare Link to comment Share on other sites More sharing options...
BrunoSantos Posted March 27, 2015 at 11:42 AM Author Report Share #580311 Posted March 27, 2015 at 11:42 AM Bom Dia, muito obrigado pela ajuda já estou a pôr em prática aquilo que me disse, mas tenho uma dúvida em como realizar o SoC porque ainda não aprendi como se faz, nem consigo encontrar bons exemplos no Google. Será que podia aprofundar um pouco mais? Obrigado. Link to comment Share on other sites More sharing options...
KTachyon Posted March 28, 2015 at 11:41 AM Report Share #580387 Posted March 28, 2015 at 11:41 AM Penso que ninguém te vai ensinar SoC. Pelo menos explicitamente. http://en.wikipedia.org/wiki/Separation_of_concerns “There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.” -- Tony Hoare 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