Jump to content

Funçao Srand Mas com N numeros pares!!


duarte_valente
 Share

Recommended Posts

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

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

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

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

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
 Share

×
×
  • 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.