Autor
|
Tema: Problema con cuadrado mágico [RESUELTO] (Leído 12,857 veces)
|
bigfu
|
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... #include <iostream> using namespace std; const unsigned N = 5; typedef unsigned Cuadrado[N][N]; void introDatos(Cuadrado& c); bool es_magica(const Cuadrado& c); unsigned resultado(const Cuadrado& c); bool filas(const Cuadrado& c, unsigned res); bool columnas(const Cuadrado& c, unsigned res); bool d1(const Cuadrado& c, unsigned res); bool d2(const Cuadrado& c, unsigned res); int main() { Cuadrado c; introDatos(c); if(es_magica(c)){ cout << "El cuadrado es magico" << endl; }else{ cout << "No es un cuadrado magico" << endl; } return 0; } void introDatos(Cuadrado& c){ cout << "Introduzca numeros entre 1 y 25 sin repetir ninguno: " << endl; for(unsigned i=0;i<N;i++){ for(unsigned j=0;j<N;j++){ cout << "c(" << i+1 << "," << j+1 << "): "; cin >> c[i][j]; } } } bool es_magica(const Cuadrado& c){ unsigned res = resultado(c); if((!filas(c,res))||(!columnas(c,res))||(!d1(c,res))||(!d2(c,res))){ return false; }else{ return true; } } unsigned resultado(const Cuadrado& c){ unsigned res = 0; for(unsigned j=0;j<N;j++){ res+=c[0][j]; } return res; } bool filas(const Cuadrado& c, unsigned res){ bool igual = true; unsigned suma = 0; for(unsigned i=0;i<N;i++){ suma = 0; for(unsigned j=0;j<N;j++){ suma+=c[i][j]; } if(suma!=res){ igual = false; break; } } return igual; } bool columnas(const Cuadrado& c, unsigned res){ bool igual = true; unsigned suma = 0; for(unsigned i=0;i<N;i++){ suma = 0; for(unsigned j=0;j<N;j++){ suma+=c[j][i]; } if(suma!=res){ igual = false; break; } } return igual; } bool d1(const Cuadrado& c, unsigned res){ bool igual = true; unsigned suma = 0, i=0, j=0; while((i<N)&&(j<N)){ suma+=c[i][j]; i++; j++; } if(suma!=res){ igual = false; } return igual; } bool d2(const Cuadrado& c, unsigned res){ bool igual = true; unsigned suma = 0, i=N-1, j=N-1; while((i>=0)&&(j>=0)){ suma+=c[i][j]; i--; j--; } if(suma!=res){ igual = false; } return igual; }
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
Mensajes: 3
|
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
Mensajes: 646
Divide y vencerás
|
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
Mensajes: 3.158
I'Love...!¡.
|
. 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
Mensajes: 3
|
ahhh ok gracias por corregirme eso no lo sabia.
|
|
|
En línea
|
|
|
|
bigfu
|
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
Mensajes: 646
Divide y vencerás
|
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
Mensajes: 1
|
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
|
|
|
|
|
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
|
13 Noviembre 2011, 00:15 am
por david_quiroz19
|
|
|
Aporte: Cuadrado Mágico de orden impar
Programación C/C++
|
dato000
|
2
|
12,392
|
22 Agosto 2019, 08:01 am
por TheSj
|
|
|
Cuadrado Mágico
Programación C/C++
|
Black Lotus
|
5
|
4,919
|
15 Marzo 2013, 20:58 pm
por Black Lotus
|
|
|
Cuadrado Mágico
Programación C/C++
|
anaaaaaaa
|
3
|
7,219
|
7 Diciembre 2015, 16:37 pm
por ivancea96
|
|
|
cuadrado magico
Dudas Generales
|
manno
|
1
|
2,019
|
5 Julio 2020, 02:15 am
por tincopasan
|
|