Jump to content

Matriz aleatória sem repetição


Suélio
Go to solution Solved by HappyHippyHippo,

Recommended Posts

e aí galera.

bom tô com um pequeno probleminha. eu tenho que gerar uma matriz aleatória não repetida. eu já consegui gerar a matriz aleatória e também consigo chegar se existem 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.

 

#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;

}
Link to comment
Share on other sites

3 horas atrás, HappyHippyHippo disse:

fisher-yates

#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 **alocacaoint(int n, int m);
int imprimematrizint(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);

    //mpressão da Matriz A
    //imprimematrizint(MatrizA,n,n);
    getchar();
    return 0;
}
int entradamatrizint(int **matriz,int n,int m)
{
        int a,i,j,cont=0;
        m=pow(n,2);
int numbers[m];
for (i = 0; i <m ; i++)
numbers[i]= i;
shuffle(numbers, m);
for (i=0; i<m;i++){//for(a=0;a<n;)
 printf("  %d   ", numbers[i]);
 cont++;
 if(cont==n){
 printf("\n");
 cont=0;
 }}
return 0;
                                   
                                  static int rand_int(int n) {
int limit = RAND_MAX - RAND_MAX % n;
int rnd;
do {
rnd = rand();
}
while (rnd >= limit);
return rnd % n;}
void shuffle(int *array, int n) {
int i, j, tmp;
for (i = n - 1; i > 0; i--) {
j = rand_int(i + 1);
tmp = array[j];
array[j] = array[i];
array[i] = tmp;
}}
  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[i]=(int *)calloc(m,sizeof(int));
		if(!matriz[i])

            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[i][j]);
            printf("\n");}
        }
        return 0;

}
  

código com esse algoritmo. problema: passar os valores para a matriz.

Link to comment
Share on other sites

  • Solution

como o pessoal gosta de dar umas voltas grandes ao código ...

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

// magia para obter a posição de memória da célula "l"x"c" de uma matriz quadrada "m" de ordem "o"
#define intMatrixCell(m, o, l, c) ((int *) (((size_t) m) + (o) * (l) * sizeof(int) + (c) * sizeof(int)))

// nova magia para trocar dois valores
#define xorswap(x, y) (* (x) ^= * (y), * (y) ^= * (x), * (x) ^= * (y))

int main(int argc, char ** argv) {
    // pedir a ordem da matriz
    int n = 0, total = 0;
    do
    {
        printf("Insira a ordem da matriz quadrada : ");
        fflush(stdout);

        if (scanf("%d", &n) && n <= 0)
            printf("Ordem da matriz escolhida inválida\n");
    } while (n <= 0);
    total = n * n;

    // alocar memoria para a matriz
    int * matrix = calloc(total, sizeof(int));
    if (! matrix)
    {
        fprintf(stderr, "Erro na alocacao de memoria para a matrix\n");
        return -1;
    }

    // criação da lista de números a serem atribuidos às posições da matriz
    int numbers[total];
    for (int i = 0; i < total; ++i)
        numbers[i] = i;

    // baralhar os números "fisher-yates style"
    srand(time(NULL));
    for (int i = 0; i < total; ++i)
    {
        int selected = (rand() % (total - i)) + i;
        if (selected != i)
            xorswap(& numbers[selected], & numbers[i]);

        // atribuir o número à posição "iterada" da matriz
        matrix[i] = numbers[i];
    }

    // apresentar a matriz
    for (int c = 0; c < n; ++c)
    {
        for (int l = 0; l < n; ++l)
            printf("%3d ", * intMatrixCell(matrix, n, l, c));
        printf("\n");
    }

    // libertar memoria alocada para a matriz
    free(matrix);

    return 0;
}
IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

Muito obrigado, me ajudou muito. ah, e desculpas pelas "voltas" do código, sou iniciante em programação. kkk

#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include "basico.c"
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;}
    if(!(MatrizA = alocacaoint(n,n)))
    {
        printf("\nNão foi possível alocar memória para Matriz A\nFim de Programa\n");
        return 1;
    }
    entradamatrizint(MatrizA,n,n);
    imprimematrizint(MatrizA,n,n);
    getchar();
    return 0;
}
int entradamatrizint(int **numbers,int n,int m)
{
 int a,b,i,j,c=0;
for (i = 0; i <n ; i++)for(j=0;j<n;j++){
c++;
numbers[i][j]= c;}
for(i=0;i<n;i++){
    for(j=0;j<n;j++){
        a=rand()%n;b=rand()%n;
        int temp=numbers[i][j];
        numbers[i][j]=numbers[a][b];
        numbers[a][b]=temp;}}}

//arquivo com os escopos. deve ser salvo em arquivo com o nome basico.c e salvo na mesma pasta em que o código acima for salvo.


int entradamatrizint(int **numbers,int n,int m);
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[i]=(int *)calloc(m,sizeof(int));
		if(!matriz[i])

            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[i][j]);
            printf("\n");
        }
        return 0;

}

cá estou eu novamente. desta vez apenas para mostrar uma forma mais eficiente de fazer o mesmo código. trabalhando diretamente com matrizes. o código está bem resumido.

 

A administração já pode fechar.

Link to comment
Share on other sites

16 minutes ago, Suélio said:

cá estou eu novamente. desta vez apenas para mostrar uma forma mais eficiente de fazer o mesmo código. trabalhando diretamente com matrizes. o código está bem resumido..

mais eficiente do que a apresentada por mim ? bold statement

IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

17 minutos atrás, HappyHippyHippo disse:

mais eficiente do que a apresentada por mim ? bold statement

hahaha. I'm sorry se eu pareci asperoso. essa não era a intenção. quando disse mais eficiente, referi-me ao primeiro método usado por mim, que deu início a este tópico.

Edited by Suélio
Link to comment
Share on other sites

olha que fiz o código ainda para perceberes como entra o fisher-yates no código, porque senão ainda tirava o array numbers e fazia directamente na matrix e ficavas a ver navios ...

para a próxima levas com algo deste género

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

#define intMatrixCell(m, o, l, c) ((int *) (((size_t) m) + (o) * (l) * sizeof(int) + (c) * sizeof(int)))
#define xorswap(x, y) (* (x) ^= * (y), * (y) ^= * (x), * (x) ^= * (y))

int main(int argc, char ** argv) {
    int n = 0, total = 0;
    do {
        printf("Insira a ordem da matriz quadrada : "); fflush(stdout);
        if (scanf("%d", &n) && n <= 0)
            printf("Ordem da matriz escolhida invalida\n");
    } while (n <= 0);
    total = n * n;

    int * matrix = malloc(sizeof(int) * total);
    if (! matrix) {
        fprintf(stderr, "Erro na alocacao de memoria para a matriz\n");
        return -1;
    }

    for (int i = 0; i < total; ++i)
        matrix[i] = i;

    srand(time(NULL));
    for (int i = 0; i < total; ++i) {
        int selected = (rand() % (total - i)) + i;
        if (selected != i)
            xorswap(& matrix[selected], & matrix[i]);
    }

    for (int c = 0; c < n; ++c) {
        for (int l = 0; l < n; ++l)
            printf("%3d ", * intMatrixCell(matrix, n, l, c));
        printf("\n");
    }

    free(matrix);

    return 0;
}
IRC : sim, é algo que ainda existe >> #p@p
Link to comment
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.