Ir ao conteúdo
  • Cadastre-se

C Ordenação de números aleatórios


Posts recomendados

Boa tarde, estou com um problema no meu código que é o seguinte: estou tentando ordenar de forma crescente números aleatórios, porém, algo não está funcionando.

Segue o código da forma como está agora:

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

int main (void){
	setlocale(LC_ALL, "Portuguese");
	
	int cont, num_max, limite_max, aux, i;
	
	printf("Digite o limite máximo do intervalo que deve ser respeitado pelos números: ");
	scanf("%i", &limite_max);
	
	printf("\nDigite o total de números que serão gerados: ");
	scanf("%i", &num_max);
	
	printf("\nNÚMEROS GERADOS ALEATORIAMENTE DE ACORDO COM O LIMITE MÁXIMO!\n");
	
	srand(time(NULL));
	
	for(cont = 1; cont <= num_max; cont++){
		for (i = cont + 1; i <= num_max; i++){
			if(cont > i){
				aux = cont;
				cont = i;
				i = aux;
			}
		}
		printf("%i ", rand () % limite_max);
	}
getch ();
}

Se puderem me dar umas dicas do que fazer para resolver esse problema. Porque eu tentei com números pré-definidos e consegui, porém, fui tentar com números aleatórios e não consegui achar uma forma de ordená-los.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@Victor Portugal     isso mesmo que @Flávio Pedroza disse , e outra coisa eh que voce precisa colocar os numeros gerados em um vetor , e entao depois que os numeros estiver inseridos no vetor voce usa esse codigo que voce fez com dois loop  e comparando o que esta no vetor , e nao esquecendo de colocar a posicao do vetor dentro dos colchetes , assim  colocando em ordem   .

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@Flávio Pedroza @devair1010 acho que entendi. Eu criou um vetor para armazenar os números sorteados, aí eu tiro o loop de dentro do for que gera os números e dentro desse for eu coloco o vetor para receber os números certo? Aí depois do for eu faço o loop para ordenar, é isso?

  • Curtir 1
  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

@Victor Portugal    sim , isso mesmo ,  um loop  gera os número e coloca no vetor preenchendo o vetor do começo até o fim e os outros dois loop aninhados um dentro do outro faz a ordenação ,  que seria assim  :

for(cont =0; cont < num_max-1; cont++ ){     /* o vetor começa em zero */
    for(i = cont+1; i   < num_max; i++){
        if( vetor[cont] > vetor[i]    ){
            aux         = vetor[cont]  ;
            vetor[cont] = vetor[i]     ;
            vetot[i]    =           aux;
        }
    }
}

 

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

@devair1010 @Flávio Pedroza então, eu fiz a alteração que vocês recomendaram - pelo menos eu acho, rs -, e ele tá imprimindo em ordem crescente, porém, apareceu outro problema. Os 4 primeiros números sempre são 0.

Segue o código:

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

int main (void){
	setlocale(LC_ALL, "Portuguese");
	
	int cont, num_max, limite_max, vet_num_random[30], i, aux;
	
	printf("Digite o limite máximo do intervalo que deve ser respeitado pelos números: ");
	scanf("%i", &limite_max);
	
	printf("\nDigite o total de números que serão gerados: ");
	scanf("%i", &num_max);
	
	printf("\nNÚMEROS GERADOS ALEATORIAMENTE DE ACORDO COM O LIMITE MÁXIMO!\n");
	
	srand(time(NULL));
	
	for(cont = 1; cont <= num_max; cont++){
		vet_num_random[cont] = rand () % limite_max;
		for(i = cont + 1; i <= num_max; i++){
			if(vet_num_random[cont] > vet_num_random[i]){
				aux = vet_num_random[cont];
				vet_num_random[cont] = vet_num_random[i];
				vet_num_random[i] = aux;
			}
		}
		printf(\n"%i ", vet_num_random[cont]);
	}
getch ();
}

O que será que pode ser o problema?

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@Victor Portugal    se você não quer que tenha numero zero , então você coloca +1 lá no rand , pois do jeito que esta ele gera números de zero ate o limite máximo - 1 , e então se gerar muitos números zero eles serão os primeiros na lista ordenada , pois são menores do que 1.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@devair1010 Entendi, mas tipo, toda vez que eu rodo o programa, os 4 primeiros números gerados são 0, já rodei diversas vezes e em todas os 4 primeiros números foram o 0. De qualquer jeito, vou fazer essa alteração que você falou para ver no que dá, mas aí todos os números serão acrescidos em 1 né? Se por exemplo ele sortear 5, vai me dar o 6, certo?

 

Aí essa parte do código ficaria assim: vet_num_random[cont] = rand () % limite_max + 1;

 

É isso?

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@devair1010 beleza, vou tentar fazer isso com o srand. Só que agora eu rodei o programa mais vezes e ele não estava ordenando não...

adicionado 7 minutos depois

edit:

 

Fiz umas alterações no código e consegui tirar 3 dos 4 zeros, mas agora o primeiro número é sempre 0 e não está ficando ordenado.

Segue o código:

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

int main (void){
    srand(time(NULL));
    setlocale(LC_ALL, "Portuguese");
    
    int cont, num_max, limite_max, vet_num_random[30], i, aux;
    
    printf("\nDigite o limite máximo do intervalo que deve ser respeitado pelos números: ");
    scanf("%i", &limite_max);
    
    printf("\nDigite o total de números que serão gerados: ");
    scanf("%i", &num_max);
    
    printf("\nNÚMEROS GERADOS ALEATORIAMENTE DE ACORDO COM O LIMITE MÁXIMO!\n");
    
    for(cont = 1; cont <= num_max; cont++){
        for(i = cont + 1; i <= num_max; i++){
            vet_num_random[cont] = rand () % limite_max;
            if(vet_num_random[cont] > vet_num_random){
                aux = vet_num_random[cont];
                vet_num_random[cont] = vet_num_random;
                vet_num_random = aux;
            }
        }
        printf("%i ", vet_num_random[cont]);
    }
getch();
}

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

você tem que gerar os número em loop separado:

for(i = 0; i < num_max; i++){
  vet_num_random[i] = rand () % limite_max;
  printf("%i ", vet_num_random[i]);
}
//agora pode ordernar
                             
for(cont = 0; cont < num_max-1; cont++){ //array sempre começa em zero
        for(i = cont + 1; i < num_max; i++){
            if(vet_num_random[cont] > vet_num_random[i]){
                aux = vet_num_random[cont];
                vet_num_random[cont] = vet_num_random[i];
                vet_num_random = aux;
            }
        }
}
        

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@Flávio Pedroza Nossa, verdade... Eu tinha falado isso lá em cima

19 horas atrás, Victor Portugal disse:

Eu criou um vetor para armazenar os números sorteados, aí eu tiro o loop de dentro do for que gera os números e dentro desse for eu coloco o vetor para receber os números certo? Aí depois do for eu faço o loop para ordenar, é isso?

Aí fui fazer e fiz diferente KKKKKKKKKKKK

Vou tentar aqui e já falo se deu certo

adicionado 13 minutos depois

Ficaria assim o código?

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

int main (void){
	srand(time(NULL));
	setlocale(LC_ALL, "Portuguese");
	
	int cont, num_max, limite_max, vet_num_random[30], i, aux;
	
	printf("\nDigite o limite máximo do intervalo que deve ser respeitado pelos números: ");
	scanf("%i", &limite_max);
	
	printf("\nDigite o total de números que serão gerados: ");
	scanf("%i", &num_max);
	
	printf("\nNÚMEROS GERADOS ALEATORIAMENTE DE ACORDO COM O LIMITE MÁXIMO!\n");
	
	for(i = 0; i < num_max; i++){
		vet_num_random[i] = rand () % limite_max;
		printf("%i ", vet_num_random[i]);
	}

	for(cont = 0; cont < num_max - 1; cont++){
		for(i = cont + 1; i < num_max; i++){
			if(vet_num_random[cont] > vet_num_random[i]){
				aux = vet_num_random[cont];
				vet_num_random[cont] = vet_num_random[i];
				vet_num_random[i] = aux;
			}
		}
	}
getch();
}

Se sim, ele resolveu o problema dos zeros, porém, continua sem ordenar...

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

@Victor Portugal    você está imprimindo os números gerados e antes de ordena-los ,  então depois da ordenação imprima novamente ,  e a questão dos zeros é porque são gerados aleatórios mesmo  , mas aqui depois de algumas compilações ele gerou números acima de zero :  então seu código poderia ser assim   :

ordenar.JPG.a02945449e170d0f565edd66d51407b0.JPG

#include <stdio.h>
#include <locale.h>
#include <time.h>
#include <stdlib.h>
#include <conio.h>
int main(){
    srand(time(NULL));
    setlocale(LC_ALL, "Portuguese");

    int cont, num_max, limite_max, vet_num_random[30], i, aux;

    printf("\nDigite o limite máximo do intervalo que deve ser respeitado pelos números: ");
    scanf("%i", &limite_max);

    printf("\nDigite o total de números que serão gerados: ");
    scanf("%i", &num_max);

    printf("\nNÚMEROS GERADOS ALEATORIAMENTE DE ACORDO COM O LIMITE MÁXIMO!\n");
    printf("\n e desordenados !  --> ");
    for(i = 0; i < num_max; i++){
        vet_num_random[i] = rand () % limite_max;
        printf("%i ", vet_num_random[i]);
    }
    printf("\n\naqui ordenados crewscente --> ");
    for(cont = 0; cont < num_max - 1; cont++){
        for(i = cont + 1; i < num_max; i++){
            if( vet_num_random[cont] > vet_num_random[i]  ){
                aux                  = vet_num_random[cont];
                vet_num_random[cont] = vet_num_random[i]   ;
                vet_num_random[i]    =                  aux;
            }
        }
    }

    for(i=0;i<num_max;i++){
        printf("%d",vet_num_random[i]);
        if(i < num_max-1){
            printf(" - ");
        }
    }
    printf("\n\n");
    getch();
}

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@devair1010 consegui entender como fazer e consegui resolver aqui, valeu mesmo. @Flávio Pedroza valeu pela ajuda também!

 

Só uma coisa, e se caso eu quisesse que não houvessem números repetidos, como ficaria?

 

Segue o código atual:

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

int main(){
	srand(time(NULL));
	setlocale(LC_ALL, "Portuguese");

	int cont, num_max, limite_max, vet_num_random[30], i, aux;

	printf("\nDigite o limite máximo do intervalo que deve ser respeitado pelos números: ");
	scanf("%i", &limite_max);

	printf("\nDigite o total de números que serão gerados: ");
	scanf("%i", &num_max);

	printf("\nNÚMEROS GERADOS ALEATORIAMENTE DE ACORDO COM O LIMITE MÁXIMO!\n\n");
	
	for(i = 0; i < num_max; i++){
		vet_num_random[i] = rand () % limite_max;
	}

	for(cont = 0; cont < num_max - 1; cont++){
		for(i = cont + 1; i < num_max; i++){
			if(vet_num_random[cont] > vet_num_random[i]){
				aux = vet_num_random[cont];
				vet_num_random[cont] = vet_num_random[i];
				vet_num_random[i] = aux;
			}
		}
	}

	for(i = 0; i < num_max; i++){
        if(i < num_max - 1){
            printf("%i - ",vet_num_random[i]);
        } else{
            printf("%i",vet_num_random[i]);
        }
    }
    
    printf("\n");

getch();
}

 

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

@Victor Portugal     precisaria colocar  hum  loop  dentro do loop de gerar os números ,  de forma que o loop de dentro vai comparando o número gerado  com todos os números do vetor e se for igual  volte atrás e repita a geração do número daquela posição ,  aqui um exemplo desse código em portugol  :

para j de 0 ate num_max faca
    flag := 0                                   // variável de controle
    repita                                      // repete
      b := randi(60)                            // escolhe aleatoriamente
      para c de 0 ate num_max faca              // loop percorre todo o vetor
        se b = vetor_numeros_aleatorios[c] entao// se numero na posção da variável for igual
          flag := 1                             // faz flag = 1 para repetir
          interrompa                            // termina e sai do loop pois já que é igual
        fimse
      fimpara
    ate flag = 0                                // ate que seja zero
    vetor_numeros_aleatorios[j] := b            // coloca no vetor o número gerado e que não é repetido
  fimpara
  escreval                                      // pula uma linha
  escreval("         Aqui Estão Os ",num_max," Números Inseridos Aleatórios !")
  para j de 0 ate num_max faca                  // percorrer todo o vetor
    escreva(vetor_numeros_aleatorios[j])        // imprime o número dessa posição
    se j < num_max-1 entao                      // se não for a última posição do vetor
      escreva(" - ")                            // imprime um tracinho de separação entre os números
    fimse
  fimpara
  espera                                        // espeara precionar alguma tecla no teclado

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!