Problema con cuadrado mágico [RESUELTO]

Iniciado por bigfu, 22 Agosto 2011, 18:41 PM

0 Miembros y 1 Visitante están viendo este tema.

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

Código (cpp) [Seleccionar]
#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!!

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

Lev3rag3

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.


Valkyr

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.

BlackZeroX

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

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

Dulces Lunas!¡.
The Dark Shadow is my passion.

Lev3rag3

ahhh ok gracias por corregirme eso no lo sabia.

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!
A reader lives a thousand lives before he dies. The man who never reads lives only one

Valkyr

Descuidos de ese tipo tenemos todos!! jeje.

Un saludo.

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

Dayciber

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