Ir para conteúdo
Fórum Script Brasil
  • 0

Matriz aleatória sem repetição


Suélio

Pergunta

9 respostass a esta questão

Posts Recomendados

  • 0

É só criar a matriz e começar a preencher com números aleatorios. Vc precisa de uma variável que é um contador na qual vc pode chamar "int gerados" que começa valendo 0. A cada numero gerado a variável "gerados" incrementa. A cada numero gerado vc precisa comparar com os outros gerados anteriormente e somente guardar se for diferente a todos os anteriores gerados, caso contrario deverá ser gerado outro.

O problema é que ao ser uma matriz aumenta a complexidade, porem se souber que no fundo uma matriz é um vetor em realidade vc pode aproveitar isso para fazer as comparações mais facilmente.

Tente fazer o exemplo, mais tarde ponho um exmplo de como seria mais ou menos aqui, agora não posso.





 

Link para o comentário
Compartilhar em outros sites

  • 0
 #include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include "basico.c"
int checa(int **matriz, int n, int m);
int entradamatrizint(int **matriz,int n,int m);
int main()
{
    system("clear");
     srand(time(NULL));
    int **MatrizA;
    int i,n;

    printf("entre com a ordem da matriz: ");
    scanf("%d",&n);
    if (n == 0) {printf("\nDimensões nula\nPrograma Finalizado\n");system("pause");return 1;}
     /*Alocação de Memória para Matrizes*/
    if(!(MatrizA = alocacaoint(n,n)))
    {
        printf("\nNão foi possível alocar memória para Matriz A\nFim de Programa\n");
        return 1;
    }
    /*Entrada da Matriz A*/
    entradamatrizint(MatrizA,n,n);

    /*Impressão da Matriz A*/
    imprimematrizint(MatrizA,n,n);
    getchar();
    return 0;
}
int entradamatrizint(int **matriz,int n,int m)
{
        int a,i,j;


        for (i=0;i<n;i++) for(j=0;j<m;j++)
        {
            a=rand()%100+1;
            matriz[j]=a;
            checa(matriz,n,a);}
        return 0;
}

int checa(int **matriz, int dim, int num ){
    int  i, j, cont=0;
    for(i=0; i<dim; i++)
    for(j=0; j<dim;j++)
    if(num==matriz[j]){
    cont++;
if(cont>1){
printf("\no numero %d se repete %d vezes\n\n", num, cont);
}
    }

    return 0;}

 

//códico com os escopos:

int **alocacaoint(int n, int m);
int imprimematrizint(int **matriz,int n,int m);
int **alocacaoint(int n, int m)
{
    int **matriz;
    int i;
    matriz = (int **)calloc(n,sizeof(int *));
    if(!matriz)
          return (NULL);
    for(i=0;i<n;i++)
    {
        matriz=(int *)calloc(m,sizeof(int));
        if(!matriz)

            return (NULL);

    }
    return (matriz);
}
int imprimematrizint(int **matriz,int n,int m)
{
    int i,j;

        for (i=0;i<n;i++)
        {
            printf("\n");
            for(j=0;j<m;j++) printf("%d\t",matriz[j]);
            printf("\n");
        }
        return 0;

} 

Bom, eu consegui fazer até aqui. gero uma atriz aleatória e verifico se ela possui elementos repetidos. mas não consigo fazer mais nada depois disso. sem mais delongas, segue abaixo meus 2 códigos. o principal e um com os escopos.

 

 

 

Editado por Suélio
Link para o comentário
Compartilhar em outros sites

  • 0

Boa tarde, cara acho que você está complicando seu código atoa.

veja esse exemplo simples 

#include <stdio.h> //standard input out - usado para entrada e saida de dados 
#include <stdlib.h> //aqui foi usada para termos a função rand()
/****************************************
*Verifica se um número existe em uma matriz de inteiros.
*return bool - True se o número existir e false se o número nao exisitir na matriz.
*@int *matriz - Ponteiro para o inicio da matriz de inteiros.
*@int linha - Número de linhas que existe na matriz.
*@int coluna - Número de colunas que existe na matriz.
******************************/
bool checarNumeroExiste(int *matriz, int linha, int coluna, int valor){
	int *ponteiro=matriz;
	for( int i=0; i<(linha*coluna); i++, ponteiro++){
		if( (*ponteiro)==valor){
			return true;
		}
	}
	return false;
}

int main(){
	
	//definindo a matriz.
	int matriz[3][3];
	
	//pegando o ponteiro do primeiro iten da matriz.
	int *pont=&matriz[0][0];
	
	int valorGerado; //usado para armazenar temporariamente o valor gerado aleatoriamente.
	
	//preenchendo a matriz.
	for(int i=0; i<3; i++){
		for(int j=0; j<3; j++){
			//pegamos um valor aleatorio dentro de um universo de 1000 elementos.
			valorGerado=(rand()%1000+1);
			//verificando se esse valor já existe na matriz.
			if( (i+j)==0){
				matriz[i][j]=valorGerado;
			}else if(checarNumeroExiste(pont, i>0 ? i : 1 , j, valorGerado)==false){
				matriz[i][j]=valorGerado;
			}else{
				//volta os contadores dos laços, para repetir a vola.
			}
			
		}
	}
	
		//imprimindo a matriz.
	for(int i=0; i<3; i++){
		for(int j=0; j<3; j++){
			printf("%d ", matriz[i][j]);
		}
		printf("\n");
	}
	


}

Eu recomendo você usar uma biblioteca melhor para gerar números aleatórios, já que a rand() não é muito legal. mtrand() é excelente. 

Link para o comentário
Compartilhar em outros sites

  • 0

Boa tarde hermanos. eu já consegui resolver o problema e esqueci de atualizar o post. consegui de duas formas, uma por Buble sort e outra recursiva. o código tinha 4 objetivos por isso vai parecer grande mas é só acompanhar o raciocínio que entende. 1: Gerar uma matriz aleatória não repetida. 2: ordenar essa matriz de 0 a n; 3: Ordenar as linhas da matriz. 4: ordenar as colunas da matriz. vou deixar links com os códigos aqui em baixo. att.

obs: o arquivo basico.c é de escopos e deve ser colocado na mesma pasta dos outros 2.

https://drive.google.com/file/d/0B3tA_HGV8LLWMWdhTFcyNXhaQ1E/view?usp=sharing

https://drive.google.com/open?id=0B3tA_HGV8LLWcDJ4NVBvTExqYnc

https://drive.google.com/open?id=0B3tA_HGV8LLWTUdSeEoxakVwRWs

Editado por Suélio
Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...