duarte_valente Posted November 14, 2009 at 07:59 PM Report Share #296201 Posted November 14, 2009 at 07:59 PM Boas pessoal,fiz este programa gerar 5 numeros referentes ao totoloto.Numeros de 1 a 50.Isso foi fácil apresento asseguir. #include <stdio.h> #include <stdlib.h> #include <time.h> main() { int a,i,j,cont; //Declara as variáveis srand(time(NULL)); for (i=1; i<6; i++) // Repete enquanto aparece 5 numeros { printf("%d # ", rand()%50+1); /* para gerar números aleatórios de 1 a 50 */ } for(j=1;j<3;j++) // Repete enquanto aparece 2 numeros (estrelas) { printf("%d # ", rand()%9+1); /* para gerar números aleatórios de 1 a 9 */ } return 0; } Agora o meu problema é que quero gerar 5 numeros com N numeros pares. Ou seja ,pergunta quantos numeros pares deseja? se dissermos 2 numeros pares ,vai aparecer 2 numeros pares e 3 impares na chave,s e dissermos que queremos 3 numeros pares aparece 2 numeros impares. Estes numeros continuam a ser aleatórios com a funçao srand. Agradeciam que me vissem o codigo que tou a fazer e que me ajudassem o meu programa para que de isto.Ou me desse correcçoes,aqui vai o código que tou a fazer. #include <stdio.h> #include <stdlib.h> #include <time.h> int main() { int a,b,i,j,cont,cont1,impar; //Declara as variáveis printf("Qual o valor máximo de numeros pares?\n"); scanf("%d",&a); // Le numero for (i=1; i<6; i++) // Repete enquanto aparece 5 numeros { srand(time(NULL)); b=rand()%50+1; //funçao gerar numeros ,valor minimo 1 e máximo 50 if(b%2==0) // se o valor gerado for par { cont++;// conta +1 numero printf("%d # ",b); //escreve o valor par } else if(b%2==1 ) //se é impar { cont1++; //conta mais um numero printf("%d # ",b);// escreve valor impar } impar=5-a;//ha 5 numeros- numeros pares que voce escolhe dá qts numeros impares tem de aparecer printf("\n"); } } Link to comment Share on other sites More sharing options...
pedrosorio Posted November 14, 2009 at 08:11 PM Report Share #296204 Posted November 14, 2009 at 08:11 PM Há muitas maneiras de fazer isso e neste momento não estás a usar nenhuma - i.e. não estás a verificar se já geraste essa quantidade de números pares. Se efectivamente queres gerar números aleatórios com um máximo de n pares aquilo que eu faria era algo do estilo: -> Gerar num ciclo números aleatórios entre 1 e 50 e actualizar um contador sempre que fosse par -> Se o contador == n então em vez de gerar um número aleatório entre 1 e 50, geraria um número ímpar entre 1 e 49. Como? Repara que um número ímpar é um número da forma 2*p+1 em que p é inteiro. Basta-nos gerar um número aleatório entre 0 e 24, multiplicar por 2 e somar 1. O pseudocódigo é algo deste estilo: input maximo número de pares -> maxpar contapares=0 Repetir 5 vezes: Se contapares == maxpar: num = geraimpar(1<->49) Senão: num = gerainteiro(1<->50) Se num é par: contapares++ Não respondo a dúvidas por mensagem. Link to comment Share on other sites More sharing options...
duarte_valente Posted November 14, 2009 at 08:50 PM Author Report Share #296211 Posted November 14, 2009 at 08:50 PM Passei do pseucódigo para o programa e nao deu bem. Acha que o programa está correcto,podia me corrigir se nao fosse problema,ou entao dame ajudas,assim eu aprendia com se fazia.Usei maxpar e num como voce fez,assim já é mais facil voce perceber. #include <stdio.h> #include <stdlib.h> #include <time.h> int main() { int num,maxpar,cont; //Declara as variáveis printf("Qual o valor máximo de numeros pares?\n"); scanf("%d",&maxpar); // Le numero cont=0; while(cont<=5) { if(cont==maxpar) { num=rand()%49+1; printf("%d ",num); } else { num=rand()%50+1; printf("%d ",num); } if(num%2==0) { cont++; } } } Link to comment Share on other sites More sharing options...
pedrosorio Posted November 14, 2009 at 10:48 PM Report Share #296227 Posted November 14, 2009 at 10:48 PM Concluo do teu código que não percebeste nada do que disse. Tens que gerar 5 números aleatórios, como 'cont' está a contar os números pares que geras, não deve ser essa a variável usada para o ciclo (que deve contar quantos números aleatórios já foram gerados ao todo). Um ciclo for com i como tinhas antes funciona perfeitamente. Depois, não percebeste porque é que estamos a contar o número de pares gerados. A razão pela qual o fazemos é que, se já tivermos gerado o número máximo permitido pelo utilizador, devemos gerar apenas números ímpares. num=rand()%49+1; Este código não gera obviamente um número ímpar entre 1 e 49, mas sim um número inteiro qualquer entre 1 e 49. Tal como expliquei, gerar um número ímpar entre 1 e 49 é algo tão simples como gerar um número inteiro entre 0 e 24, multiplicá-lo por 2 e somar 1. Porquê? Por isto: 2*0 + 1 = 1 2*1 + 1 = 3 2*2 + 1 = 5 2*3 + 1 = 7 2*4 + 1 = 9 ... 2*24 + 1 = 49 Espero que percebas então qual o processo que deves usar para gerar um número ímpar aleatório. Uma última coisa que não afecta o output do programa mas que não corresponde ao pseudocódigo que coloquei no post anterior: if(num%2==0) { cont++; } Este if deve estar dentro do bloco do else. Porquê? Porque se gerares um número ímpar, já sabes que ele não é para e não precisas de realizar o teste. Não respondo a dúvidas por mensagem. 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