-
Posts
8 -
Cadastrado em
-
Última visita
Reputação
9-
DaviFonsecx alterou sua foto pessoal
-
C Erro de resultados em um Quadrado Magico
DaviFonsecx respondeu ao tópico de DaviFonsecx em C/C#/C++
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. -
DaviFonsecx começou a seguir arfneto
-
C Erro de resultados em um Quadrado Magico
DaviFonsecx respondeu ao tópico de DaviFonsecx em C/C#/C++
#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... -
C Erro de resultados em um Quadrado Magico
DaviFonsecx respondeu ao tópico de DaviFonsecx em C/C#/C++
@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. -
C Erro de resultados em um Quadrado Magico
DaviFonsecx respondeu ao tópico de DaviFonsecx em C/C#/C++
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. -
C Erro de resultados em um Quadrado Magico
DaviFonsecx respondeu ao tópico de DaviFonsecx em C/C#/C++
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? -
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.
-
C Erro de Compilação - Visual Studio Code
DaviFonsecx respondeu ao tópico de DaviFonsecx em C/C#/C++
@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... -
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