Ir ao conteúdo

DaviFonsecx

Membro Júnior
  • Posts

    8
  • Cadastrado em

  • Última visita

Reputação

9
  1. Como eu usaria os números de 1 a n*n? Poderia gerar uma lista de numeros de 1 a n², e organizar sistematicamente para que retorne uma matriz magica, seria isso? Li sim, mas fiquei meio perdido, faria um struct? E em seguida uma função? Consegui entender que não é viavel usar tentativa e erro, mas uma ordem tem mais de uma combinação possível pra a soma ser magica, certo? Mesmo que eu organize os numeros de maneira sistematica, talvez vai me retornar sempre a mesma matriz. Pensei que poderia fazer algo mais dinamico.
  2. #include <stdio.h> #include <stdlib.h> #include <time.h> #include <string.h> #include <stdbool.h> void gerar_num (int tamanho, int lista[]){ for (int i = 0; i < (tamanho * tamanho); i++){ lista[i] = i + 1; } } void tamanho_impar (int **matriz, int tamanho, int lista[]){ //algoritmo de siamese int num = 1; int linha = 0, coluna = tamanho / 2; for (int i = 0; i < tamanho; i++){ for (int j = 0; j < tamanho; j++){ matriz[i][j] = 0; } } while (num <= tamanho * tamanho){ matriz[linha][coluna] = lista[num-1]; num++; linha--; coluna++; if (num % tamanho == 1) { linha += 2; --coluna; } else{ if (coluna == tamanho) coluna -= tamanho; else if (linha < 0) linha += tamanho; } } } void tamanho_quadrado (int **matriz, int **matriz_inversa, int tamanho, int lista[]){// duplo quadrado int num = 1; for (int i = 0; i < (tamanho * tamanho); i++){ lista[i] = i + 1; } if (tamanho %4 == 0){ for (int i = 0; i < tamanho; i++){ for (int j = 0; j < tamanho; j++){ matriz[i][j] = lista[i * tamanho + j]; matriz_inversa[i][j] = lista[tamanho * tamanho - num]; num++; } } for (int g = 0; g < tamanho; g += 4){ for (int h = 0; h < tamanho; h += 4){ for (int i = 0; i < 4; i++){ for (int j = 0; j < 4; j++){ if (i == j || (i+j) == 3){ matriz[g+i][h+j] = 0; } if (!(i == j || (i + j) == 3)) { matriz_inversa[g + i][h + j] = 0; } } } } } for (int g = 0; g < tamanho; g += 4){ for(int h = 0; h < tamanho; h += 4){ for (int i = 0; i < 4; i++){ for (int j = 0; j < 4; j++){ if (matriz_inversa[g+i][h+j] != 0){ matriz[g+i][h+j] = matriz_inversa[g+i][h+j]; } } } } } } } void tamanho_naoquadrado (int **matriz, int tamanho, int lista[]){//metodo LUX for (int i = 0; i < tamanho; i++){ for (int j = 0; j < tamanho; j++){ matriz[i][j] = 0; } } int num = 1; int central = tamanho / 2; for (int i = 0; i < central; i++){ for (int j = 0; j < central; j++){ matriz[i][j] = num; matriz[i+central][j+central] = num + central * central; matriz[i][j + central] = num + 2 * central * central; matriz[i + central][j] = num + 3 * central * central; num++; } } for (int i = 0; i < central; i++){ for (int j = 0; j < tamanho / 4; j++){ int aux = matriz[i][j]; matriz[i][j] = matriz[i+central][j]; matriz[i+central][j] = aux; } } for (int i = 0; i < central; i++){ for (int j = tamanho - 1; j >= tamanho - tamanho / 4 +1; j--){ int aux = matriz[i][j]; matriz[i][j] = matriz[i+central][j]; matriz[i+central][j] = aux; } } if (tamanho > 4){ for (int i = 0; i < central / 2; i++) { int aux = matriz[i][central / 2]; matriz[i][central / 2] = matriz[i + central][central / 2]; matriz[i + central][central / 2] = aux; } } } void somaLinhasColunas (int **matriz, int tamanho, int *somaLinhas, int *somaColunas){ for (int i = 0; i < tamanho; i++){ somaLinhas[i] = 0; somaColunas[i] = 0; } for (int i = 0; i < tamanho; i++){ for (int j = 0; j < tamanho; j++){ somaLinhas[i] += matriz[i][j]; somaColunas[j] += matriz[i][j]; } } } void somaDiagonais(int **matriz, int tamanho, int *DiagonalPrincipal, int *DiagonalSecundaria){ *DiagonalPrincipal = 0; *DiagonalSecundaria = 0; for (int i = 0; i < tamanho; i++){ *DiagonalPrincipal += matriz[i][i]; *DiagonalSecundaria += matriz[i][tamanho - 1 - i]; } } bool quadrado_magico(int tamanho, int *somaLinhas, int *somaColunas, int DiagonalPrincipal, int DiagonalSecundaria){ int soma_esperada = tamanho * (tamanho * tamanho + 1)/2; bool eh_quadrado = true; for (int i = 0; i < tamanho; i++){ if (somaLinhas[i] != soma_esperada || somaColunas[i] != soma_esperada){ eh_quadrado = false; break; } } if(DiagonalPrincipal != soma_esperada || DiagonalSecundaria != soma_esperada){ eh_quadrado = false; } return eh_quadrado; } void imprimir(int **matriz, int tamanho, int *somaLinhas, int *somaColunas, int DiagonalPrincipal, int DiagonalSecundaria){ char escolha[4]; for (int i = 0; i < tamanho; i++){ for (int j = 0; j < tamanho; j++){ printf("%3d ", matriz[i][j]); } printf("\n"); } printf("\n"); for (int i = 0; i < tamanho; i++) { printf("Soma da %dª Linhas: %d \n",i+1, somaLinhas[i]); } printf("\n"); for (int i = 0; i < tamanho; i++) { printf("Soma da %dª Coluna: %d\n",i+1, somaColunas[i]); } printf("\nSoma da Diagonal Principal: %d\n", DiagonalPrincipal); printf("Soma da Diagonal Secundária: %d\n", DiagonalSecundaria); } int main() { srand(time(0)); int tamanho = 8; int linhas = tamanho, colunas = tamanho; int *somaColunas, *somaLinhas; int DiagonalPrincipal, DiagonalSecundaria; int lista[tamanho * tamanho]; bool verificar; char escolha[4]; //alocação de memória para matriz int **matriz = (int**) malloc (linhas * sizeof(int *)); for (int i = 0; i < linhas; i ++){ matriz[i] = (int*) malloc (colunas * sizeof (int)); } int **matriz_inversa = (int**) malloc (linhas * sizeof(int *)); for(int i = 0; i < linhas; i++){ matriz_inversa[i] = (int*) malloc (colunas * sizeof(int)); } //Demais alocações de memória somaLinhas = (int* ) malloc (tamanho * sizeof (int)); somaColunas = (int* ) malloc (tamanho * sizeof (int)); //Função para gerar gerar_num(tamanho, lista); //Funções para preencher a matriz de acordo com seu tipo if (tamanho %2 != 0) tamanho_impar(matriz, tamanho, lista); else if (tamanho % 4 == 0) tamanho_quadrado(matriz, matriz_inversa, tamanho, lista); else{ tamanho_naoquadrado(matriz, tamanho, lista); } //Funções de soma somaLinhasColunas(matriz, tamanho, somaLinhas, somaColunas); somaDiagonais (matriz, tamanho, &DiagonalPrincipal, &DiagonalSecundaria); //verificar quadrado quadrado_magico verificar = quadrado_magico(tamanho, somaLinhas, somaColunas, DiagonalPrincipal, DiagonalSecundaria); //Funçao pra impressao if (verificar) imprimir(matriz, tamanho, somaLinhas, somaColunas, DiagonalPrincipal, DiagonalSecundaria); else printf("Não foi possível gerar um quadrado_magico."); //liberar as memórias alocadas for (int i = 0; i < linhas; i++){ free(matriz[i]); } free(matriz); for (int i = 0; i < linhas; i++){ free(matriz_inversa[i]); } free(matriz_inversa); free(somaLinhas); free(somaColunas); return 0; } @arfneto Sobre o #include, foi uma falta de atenção ao copiar o código pra cá, desculpe. Poderia me explicar por que usar srand se torna um problema? Acontece que eu sou "iniciante", finalizei meu primeiro periodo em SI, por agora. Esse programa é uma atividade opcional que foi passada, e eu quis tentar fazer. Você fala sobre usar diretamente a constante no código? Sem pedir ao usuario para inserir algo? Achei que void fosse mais ''simples'' por não retornar algo diretamente, e sim só realizar o procedimento. Acabei dando uma pesquisada sobre quadrados mágicos, e refiz o codigo acima, um pouco diferente. No final ainda tenho problemas com ordens pares. Optei por usar o Método Siameses para numeros impares, e o metodo do quadrado duplo para numeros multiplos de 4. Porém ordem par que não é multipla de 4, não consegui chegar em um resultado. Você disse sobre usar um parametro só, no caso eu faria todas as interações direto em uma função só? Vou deixar o codigo mais recente aqui, (provavelmente ainda contem erros) se você tiver um tempo e puder ir orientando sobre como melhorar...
  3. @kgin Por coincidência, eu acabei pesquisando sobre os métodos dos números pares, mas ainda não consegui implementar no código. O único que eu consegui implementar foi o método de siamese, que funciona para numeros impares. Mas estou tento bastante dificuldade com números pares.
  4. Entendi, você tem alguma ideia de como organizar? Pensei em fixar um valor, e ir trocando as posições do restante. Ex.: 1(1 linha e 1 coluna) e embaralhar os outros numeros. Se não encontrar, fixar o 2 e embaralhar, tipo isso.
  5. O que eu quis dizer sobre os operadores && e ||, foi que quando é utilizado &&(and) o codigo faz a impressão de uma combinação de numeros que não retorna a condição estabelecida. Agora quando uutilizo o || ele parece entrar em "loop", já que nada é impresso, e o codigo não para de rodar. Você poderia me dizer porque somente embaralhando os numeros, não seria possível achar uma matriz quadrado magico maior do que 3?
  6. Estou com uma atividade, que pede que desenvolva um código que me retorne um quadrado mágico. Um quadrado mágico é uma matriz quadrática (2x2,3x3) em que as somas de cada uma das suas linhas, colunas e diagonais, resultem no mesmo valor. Nesse código, eu gero uma lista de números até o tam² da matriz, e em seguida eu embaralho ela, porque os números não podem se repetir. Porém só funciona com uma matriz 3x3, quando eu tento com uma matriz maior, 4x4, 5x5 e afins, o código faz a impressão de números aleatórios. Não sei mais onde eu possa estar errando. Se alguém puder me explicar mais sobre. Segue meu código: #include <stdlib.h> #include <time.h> #include <string.h> void quadrado_magico(int **matriz, int linhas, int colunas,int valor_maximo, int numeros[], int *somalinhas, int *somacolunas, int *somadiagonalPrincipal, int *somadiagonalSecundaria){ int soma_numeros, soma_esperada; int eh_quadrado = 0; //valor boleano = 1 pra true e 0 para false int tentativas = 0; while (eh_quadrado != 1 && tentativas < 5000){ //Gerar uma lista de numeros de n ate n soma_numeros = 0; for (int i = 0; i < valor_maximo; i++){ numeros[i] = i + 1; soma_numeros += numeros[i]; } soma_esperada = soma_numeros / linhas; //Embaralhar os numeros de forma aleatoria for (int i = valor_maximo - 1; i > 0; i--){ int j = rand()%(valor_maximo); int aux = numeros[i]; numeros[i] = numeros[j]; numeros[j] = aux; } for (int i = 0; i < linhas; i++){ for (int j = 0; j < colunas; j++){ matriz[i][j] = numeros[i * linhas + j]; } } //inicializar com 0 for (int i = 0; i < linhas; i++){ somalinhas[i] = 0; somacolunas[i] = 0; } //soma linhas e colunas for (int i = 0; i < linhas; i++){ for (int j = 0; j < colunas;j++){ somalinhas[i] += matriz[i][j]; somacolunas[j] += matriz[i][j]; } } *somadiagonalPrincipal = 0; *somadiagonalSecundaria = 0; //somas das diagonais for(int i = 0; i < linhas; i++){ *somadiagonalPrincipal += matriz[i][i]; *somadiagonalSecundaria += matriz[i][linhas - 1 - i]; } //assumimos que e um quadrado magico eh_quadrado = 1; for (int i = 0; i < linhas; i++){ for (int j = 0; j < colunas; j++){ if (somalinhas[i] != soma_esperada || somacolunas[i] != soma_esperada || *somadiagonalPrincipal != soma_esperada || *somadiagonalSecundaria != soma_esperada){ eh_quadrado = 0; break; } } } tentativas++; } } void impressao (int **matriz, int linhas, int colunas, int numeros[], int *somalinhas, int *somacolunas, int *somadiagonalPrincipal, int *somadiagonalSecundaria){ char choice_soma[4], choice_array[4]; printf("Você deseja ver a matriz resultante?(Sim/Não)\n"); scanf("%s", choice_array); if (strcmp(choice_array, "Sim") == 0 || strcmp(choice_array, "sim") == 0){ printf("["); for (int i = 0; i < linhas; i++){ for (int j = 0; j < colunas; j++){ printf("%2d", matriz[i][j]); } if (i < linhas - 1){ printf("\n"); } } printf("]\n"); } printf("\nVocê deseja ver o resultado das somas?(Sim/Não)\n"); scanf("%s", choice_soma); if (strcmp(choice_soma, "Sim") == 0 || strcmp(choice_soma, "sim") == 0){ for (int i = 0; i < linhas; i++) { printf("A soma da %dº Linha e: %d\n", i+1, somalinhas[i]); } printf("\n"); for (int j = 0; j < colunas; j++) { printf("A soma da %dº Coluna e: %d\n", j+1, somacolunas[j]); } printf("\n\n"); printf("Diagonal Principal: %d\n", *somadiagonalPrincipal); printf("Diagonal Secundaria: %d", *somadiagonalSecundaria); } } int main(){ srand(time(0));// Sempre gerar outro numero printf("Instruções: "); printf("Um quadrado magico, é uma matriz de tamanhos iguais,(o mesmo numero" "de linhas e colunas) em que a soma de suas linhas, colunas e diagonais sejam iguais."); printf(" Esse codigo vai gerar uma matriz de tamanho inserida pelo usuario, onde os numeros não" "não se repetem, e que seja um quadrado magico."); printf("\nVamos lá...\n\n"); int tamanho; printf("Insira o tamanho da matriz quadrada: "); scanf("%d", &tamanho); int valor_maximo = (tamanho * tamanho); int numeros[valor_maximo]; int linhas = tamanho, colunas = tamanho; int **matriz = (int **) malloc(linhas * sizeof(int *)); for (int i = 0; i < linhas; i++){ matriz[i] = (int *) malloc (colunas * sizeof(int )); } int *somal = (int *) malloc (tamanho * sizeof(int)); int *somac = (int *) malloc (tamanho * sizeof(int)); int *somaDP = (int *) malloc (tamanho * sizeof(int)); int *somaSC = (int *) malloc (tamanho * sizeof(int)); quadrado_magico(matriz, linhas, colunas,valor_maximo, numeros, somal, somac, somaDP, somaSC); impressao(matriz, linhas, colunas, numeros, somal, somac, somaDP, somaSC); for (int i = 0; i < linhas; i++){ free(matriz[i]); } free(matriz); free(somal); free(somac); free(somaDP); free(somaSC); return 0; } Obs: Se eu trocar a condição do while de && para || os resultados também são modificados.
  7. @devair1010 Essa parte do inidcador de linguagem eu sabia, o nome esta como L3Ex19a.c, no VS, e Tripla de Pitagoras no CodeBlocks Copiei o seu código, e no meu compilador ainda não exibe os resultados corretos. É alguma configuração? Não entendo tanto sobre, sou iniciante, e essa é uma das atividades da faculdade. Por algum motivo os resultados retornos são esses, se eu rodar esse mesmo codigo no online gdb, ele me retorna os mesmos resultados que o seu...
  8. Escrevi um codigo pra uma atividade, que necessita de verificar os numeros de 1 a 500, que se encaixam na tripla de pitagoras (A soma dos catetos quadrados deve ser igual a hipotenusa ao quadrado). Mas o VisualStudio Code não compila os numeros que se encaixam, e eu não consigui resolver, tentei rodar pelo codeblocks, mas o resultado foi o mesmo, não sei se pode ser o codigo. Vou deixar o codigo aqui. Se alguém souber o que pode ser #include <stdio.h> #include <math.h> #include <stdlib.h> #include <locale.h> int main() { int lado1; int lado2; int hipotenusa; int soma_catetos; setlocale(LC_ALL, "portuguese"); for (lado1 = 1; lado1 <= 500; lado1++) { for (lado2 = 1; lado2 <= 500; lado2++) { for (hipotenusa = 1; hipotenusa <= 500; hipotenusa++) { soma_catetos = pow(lado1, 2) + pow(lado2, 2); if (soma_catetos == pow(hipotenusa, 2)) { printf("%d² + %d² = %d²\n", lado1, lado2, hipotenusa); } } } } return 0; } ```

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