elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Rompecabezas de Bitcoin, Medio millón USD en premios


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Problema con cuadrado mágico [RESUELTO]
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Problema con cuadrado mágico [RESUELTO]  (Leído 12,857 veces)
bigfu

Desconectado Desconectado

Mensajes: 49



Ver Perfil WWW
Problema con cuadrado mágico [RESUELTO]
« en: 22 Agosto 2011, 18:41 pm »

Hola, tengo el siguiente enunciado:
Un cuadrado mágico de orden n es una ordenación de los números 1 a n en una tabla cuadrada de manera que la suma de cada fila y cada columna y las dos diagonales principales es la misma. La figura muestra un cuadrado mágico de orden 5 en el que todas las filas, columnas y las dos diagonales suman 65.

He hecho este código y al ejecutarlo introduzco la matriz tal y como está en el ejemplo (es un cuadrado magico) y nunca termina, se queda ejecutándose y nunca muestra el resultado. He estado buscando una y otra vez el fallo y no he conseguido dar con él, a ver si podéis echarme una mano...

Código
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. const unsigned N = 5;
  5. typedef unsigned Cuadrado[N][N];
  6.  
  7. void introDatos(Cuadrado& c);
  8. bool es_magica(const Cuadrado& c);
  9. unsigned resultado(const Cuadrado& c);
  10. bool filas(const Cuadrado& c, unsigned res);
  11. bool columnas(const Cuadrado& c, unsigned res);
  12. bool d1(const Cuadrado& c, unsigned res);
  13. bool d2(const Cuadrado& c, unsigned res);
  14.  
  15.  
  16. int main() {
  17. Cuadrado c;
  18.  
  19. introDatos(c);
  20. if(es_magica(c)){
  21. cout << "El cuadrado es magico" << endl;
  22. }else{
  23. cout << "No es un cuadrado magico" << endl;
  24. }
  25.  
  26. return 0;
  27. }
  28.  
  29. void introDatos(Cuadrado& c){
  30. cout << "Introduzca numeros entre 1 y 25 sin repetir ninguno: " << endl;
  31. for(unsigned i=0;i<N;i++){
  32. for(unsigned j=0;j<N;j++){
  33. cout << "c(" << i+1 << "," << j+1 << "): ";
  34. cin >> c[i][j];
  35. }
  36. }
  37. }
  38.  
  39. bool es_magica(const Cuadrado& c){
  40. unsigned res = resultado(c);
  41.  
  42. if((!filas(c,res))||(!columnas(c,res))||(!d1(c,res))||(!d2(c,res))){
  43. return false;
  44. }else{
  45. return true;
  46. }
  47. }
  48.  
  49. unsigned resultado(const Cuadrado& c){
  50. unsigned res = 0;
  51. for(unsigned j=0;j<N;j++){
  52. res+=c[0][j];
  53. }
  54. return res;
  55. }
  56.  
  57. bool filas(const Cuadrado& c, unsigned res){
  58. bool igual = true;
  59. unsigned suma = 0;
  60.  
  61. for(unsigned i=0;i<N;i++){
  62. suma = 0;
  63. for(unsigned j=0;j<N;j++){
  64. suma+=c[i][j];
  65. }
  66. if(suma!=res){
  67. igual = false;
  68. break;
  69. }
  70. }
  71. return igual;
  72. }
  73.  
  74. bool columnas(const Cuadrado& c, unsigned res){
  75. bool igual = true;
  76. unsigned suma = 0;
  77.  
  78. for(unsigned i=0;i<N;i++){
  79. suma = 0;
  80. for(unsigned j=0;j<N;j++){
  81. suma+=c[j][i];
  82. }
  83. if(suma!=res){
  84. igual = false;
  85. break;
  86. }
  87. }
  88. return igual;
  89. }
  90.  
  91. bool d1(const Cuadrado& c, unsigned res){
  92. bool igual = true;
  93. unsigned suma = 0, i=0, j=0;
  94.  
  95. while((i<N)&&(j<N)){
  96. suma+=c[i][j];
  97. i++;
  98. j++;
  99. }
  100. if(suma!=res){
  101. igual = false;
  102. }
  103. return igual;
  104. }
  105.  
  106. bool d2(const Cuadrado& c, unsigned res){
  107. bool igual = true;
  108. unsigned suma = 0, i=N-1, j=N-1;
  109.  
  110. while((i>=0)&&(j>=0)){
  111. suma+=c[i][j];
  112. i--;
  113. j--;
  114. }
  115. if(suma!=res){
  116. igual = false;
  117. }
  118. return igual;
  119. }

Muchas gracias!!



« Última modificación: 22 Agosto 2011, 21:31 pm por bigfu » En línea

A reader lives a thousand lives before he dies. The man who never reads lives only one
Lev3rag3

Desconectado Desconectado

Mensajes: 3



Ver Perfil
Re: Problema con cuadrado mágico
« Respuesta #1 en: 22 Agosto 2011, 18:57 pm »

Bueno amigo no se mucho sobre este tema pero tienes algunos errores al declarar  algunos datos

por ejemplo en el nuevo tipo typedef unsigned Cuadrado[N][N]  tienes que decir de que tipo es, si es tipo int,char,float,etc.
ejemplo:

typedef unsigned int Cuadrado[N][N]

el  unsigned no tienes que colocarlo solo cuando quieras declarar algo,
acuerdate que ese es un modificador de los tipos.
ejemplo:

 unsigned int/float/double/char <aqui el identificador>.

bueno como te dije no se mucho sobre esto asi que si me equivoco que alguien me corrija por favor.



En línea

Valkyr


Desconectado Desconectado

Mensajes: 646


Divide y vencerás


Ver Perfil
Re: Problema con cuadrado mágico
« Respuesta #2 en: 22 Agosto 2011, 19:25 pm »

El problema está en la declaración de las variables i, j del método d2 como unsigned, ya que la terminación del bucle es while(i>=0 && j>=0) en algún momento deben ser negativos, pero al declararlos como unsigned, da valores extraños. Cambia esa declaración y funciona, lo he probado yo mismo.

Saludos.
En línea

BlackZeroX
Wiki

Desconectado Desconectado

Mensajes: 3.158


I'Love...!¡.


Ver Perfil WWW
Re: Problema con cuadrado mágico
« Respuesta #3 en: 22 Agosto 2011, 19:40 pm »

.
Los modificadores por si solos modifican a int, tengo entendido.

signed = signed int
unsigned = unsigned int
long = long int
short = short int

Dulces Lunas!¡.
En línea

The Dark Shadow is my passion.
Lev3rag3

Desconectado Desconectado

Mensajes: 3



Ver Perfil
Re: Problema con cuadrado mágico
« Respuesta #4 en: 22 Agosto 2011, 19:57 pm »

ahhh ok gracias por corregirme eso no lo sabia.
En línea

bigfu

Desconectado Desconectado

Mensajes: 49



Ver Perfil WWW
Re: Problema con cuadrado mágico
« Respuesta #5 en: 22 Agosto 2011, 20:33 pm »

Muchas gracias a todos por las respuestas.
Tienes razón Valkyr, se me ha pasado ese detalle. La cosa es que no es la primera vez que me pasa, tengo que meterme en la cabeza que para ese caso en concreto he de declarar las variables de tipo entero.

Muchas gracias a todos!
En línea

A reader lives a thousand lives before he dies. The man who never reads lives only one
Valkyr


Desconectado Desconectado

Mensajes: 646


Divide y vencerás


Ver Perfil
Re: Problema con cuadrado mágico
« Respuesta #6 en: 22 Agosto 2011, 21:10 pm »

Descuidos de ese tipo tenemos todos!! jeje.

Un saludo.

Por cierto podrías cambiar el asunto del tema a RESUELTO
En línea

Dayciber

Desconectado Desconectado

Mensajes: 1


Ver Perfil
Re: Problema con cuadrado mágico [RESUELTO]
« Respuesta #7 en: 14 Enero 2016, 02:11 am »

muchachos
que me dicen de este problema;encontrar la forma mas optima de hacer la tabla magica

La tabla que a continuación te presentamos contiene, en un orden determinado, los números del  1 al 31 y tiene la propiedad “mágica” de que con solo indicar las columnas en que se encuentra un número pensado es posible “adivinar” cual es dicho número, por ejemplo, si se da como información que el número pensado está solo en las columnas 1 y 4, rápidamente puede concluirse que es el 9.

Note: que el número a que nos referimos se encuentra en la 1ra y 4ta columna de la tabla (cada columna de la tabla esta representada en un arreglo).

5      4      3      2      1

16      8      4      2      1
17      9      5      3      3
18      10      6      6      5
19      11      7      7      7
20      12      12      10      9
21      13      13      11      11
22      14      14      14      13
23      15      15      15      15
24      24      20      18      17
25      25      21      19      19
26      26      22      22      21
27      27      23      23      23
28      28      28      26      25
29      29      29      27      27
30      30      30      30      29
31      31      31      31      31

Elabore un programa orientado a objeto que permita:

1-   Generar en pantalla la tabla anterior. Observe que decimos generar y no copiar.
2-   Una persona tiene tres intentos para pensar un número e informe a la máquina las columnas en que se encuentra y esta “adivine” el número pensado. Es necesario tener en cuenta que entre cada intento se deben variar de posición las columnas. Ejemplo: Intento 1:(C1 C2 C3 C4 C5), Intento 2:(C3 C5 C1 C4 C2) e Intento 3:(C5 C4 C1 C2 C3).

Elabore una aplicación con interfaz de consola que permita darle solución al problema anterior, la misma debe contar con un menú que permita entrar los datos y procesar toda la información, obteniéndose los resultados por la pantalla. Para apoyar estas actividades se le brinda la siguiente clase TablaMagica.





TablaMagica
- columna1: int[ ]
- columna2: int[ ]
- columna3: int[ ]
- columna4: int[ ]
- columna5: int[ ]    
+ TablaMagica( columna1: int[ ], columna2: int[ ], columna3: int[ ], columna4: int[ ], columna5: int[ ]  )   
+ RetornarColumna(numeroCol: int): int[ ]   Retorna el arreglo que corresponde a la columna pasada por parámetro

 
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Programa en C sharp que genera un cuadrado magico , suma sus filas y columnas
.NET (C#, VB.NET, ASP)
david_quiroz19 0 9,432 Último mensaje 13 Noviembre 2011, 00:15 am
por david_quiroz19
Aporte: Cuadrado Mágico de orden impar
Programación C/C++
dato000 2 12,392 Último mensaje 22 Agosto 2019, 08:01 am
por TheSj
Cuadrado Mágico
Programación C/C++
Black Lotus 5 4,919 Último mensaje 15 Marzo 2013, 20:58 pm
por Black Lotus
Cuadrado Mágico
Programación C/C++
anaaaaaaa 3 7,219 Último mensaje 7 Diciembre 2015, 16:37 pm
por ivancea96
cuadrado magico
Dudas Generales
manno 1 2,019 Último mensaje 5 Julio 2020, 02:15 am
por tincopasan
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines