C/C++ Optimização de tarefa/código

wowmiguelfcp

Power Member
Boas pessoal.

Eu tenho um enxerto de código que me gera 5 números diferentes. Ele funciona bem, no entanto o código é extenso porque vou caso a caso. Como são apenas 5 números, não há stress, mas caso fosse mais, não faz sentido ir caso a caso. O que gostava de saber é como posso optimizar/reduzir o código, para que independentemente da quantidade de números a gerar apenas faça diferença no nº de vezes que o ciclo corre. Provavelmente será algo simples, mas de momento não me ocorre nada. O código que tenho de momento é este:

Código:
//Gerar números (1 a 50)
        /*1º*/    numeros[0] = rand() % 50 + 1;
        /*2*/    numeros[1] = rand() % 50 + 1;
                if (numeros [0] == numeros[1])
                {
                    while (1)
                    {
                        numeros[1] = rand() % 50 + 1;
                        if (numeros [0] != numeros[1])
                            break;
                    }
                }
        /*3*/    numeros[2] = rand() % 50 + 1;
                if (numeros[0] == numeros[2] || numeros[1] == numeros[2]) //Não há necessidade comparar o 0 com o 1, porque ja foi feito antes.
                {
                    while (1)
                    {
                        numeros[2] = rand() % 50 + 1;
                        if (numeros[0] != numeros[2] && numeros[1] != numeros[2])
                            break;
                    }
                }
        /*4*/    numeros[3] = rand() % 50 + 1;
                if (numeros[0] == numeros[3] || numeros[1] == numeros[3] || numeros[2] == numeros[3])
                {
                    while(1)
                    {
                        numeros[3] = rand() % 50 + 1;
                        if (numeros[0] != numeros[3] && numeros[1] != numeros[3] && numeros[2] != numeros[3])
                            break;
                    }
                }
        /*5*/    numeros[4] = rand() % 50 + 1;
                if (numeros[0] == numeros[4] || numeros[1] == numeros[4] || numeros[2] == numeros[4] || numeros[3] == numeros[4])
                {
                    while(1)
                    {
                        numeros[4] = rand() % 50 + 1;
                        if (numeros[0] != numeros[4] && numeros[1] != numeros[4] && numeros[2] != numeros[4] & numeros[3] != numeros[4])
                            break;
                    }
                }

Obrigado pela atenção.
Cumprimentos
 
1 - Crias uma função contains que recebe como parâmetros de entrada o número gerado e o array onde estás a guardar os números e retorna true caso o número exista no array ou false caso contrário.

2 - Crias um ciclo, no teu caso de 0 a 5 (não incluído). Geras um número. Verificas se o número existe no array utilizando o método criado em 1).

2.1 - Se não existir, adicionas ao array e continuas a execução do ciclo normalmente.

2.2 - Se existir, continuas a gerar números aleatórios até sair um que não está no array.

Desta forma, o teu código fica melhor, mais legível e mais limpo (sem tantos ifs).
 
1 - Crias uma função contains que recebe como parâmetros de entrada o número gerado e o array onde estás a guardar os números e retorna true caso o número exista no array ou false caso contrário.

2 - Crias um ciclo, no teu caso de 0 a 5 (não incluído). Geras um número. Verificas se o número existe no array utilizando o método criado em 1).

2.1 - Se não existir, adicionas ao array e continuas a execução do ciclo normalmente.

2.2 - Se existir, continuas a gerar números aleatórios até sair um que não está no array.

Desta forma, o teu código fica melhor, mais legível e mais limpo (sem tantos ifs).


Antes demais obrigado pela resposta e pelas dicas ;)

O ponto 1 percebi. Uma vez que o código que tem em cima faz parte do constructor de uma classe, posso criar essa função que dizes e dizer que é friendly à classe.

Agora o ponto 2 não percebi uma coisa. Como disse, o código que pus é um Constructor de uma classe. Isso que dizes ponho no construtor então certo?
 
Podes colocar no construtor directamente ou então num método e chamas esse método no construtor.

Esta última é a melhor, na minha opinião, uma vez que mantém o código mais limpo.
 
Aqui está um exemplo simples em C.
A variável "size" é o números de gerações que pretendes no input, aka o tamanho final do array.

Código:
No teu método:

i = 0;
while (i < size){
    num = rand() % 50 + 1;
    if (!repetido (num, i, numeros)){
        numeros[i] = num;
        i++;
    }
}


int repetido(int num, int len, int *numeros)
{
    int i;

    for (i = 0; i < len; i++){
        if (numeros[i] == num)
            return 1;
    }

    return 0;
}
 
Última edição:
Back
Topo