Jump to content
José Manuel Batista

Código de euromilhões

Recommended Posts

José Manuel Batista

Boas pessoal, encontro-me atualmente a estudar programação e o objetivo neste momento é desenvolver um programa para gerir uma chave aleatória de euromilhoes com os 5 numeros e estrelas sem que nenhum deles se repita.

Alguma dica, sugestão?

Obs: O código não está a correr neste momento.

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

main() {
 
time_t t;   

int n[5], ns, opcao, existe=0;

        do{
            printf("\tMenú");
            printf("1 - Gerar Chave\n");
            printf("2 - Mostrar Chave\n");
            printf("3 - Sair\n");
            scanf("%d", &opcao);

        switch(opcao) {
            
            case 1: 
                for(int i=0; i<5; i++) {
                    
                    ns=1+(rand()%50);
                    n[i]=ns;
                
                        if(i>0)
                            
                            do {
                                if(n[i] == n[i--] || 
                                    n[i] == n[i-2] ||
                                    n[i] == n[i-3] ||
                                    n[i] == n[i-4] ||
                                    n[i] == n[i-i]) {
                                        
                                        existe=1;
                                        n[i] = 1 + rand() % 50;
                                }
                                            
                                else
                                    existe=0;
                            }
                            while(existe==1);
                }

            case 2 :
                
            case 3 :
              
            default : printf("Opção Inválida");
        }
        }
        while(opcao!=3);
}

 

Share this post


Link to post
Share on other sites
antseq

Viva,

Estas no bom caminho, percebeste o problema e sabes que não pode haver repetição (Só isto já é meio caminho andado).

Comentários:

- não usaria o primeiro ciclo "for" uma vez que é indeterminado o número de vezes que vai correr, ou seja 5 se correr bem e 6, 7, 8, ... enquanto houver repetições (o código está mesmo a pedir um "while")

- os "Ifs" das repetições, também poderiam ser melhorados. imagina que a chave tinha 20 números ou 30, ias continuar a fazer "(a == b)" 30 vezes.!? (o código está mesmo a pedir algo dinâmico, não importa a quantidade de número da chave)

Segue uma versão melhorada. Tentei manter os nomes e parte do código que já tinhas:

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

void aleatorio(int *array, int qtdNum, int maxNum){
    int i = 0;
    while(i < qtdNum){
        int n = rand()%maxNum + 1;
        int existe = 0;
        for(int j=0; j<i; j++){
            if(array[j] == n) {
                existe = 1;
                break;
            }
        }
        if(existe == 0){
            array[i] = n;
            i++;
        }
    }
}

int main()
{
    int numeros[5];
    int estrelas[2];
    
    aleatorio(numeros, 5, 50);
    aleatorio(estrelas, 2, 12);
    for(int i=0; i<5; i++) printf("[%02d]",numeros[i]);
    for(int i=0; i<2; i++) printf("(%02d)",estrelas[i]);
}

 

Share this post


Link to post
Share on other sites
José Manuel Batista

Boas antseq,

Antes de mais um grande obrigado, o código que me devolveste foi bastante esclarecedor.

Comentários:

- Pois exato neste momento a minha ideia seria mesmo essa, diminuir o nº de repetições(verificações) relativos ás comparações que faz com os valores saídos anteriormente, por exemplo se ainda se encontra apenas a sortear o segundo número escusava de comparar com todos os outros a seguir pois ainda não existem e foram atribuídos não é? Daí ter começado a escrever o código  com o if("indice atual")==0 { "guardar numero sorteado"}, pois nao se precisa de comparar nada ainda.

- A ideia que tinha pensado agora seria talvez criando também um outro ciclo "for" de forma a comparar apenas com os anteriores, que começasse a partir do array[1], e á medida que vai aumentando o índice da matriz atual verificar também um número a mais para atrás graduamente, pois irá existir um outro número a verificar, correto?

- Uma outra alternativa que pensei seria que á medida que fossem saíndo e guardados os números na matriz, serem excluídos de forma a que quando fosse sortear o nº seguinte não fosse sair esse valor novamente.

Abraço

Share this post


Link to post
Share on other sites
HappyHippyHippo
On 7/19/2019 at 2:39 PM, José Manuel Batista said:

Boas antseq,

Antes de mais um grande obrigado, o código que me devolveste foi bastante esclarecedor.

Comentários:

- Pois exato neste momento a minha ideia seria mesmo essa, diminuir o nº de repetições(verificações) relativos ás comparações que faz com os valores saídos anteriormente, por exemplo se ainda se encontra apenas a sortear o segundo número escusava de comparar com todos os outros a seguir pois ainda não existem e foram atribuídos não é? Daí ter começado a escrever o código  com o if("indice atual")==0 { "guardar numero sorteado"}, pois nao se precisa de comparar nada ainda.

- A ideia que tinha pensado agora seria talvez criando também um outro ciclo "for" de forma a comparar apenas com os anteriores, que começasse a partir do array[1], e á medida que vai aumentando o índice da matriz atual verificar também um número a mais para atrás graduamente, pois irá existir um outro número a verificar, correto?

- Uma outra alternativa que pensei seria que á medida que fossem saíndo e guardados os números na matriz, serem excluídos de forma a que quando fosse sortear o nº seguinte não fosse sair esse valor novamente.

Abraço

tenho uma ideia melhor ... e que tal uma solução sem qualquer tipo de comparação tendo a confiança total que a saída de números nunca é repetida ?


IRC : sim, é algo que ainda existe >> #p@p

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.