Ir ao conteúdo

Posts recomendados

Postado

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
Postado

@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
Postado

@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
Postado

@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
Postado

@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
Postado

@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
Postado

@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
Postado

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
Postado

@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
Postado

@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
Postado

@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
Postado

@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

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