Suélio Posted February 14, 2017 at 04:59 PM Report Share #602494 Posted February 14, 2017 at 04:59 PM 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 More sharing options...
HappyHippyHippo Posted February 14, 2017 at 05:18 PM Report Share #602496 Posted February 14, 2017 at 05:18 PM fisher-yates IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
Suélio Posted February 14, 2017 at 08:56 PM Author Report Share #602498 Posted February 14, 2017 at 08:56 PM 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 More sharing options...
Solution HappyHippyHippo Posted February 15, 2017 at 12:29 AM Solution Report Share #602503 Posted February 15, 2017 at 12:29 AM 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 Portugol Plus Link to comment Share on other sites More sharing options...
Suélio Posted February 15, 2017 at 04:01 PM Author Report Share #602517 Posted February 15, 2017 at 04:01 PM 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 More sharing options...
HappyHippyHippo Posted February 15, 2017 at 04:20 PM Report Share #602518 Posted February 15, 2017 at 04:20 PM 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 Portugol Plus Link to comment Share on other sites More sharing options...
Suélio Posted February 15, 2017 at 04:37 PM Author Report Share #602520 Posted February 15, 2017 at 04:37 PM (edited) 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 February 15, 2017 at 04:38 PM by Suélio Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted February 15, 2017 at 04:44 PM Report Share #602521 Posted February 15, 2017 at 04:44 PM 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 Portugol Plus Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now