Jump to content
m90mine

Euromilhões em C

Recommended Posts

m90mine

Boas estou com algumas dificuldades em fazer o programa pois os numeros estao a repetir e nao devia o que pode ser?

#include<stdio.h>
#include<stdlib.h>



main()
{
      int i=0;
      int p=0; 
      int n,j,x;
      int a[5];
    
      
      
      printf("Numeros: "); 
    
      
      while(i<5) 
      {     
      n=rand();  
      if(n<=50) { 
               
               
               i++; 
               printf(" %d ",n);} 
               a[i]=n;
               }
               
                 
      for(j=1;j>5;j++){
                        printf(" %d ",a[j]);
                        
                        } 
                       
      printf("\nEstrelas: "); 
    
      
      while(p<2) 
      {     
      n=rand(); 
      
       
      if(n<=11) { 
               
               
               p++; 
               printf(" %d ",n);} 
               a[p]=n;
               }
               
                 
      for(x=1;x>2;x++){
                        printf(" %d\n",a[x]);
                        
                        }     
                        
                    
                 
      system("pause"); 
           
      }

Share this post


Link to post
Share on other sites
KTachyon

Uma coisa que tens "errada" à partida é o facto de estares a gerar números até, pelo menos, 32767 e esperares que saia um menor que 50...

Podes utilizar o resto da divisão inteira para teres a certeza que calha um entre 1 e 50:

n = 1+rand() % 50;

E o mesmo para as estrelas:

n = 1+rand() % 9;

É normal que possam sair repetidos. Tens que verificar se o número já saiu anteriormente.


“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

Share this post


Link to post
Share on other sites
thoga31

n = 1+rand() % 9;

Atenção, agora são 13 estrelas, não 9 :(


Knowledge is free!

Share this post


Link to post
Share on other sites
mjamado

Á alguma maneira para que nao saiam repetidos?

Teres um ciclo while a confirmar que o número sorteado não é igual a um que já exista no array. Por exemplo, claro. Existem outros métodos.


"Para desenhar um website, não tenho que saber distinguir server-side de client-side" - um membro do fórum que se auto-intitula webdesigner. Temo pelo futuro da web.

Share this post


Link to post
Share on other sites
Diutsu

sao 11 estrelas

Para nao sair repetidos, crias 2 vectores (um com 5 posições e outro com 2 para os numeroe e estrelas respectivamente) e comparas o valor que obtens com os que estão guardados, se tal ocorrer voltas a correr o random mais uma vez (e voltas a verificar).


XX SINFO - Semana Informática

Share this post


Link to post
Share on other sites
m90mine

Mas neste caso eu ja tenho um ciclo while nao faz diferença ter mais do que um?

Share this post


Link to post
Share on other sites
Localhost

Existem várias até. Uma delas (a mais simplista) seria ires mantendo um vector que te ia armazenando os números que já saíram. Cada vez que geravas um novo número fazias uma pesquisa pelo vector e verificavas se o número já existia. Se existisse não o consideravas, obviamente. Outra maneira muito mais rápida (complexidade constante) seria teres um vector com 50 posições (para os números) e cada vez que geravas um número i marcavas used[ i ] com o valor 1, por exemplo. Isto apenas acontecia se essa posição ainda não estivesse marcada. Caso estivesse marcada significava que o valor já tinha sido usado, logo não o consideravas. Podias fazer o mesmo para as estrelas (terias um vector com 9 posições).


here since 2009

Share this post


Link to post
Share on other sites
KTachyon

Mas neste caso eu ja tenho um ciclo while nao faz diferença ter mais do que um?

No outro problema tinhas ciclos, dentro de ciclos, dentro de ciclos. No final não tiveste nenhum problema, pois não? :(

Se queres evitar ciclos dentro de ciclos, utiliza a forma que o Localhost indicou. Cria um array com as 50 posições, inicializa a zero e, quando calhar um número, verificas primeiro se está marcado (p.e. com 1). se não tiver marcas (com 1), senão voltas a gerar novo número. Não te esqueças que, se não marcares, precisas de voltar a reduzir a variável de controlo no ciclo for.


“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

Share this post


Link to post
Share on other sites
m90mine

Tipo isto?

#include<stdio.h>
#include<stdlib.h>



main()
{
      int i=0;
      int p=0; 
      int n,j,x;
      int a[5];
      int estrelas[11];
      int numeros[50];
      int b[2];
      int k=1;
    
      
      
      printf("Numeros: "); 
    
      
      while(i<5) 
      { 
      n = 1+rand() % 50;    
      
      k=1
      used[k];
      
      if(n<=50) {        
       i++; 
       printf(" %d ",n);} 
       a[i]=n;
       }
               
                 
      for(j=1;j>5;j++){
      printf(" %d ",a[j]);                  
      } 
                       
      printf("\nEstrelas: "); 
    
      
      while(p<2) 
      {     
      n = 1+rand() % 11; 
       
      if(n<=11) { 
       p++; 
       printf(" %d ",n);} 
       a[p]=n;
       }
               
                 
      for(x=1;x>2;x++){
      printf(" %d\n",b[x]);
                        
                        }     
                        
                    
                 
      system("pause"); 
           
      }

Share this post


Link to post
Share on other sites
KTachyon

Continuas a utilizar o a[], não utilizas o b[], e não utilizas o numeros[] nem o estrelas[], para além de nem sequer estares a inicializar os valores desses array a um valor específico.


“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

Share this post


Link to post
Share on other sites
m90mine

Nao percebo nada disto nunca na vida vou dar programador  :wallbash:

Mais ou menos isto?

#include<stdio.h>
#include<stdlib.h>



main()
{
      int i=0;
      int p=0; 
      int n,j,x;
      int a[5];
      int used[50];
    
      
      
      printf("Numeros: "); 
    
      
      while(i<5) 
      { 
      n = 1+rand() % 50;    
      
      
      used[50];
      
      if(n<=50) {        
       i++; 
       printf(" %d ",n);} 
       a[i]=n;
       }
               
                 
      for(j=1;j>5;j++){
      printf(" %d ",a[j]);                  
      } 
                       
      printf("\nEstrelas: "); 
    
      
      while(p<2) 
      {     
      n = 1+rand() % 11; 
      
       
      used[11];
       
      if(n<=11) { 
       p++; 
       printf(" %d ",n);} 
       a[p]=n;
       }
               
                 
      for(x=1;x>2;x++){
      printf(" %d\n",a[x]);
                        
                        }     
                        
                    
                 
      system("pause"); 
           
      }

Share this post


Link to post
Share on other sites
KTachyon

A isso é que eu chamo pensar positivo, lol.

Repara, quando crias um array:

int casas = 50, estrelas = 11;
int used[casas];

O que vai estar nessas 50 casas vai ser lixo. O que quer que esteja na memória que foi alocada para esse array, fica lá a não ser que coloques tudo a zero:

int i;

for (i = 0; i < casas; i++) {
    used[i] = 0;
}

Com este ciclo certificas-te de que eliminaste todo o lixo que estava em memória.

Depois, quando geras um número aleatório, verificas se a casa já está marcada:

i = 0;

while (i < 5) { // 5 números de 1 a 50
    n = 1 + rand() % casas;

    if (used[n-1] == 0) { // verifica se a casa não foi escolhida
        used[n-1] = 1; // marca a casa
        a[i] = n; // para facilitar, não é necessário, podes achar os números a partir do used[]
        i++; // incrementa a variável de controlo
    }
}

/* Reutilizar o array used[] para as estrelas
(voltas a inicializar para te certificares de que as casas de 1 a 11 são zero) */
for (i = 0; i < estrelas; i++) {
    used[i] = 0;
}

i = 0; // reset à variável de controlo

while (i < 2) { // 2 números de 1 a... 11?
    n = 1 + rand() % estrelas;

    if (used[n-1] == 0) { // verifica se a casa não foi escolhida
        used[n-1] = 1; // marca a casa
        b[i] = n; // para facilitar, não é necessário, podes achar os números a partir do used[]
        i++; // incrementa a variável de controlo
    }
}

E pronto, podes imprimir...


“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

Share this post


Link to post
Share on other sites
m90mine

Experiementei o codigo apenas nos numeros mas so as estrelas é que aparecem o que pode ser?

#include<stdio.h>
#include<stdlib.h>



main()
{
      
      int p=0; 
      int n,j,x;
      int a[5];
      int casas = 50, estrelas = 11;
      int used[casas];
      int i;
      int b[i];

for (i = 0; i < casas; i++) {
    used[i] = 0;
}
      
      printf("Numeros: "); 
    
      
     i = 0;

while (i < 5) { 
    n = 1 + rand() % casas;

    if (used[n-1] == 0) { 
        used[n-1] = 1; 
        a[i] = n; 
        i++; 
    }
}


for (i = 0; i < estrelas; i++) {
    used[i] = 0;
}

i = 0; 

while (i < 2) { 
    n = 1 + rand() % estrelas;

    if (used[n-1] == 0) { 
        used[n-1] = 1; 
        b[i] = n; 
        i++; 
    }
}
      
                       
      printf("\nEstrelas: "); 
    
      
      while(p<2) 
      {     
      n = 1+rand() % 11; 
      
       
      used[11];
       
      if(n<=11) { 
       p++; 
       printf(" %d ",n);} 
       a[p]=n;
       }
               
                 
      for(x=1;x>2;x++){
      printf(" %d\n",a[x]);
                        
                        }     
                        
                    
                 
      system("pause"); 
           
      }

Share this post


Link to post
Share on other sites
m90mine

Que variávelmeto no ultimo printf?

 printf("Numeros: "); 
                   

      
     i = 0;

     while (i < 5) { 
     n = 1 + rand() % casas;

    if (used[n-1] == 0) { 
        used[n-1] = 1; 
        a[i] = n; 
        i++; 
    }
    for (i = 0; i < casas; i++) {
    used[i] = 0;
    printf(" %d ",casas);
    } 
}

Share this post


Link to post
Share on other sites
Localhost

Por que é que estás sempre a utilizar o valor n-1 e não apenas n? Primeiro tens que aprender a melhorar essa indentação (não sei se tem algo a ver com o copy-paste), depois tens que aprender que existe um compilador e que tu podes efectivamente testar os teus códigos (por isso é que isto é divertido -- podes sempre ver se aquilo que estás a fazer está bem) por isso não precisas de andar sempre a perguntar se "é algo como isto?". Testas e vês se é, se não for vens cá e tiramos-te as dúvidas :-)

Agora pensa lá um bocadinho. O que é que o vector a contém? Os valores que vais utilizar. Quantos elementos tem o vector a? Tem casas elementos (ou i elementos). Estás a fazer correctamente o ciclo até casas mas depois tens que imprimir o valor de a[ i ]. Percebes porquê? 


here since 2009

Share this post


Link to post
Share on other sites
m90mine

Neste momento o codigo esta assim mas nao esta a funcionar correctamente nao sei porque ???

#include<stdio.h>
#include<stdlib.h>



main()
{
      
      int p=0; 
      int n,j,x;
      int a[5];
      int casas = 50, estrelas = 13;
      int used[casas];
      int i;
      int b[5];


    
      
      
      printf("Numeros: "); 
                   

      
     i = 0;

     while (i < 5) { 
     n = 1 + rand() % casas;

    if (used[n-1] == 0) { 
        used[n-1] = 1; 
        a[i] = n; 
        i++; 
    }
    
    printf("  %d ",a[i]);
    } 


      
      
                       
      printf("\nEstrelas: "); 
   
   


i = 0; 

while (i < 2) { 
    n = 1 + rand() % estrelas;

    if (used[n-1] == 0) { 
        used[n-1] = 1; 
        b[i] = n; 
        i++; 
    }
       for (i = 0; i < estrelas; i++) {
    used[i] = 0;
    printf(" %d\n",a[i]);
}  
}
    
      
               
                 
      
        
                        
                    
                 
      system("pause"); 

Share this post


Link to post
Share on other sites
KTachyon

Podes sempre indicar o erro. Apesar de a informação não parecer legível, a verdade é que é, e quando estás a tentar tirar dúvidas com pessoal que já tem alguma experiência, facilita a procura pelo bug.

Primeiro, se vais imprimir dentro do while e não precisas de guardar as variáveis, podes simplesmente imprimir n, depois de veres que não é repetido. Se estás a imprimir fora do if, então vais estar a imprimir lixo (como referi anteriormente) se sair um número repetido.

No ciclo das estrelas é a mesma coisa, mas pior. Estás a percorrer um array dentro do ciclo e, ainda por cima, estás a usar a mesma variável de controlo (i), alterando-a e saindo automaticamente do ciclo while... para além de o array a[] nem sequer ter tantas casas alocadas como o número de estrelas (11).


“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

Share this post


Link to post
Share on other sites
m90mine

Não estou a conseguir o erro é que repete so um numero tipo 3 e repete a nomero de casas tipo nas estrelas aparece 11 e nos numeros aparece 50 vezes esse numero repetido

#include<stdio.h>
#include<stdlib.h>



main()
{
      
      int p=0; 
      int n,j,x;
      int a[5];
      int casas = 50, estrelas = 13;
      int used[casas];
      int i;
      int b[5];


    
      
      
      printf("Numeros: "); 
                   

      
     i = 0;

     while (i < 5) { 
     n = 1 + rand() % casas;
printf("  %d ",n);
    } 
    if (used[n-1] == 0) { 
        used[n-1] = 1; 
        a[i] = n; 
        i++; 
    }
    
    


      
      
                       
      printf("\nEstrelas: "); 
   
   


i = 0; 

while (i < 2) { 
    n = 1 + rand() % estrelas;
     
      
} 



    if (used[n-1] == 0) { 
        used[n-1] = 1; 
        b[i] = n; 
        i++; 
   
    printf(" %d\n",n);
   
   
    }
  

}
    
      
               
                 
      
        
                        
                    
                 
      system("pause");     
      }

Share this post


Link to post
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

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