• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

duarte_valente

Funçao Srand Mas com N numeros pares!!

4 mensagens neste tópico

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");

       }
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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++

 

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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++;
         }
     }


}




0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora