Ver las NORMAS de estos Foros Web ZackYFileS Chat ZackYFileS Agregar a Favoritos Contactar con Administrador
 
 

TU PUBLICIDAD AQUÍ!!
Navegación
Retroceder   Foros ZackYFileS >
OTROS TEMAS DE INTERES - INTERNET:
> PROGRAMACIÓN Lenguajes: Visual Basic, C++, etc
Nombre de usuario
Contraseña
Configuración de UsuarioAyuda (FAQs)Nuevos PostsBuscar


Respuesta
 
Herramientas
Antiguo 31/10/2009, 13:31   #1
antoniogas 
Usuario PREMIUM+
 
Avatar de antoniogas
 
Fecha de ingreso: 28/ene/2004
Mensajes: 590
antoniogas es realmente agradableantoniogas es realmente agradableantoniogas es realmente agradableantoniogas es realmente agradable
Ayuda con C

Hola,
En clase me han mandado programar un cuadrado mágico en C, el cuadrado mágico deberia de ser de tal forma que vaya en la dirección noroeste y si se "choca" suba y siga dicha dirección, el código que encontré lo hacia de otra manera, pero eso ya lo he solucionado, mi problema es que tiene un define quiero pasarlo a codigo y quitar ese define, pero no se como hacerlo, me gustaria pasarlo como "if...etc"

El cubo mágico deberia ser:

46 15 40 9 34 3 28
21 39 8 33 2 27 45
38 14 32 1 26 44 20
13 31 7 25 43 19 37
30 6 24 49 18 36 12
5 23 48 17 42 11 29
22 47 16 41 10 35 4

Os dejo aquí el código:

[quote]/*Codificacion basada en el algoritmo anterior*/

#include <stdio.h>
#include <conio.h>

/*limitar rango ( limita los valores de x al rango [0, N] )*/
#define lr( x, N )( (x)<0 ? N+(x)%N : ( (x)>=N ? (x)%N : (x) ) )


void main()
{
int cuadrado[7][7],x,y,n,N=7;

printf( "\nCuadrado Magico de orden %ix%i :\n\n", N, N);

/*Se inicia los elementos del cuadrado magico con ceros*/
for(x=0;x<N;x++)
{
for(y=0;y<N;y++)
{
cuadrado[x][y]=0;
}
}
/*Se aplica el algoritmo general para obtener cuadrados magicos de orden impar*/
for( x=N/2,y=2,n=1; n<=N*N; ) /*se hace N*N iteraciones...*/
{
if(!cuadrado[x][y]) /*si el elemento seleccionado es cero*/
{
cuadrado[x][y] = n++; /*se inserta un número natural */
x=lr(x+1,N); /*se incrementa x en 1 */
y=lr(y-1,N); /*se decrementa y en 1 */
}
else
{
x=lr(x-1,N); /*se decrementa x en 1 */
y=lr(y-1,N); /*se incrementa y en 2 */
}

}
/*se imprime el cuadrado magico en pantalla*/
for(x=0;x<N;x++)
{
for(y=0;y<N;y++)
{
printf("\n");
for(x=0;x<N;x++)
{
getch();
printf("%4i",cuadrado[x][y]);
}
}
}
printf("\n\n Suma = %i\n\n",(N*(N*N+1))/2); /*se imprime la suma*/

getch();
}[/quote]

Haber si me podeis ayudar.

Muchas gracias y salu2

Última edición por antoniogas; 31/10/2009 a las 13:34.
antoniogas está desconectado
Respuesta rápida a este mensaje
Responder Citando Subir
Publicidad: Conoce las ofertas de ANUNCIATE
Antiguo 31/10/2009, 14:12   #2
kezuziyo
Zumbao
 
Avatar de kezuziyo
 
Fecha de ingreso: 22/ene/2004
Mensajes: 38.393
kezuziyo Cuando busquemos reputación en Wikipedia, saldrá su avatarkezuziyo Cuando busquemos reputación en Wikipedia, saldrá su avatarkezuziyo Cuando busquemos reputación en Wikipedia, saldrá su avatarkezuziyo Cuando busquemos reputación en Wikipedia, saldrá su avatarkezuziyo Cuando busquemos reputación en Wikipedia, saldrá su avatarkezuziyo Cuando busquemos reputación en Wikipedia, saldrá su avatarkezuziyo Cuando busquemos reputación en Wikipedia, saldrá su avatarkezuziyo Cuando busquemos reputación en Wikipedia, saldrá su avatarkezuziyo Cuando busquemos reputación en Wikipedia, saldrá su avatarkezuziyo Cuando busquemos reputación en Wikipedia, saldrá su avatarkezuziyo Cuando busquemos reputación en Wikipedia, saldrá su avatar
No entiendo muy bién lo que pides, un #define se expande cada vez que aparece en la fase del preprocesador antes de compilar y tiene como finalidad facilitar la comprensión del código repetitivo, podrías convertirlo en función o expandir tu mismo esa definición en todos los sitios que se utiliza.
Ahora bién, si lo que no entiendes es el operador ternario ((expresion) ? (parte verdadera) : (parte falsa)) lo que hace es evaluarse la expresion y devuelve la parte verdadera o la parte false dependiendo de si esa expresion es verdadera o falsa, por ejemplo
x=(a>b)?c:d;
equilvadría a
if (a>b) {
x=c;
} else {
x=d;
}
__________________



>>>FOTO DE LA KEDADA DEL SURESTE 2008<<<
Consejos sobre como navegar por ZackY: Navegando por el foro
>>> [URL="http://www.jezuzillo.es/images/NoToros.htm"]Porque estoy en contra de las corridas de toros y de la existencia de una sección sobre las mismas en este foro[/URL] <<<
>>> [URL="http://foros.zackyfiles.com/showthread.php?t=591397"]Si quieres eliminar la sección taurina de tu navegador, pincha aquí[/URL] <<<

Última edición por kezuziyo; 31/10/2009 a las 14:14.
kezuziyo está desconectado
Respuesta rápida a este mensaje
Responder Citando Subir
Antiguo 31/10/2009, 14:31   #3
antoniogas 
Usuario PREMIUM+
 
Avatar de antoniogas
 
Fecha de ingreso: 28/ene/2004
Mensajes: 590
antoniogas es realmente agradableantoniogas es realmente agradableantoniogas es realmente agradableantoniogas es realmente agradable
[QUOTE=kezuziyo;3902867]No entiendo muy bién lo que pides, un #define se expande cada vez que aparece en la fase del preprocesador antes de compilar y tiene como finalidad facilitar la comprensión del código repetitivo, podrías convertirlo en función o expandir tu mismo esa definición en todos los sitios que se utiliza.
Ahora bién, si lo que no entiendes es el operador ternario ((expresion) ? (parte verdadera) : (parte falsa)) lo que hace es evaluarse la expresion y devuelve la parte verdadera o la parte false dependiendo de si esa expresion es verdadera o falsa, por ejemplo
x=(a>b)?c:d;
equilvadría a
if (a>b) {
x=c;
} else {
x=d;
}[/QUOTE]

Lo que hace el define lo entiendo,pero quiero quitar el define y poner la expresion en los sitios donde sea necesario y esto es lo que no se hacer.
El codigo del define seria:
If(x<0)
X=7+x%7;
Else
{
If(x>=7)
X=x%7
Else
X=x
}
Seria correcto? Pero no se donde ponerlo.

Salu2

Última edición por antoniogas; 31/10/2009 a las 14:37.
antoniogas está desconectado
Respuesta rápida a este mensaje
Responder Citando Subir
Antiguo 31/10/2009, 15:53   #4
kezuziyo
Zumbao
 
Avatar de kezuziyo
 
Fecha de ingreso: 22/ene/2004
Mensajes: 38.393
kezuziyo Cuando busquemos reputación en Wikipedia, saldrá su avatarkezuziyo Cuando busquemos reputación en Wikipedia, saldrá su avatarkezuziyo Cuando busquemos reputación en Wikipedia, saldrá su avatarkezuziyo Cuando busquemos reputación en Wikipedia, saldrá su avatarkezuziyo Cuando busquemos reputación en Wikipedia, saldrá su avatarkezuziyo Cuando busquemos reputación en Wikipedia, saldrá su avatarkezuziyo Cuando busquemos reputación en Wikipedia, saldrá su avatarkezuziyo Cuando busquemos reputación en Wikipedia, saldrá su avatarkezuziyo Cuando busquemos reputación en Wikipedia, saldrá su avatarkezuziyo Cuando busquemos reputación en Wikipedia, saldrá su avatarkezuziyo Cuando busquemos reputación en Wikipedia, saldrá su avatar
Voy a desarrollarte una de las expresiones, aunque sigo sin entender para que lo quieres hacer.

#define lr( x, N )( (x)<0 ? N+(x)%N : ( (x)>=N ? (x)%N : (x) ) )
x=lr(x+1,N);
sería sustituyendo x por x+1, y N por N
if ((x+1)<0) {
x=N+(x+1)%N
} else {
if ((x+1)>=N) {
x=(x+1)%N
} else {
x=(x+1)
}
}
__________________



>>>FOTO DE LA KEDADA DEL SURESTE 2008<<<
Consejos sobre como navegar por ZackY: Navegando por el foro
>>> [URL="http://www.jezuzillo.es/images/NoToros.htm"]Porque estoy en contra de las corridas de toros y de la existencia de una sección sobre las mismas en este foro[/URL] <<<
>>> [URL="http://foros.zackyfiles.com/showthread.php?t=591397"]Si quieres eliminar la sección taurina de tu navegador, pincha aquí[/URL] <<<
kezuziyo está desconectado
Respuesta rápida a este mensaje
Responder Citando Subir
Antiguo 31/10/2009, 15:55   #5
Coke-OFF
Invitado
 
Fecha de ingreso: 08/may/2007
Mensajes: 2.152
Coke-OFF A este paso se convertirá en leyenda de este foroCoke-OFF A este paso se convertirá en leyenda de este foroCoke-OFF A este paso se convertirá en leyenda de este foroCoke-OFF A este paso se convertirá en leyenda de este foroCoke-OFF A este paso se convertirá en leyenda de este foroCoke-OFF A este paso se convertirá en leyenda de este foroCoke-OFF A este paso se convertirá en leyenda de este foroCoke-OFF A este paso se convertirá en leyenda de este foroCoke-OFF A este paso se convertirá en leyenda de este foroCoke-OFF A este paso se convertirá en leyenda de este foroCoke-OFF A este paso se convertirá en leyenda de este foro
el define...

#define lr( x, N )( (x)<0 ? N+(x)%N : ( (x)>=N ? (x)%N : (x) ) )

viene a ser algo asi...

if(x < 0) x = N + (x) % N;
else if(x >= N) x = (x) % N;
else x = x;

tienes que ponerlo en donde salga lr(x, N);

ejemplo....x = lr(x + 1, N);

if(++x < 0) x = N + (x) % N;
else if(x >= N) x = (x) % N;
else x = x;

creo, no me hagas mucho caso...

PD: perdon, mientras hacia mi post ya te habian contestado.

Coke.

Última edición por Coke-OFF; 04/11/2009 a las 00:10.
Coke-OFF está desconectado
Respuesta rápida a este mensaje
Responder Citando Subir
Antiguo 31/10/2009, 16:48   #6
antoniogas 
Usuario PREMIUM+
 
Avatar de antoniogas
 
Fecha de ingreso: 28/ene/2004
Mensajes: 590
antoniogas es realmente agradableantoniogas es realmente agradableantoniogas es realmente agradableantoniogas es realmente agradable
Buenas de nuevo, he sustituido el lr(x,N) por la función if else... y el programa se ejecuta pero no hace nada, este seria el codigo sustituido:

[quote]/*Codificacion basada en el algoritmo anterior*/

#include <stdio.h>
#include <conio.h>

/*limitar rango ( limita los valores de x al rango [0, N] )*/
//#define lr( x, N )( (x)<0 ? N+(x)%N : ( (x)>=N ? (x)%N : (x) ) )

void main()
{
int cuadrado[7][7],x,y,n,N=7;

printf( "\nCuadrado Magico de orden %ix%i :\n\n", N, N);

/*Se inicia los elementos del cuadrado magico con ceros*/
for(x=0;x<N;x++)
{
for(y=0;y<N;y++)
{
cuadrado[x][y]=0;
}
}
/*Se aplica el algoritmo general para obtener cuadrados magicos de orden impar*/
for( x=N/2,y=2,n=1; n<=N*N; ) /*se hace N*N iteraciones...*/
{
if(!cuadrado[x][y]) /*si el elemento seleccionado es cero*/
{
cuadrado[x][y] = n++; /*se inserta un número natural */
if ((x+1)<0)
{
x=N+(x+1)%N;
}
else
{
if ((x+1)>=N)
{
x=(x+1)%N;
}
else
{
x=(x+1); /*se incrementa x en 1 */
}
}
if ((y-1)<0)
{
x=N+(y-1)%N;
}
else
{
if ((y-1)>=N)
{
x=(y-1)%N;
}
else
{
x=(y-1);
}
} /*se decrementa y en 1 */
}
else
{
if ((x+1)<0)
{
x=N+(x+1)%N;
}
else
{
if ((x+1)>=N)
{
x=(x+1)%N;
}
else
{
x=(x+1);
}
} /*se decrementa x en 1 */
if ((y-1)<0)
{
x=N+(y-1)%N;
}
else
{
if ((y-1)>=N)
{
x=(y-1)%N;
}
else
{
x=(y-1);
}
}/*se incrementa y en 2 */
}

}
/*se imprime el cuadrado magico en pantalla*/
for(x=0;x<N;x++)
{
for(y=0;y<N;y++)
{
printf("\n");
for(x=0;x<N;x++)
{
getch();
printf("%4i",cuadrado[x][y]);
}
}
}
printf("\n\n Suma = %i\n\n",(N*(N*N+1))/2); /*se imprime la suma*/

getch();
}[/quote]

Salu2

Última edición por antoniogas; 31/10/2009 a las 16:58.
antoniogas está desconectado
Respuesta rápida a este mensaje
Responder Citando Subir
Antiguo 31/10/2009, 16:56   #7
Coke-OFF
Invitado
 
Fecha de ingreso: 08/may/2007
Mensajes: 2.152
Coke-OFF A este paso se convertirá en leyenda de este foroCoke-OFF A este paso se convertirá en leyenda de este foroCoke-OFF A este paso se convertirá en leyenda de este foroCoke-OFF A este paso se convertirá en leyenda de este foroCoke-OFF A este paso se convertirá en leyenda de este foroCoke-OFF A este paso se convertirá en leyenda de este foroCoke-OFF A este paso se convertirá en leyenda de este foroCoke-OFF A este paso se convertirá en leyenda de este foroCoke-OFF A este paso se convertirá en leyenda de este foroCoke-OFF A este paso se convertirá en leyenda de este foroCoke-OFF A este paso se convertirá en leyenda de este foro
[QUOTE]/*Codificacion basada en el algoritmo anterior*/

#include <stdio.h>
#include <conio.h>

/*limitar rango ( limita los valores de x al rango [0, N] )*/
//#define lr( x, N )( (x)<0 ? N+(x)%N : ( (x)>=N ? (x)%N : (x) ) )

void main()
{
int cuadrado[7][7],x,y,n,N=7;

printf( "\nCuadrado Magico de orden %ix%i :\n\n", N, N);

/*Se inicia los elementos del cuadrado magico con ceros*/
for(x=0;x<N;x++)
{
for(y=0;y<N;y++)
{
cuadrado[x][y]=0;
}
}
/*Se aplica el algoritmo general para obtener cuadrados magicos de orden impar*/
for( x=N/2,y=2,n=1; n<=N*N; ) /*se hace N*N iteraciones...*/
{
if(!cuadrado[x][y]) /*si el elemento seleccionado es cero*/
{
cuadrado[x][y] = n++; /*se inserta un número natural */
if ((x+1)<0)
{
x=N+(x+1)%N;
}
else
{
if ((x+1)>=N)
{
x=(x+1)%N;
}
else
{
x=(x+1); /*se incrementa x en 1 */
}
}
if ((y-1)<0)
{
[B]y[/B]=N+(y-1)%N;
}
else
{
if ((y-1)>=N)
{
[B]y[/B]=(y-1)%N;
}
else
{
[B]y[/B]=(y-1);
}
} /*se decrementa y en 1 */
}
else
{
if ((x+1)<0)
{
x=N+(x+1)%N;
}
else
{
if ((x+1)>=N)
{
x=(x+1)%N;
}
else
{
x=(x+1);
}
} /*se decrementa x en 1 */
if ((y-1)<0)
{
[B]y[/B]=N+(y-1)%N;
}
else
{
if ((y-1)>=N)
{
[B]y[/B]=(y-1)%N;
}
else
{
[B]y[/B]=(y-1);
}
}/*se incrementa y en 2 */
}

}
/*se imprime el cuadrado magico en pantalla*/
for(x=0;x<N;x++)
{
for(y=0;y<N;y++)
{
printf("\n");
for(x=0;x<N;x++)
{
getch();
printf("%4i",cuadrado[x][y]);
}
}
}
printf("\n\n Suma = %i\n\n",(N*(N*N+1))/2); /*se imprime la suma*/

getch();
} [/QUOTE]

prueba a cambiar las negritas...tu tienes x, pon y

Coke.

Última edición por Coke-OFF; 31/10/2009 a las 17:02.
Coke-OFF está desconectado
Respuesta rápida a este mensaje
Responder Citando Subir
Antiguo 31/10/2009, 17:00   #8
antoniogas 
Usuario PREMIUM+
 
Avatar de antoniogas
 
Fecha de ingreso: 28/ene/2004
Mensajes: 590
antoniogas es realmente agradableantoniogas es realmente agradableantoniogas es realmente agradableantoniogas es realmente agradable
[quote]/*Codificacion basada en el algoritmo anterior*/

#include <stdio.h>
#include <conio.h>

/*limitar rango ( limita los valores de x al rango [0, N] )*/
//#define lr( x, N )( (x)<0 ? N+(x)%N : ( (x)>=N ? (x)%N : (x) ) )

void main()
{
int cuadrado[7][7],x,y,n,N=7;

printf( "\nCuadrado Magico de orden %ix%i :\n\n", N, N);

/*Se inicia los elementos del cuadrado magico con ceros*/
for(x=0;x<N;x++)
{
for(y=0;y<N;y++)
{
cuadrado[x][y]=0;
}
}
/*Se aplica el algoritmo general para obtener cuadrados magicos de orden impar*/
for( x=N/2,y=2,n=1; n<=N*N; ) /*se hace N*N iteraciones...*/
{
if(!cuadrado[x][y]) /*si el elemento seleccionado es cero*/
{
cuadrado[x][y] = n++; /*se inserta un número natural */
if ((x+1)<0)
{
x=N+(x+1)%N;
}
else
{
if ((x+1)>=N)
{
x=(x+1)%N;
}
else
{
x=(x+1); /*se incrementa x en 1 */
}
}
if ((y-1)<0)
{
y=N+(y-1)%N;
}
else
{
if ((y-1)>=N)
{
y=(y-1)%N;
}
else
{
y=(y-1);
}
} /*se decrementa y en 1 */
}
else
{
if ((x+1)<0)
{
x=N+(x+1)%N;
}
else
{
if ((x+1)>=N)
{
x=(x+1)%N;
}
else
{
x=(x+1);
}
} /*se decrementa x en 1 */
if ((y-1)<0)
{
y=N+(y-1)%N;
}
else
{
if ((y-1)>=N)
{
y=(y-1)%N;
}
else
{
y=(y-1);
}
}/*se incrementa y en 2 */
}

}
/*se imprime el cuadrado magico en pantalla*/
for(x=0;x<N;x++)
{
for(y=0;y<N;y++)
{
printf("\n");
for(x=0;x<N;x++)
{
getch();
printf("%4i",cuadrado[x][y]);
}
}
}
printf("\n\n Suma = %i\n\n",(N*(N*N+1))/2); /*se imprime la suma*/

getch();
}[/quote]

Ya lo he cambiado y sigue igual.
antoniogas está desconectado
Respuesta rápida a este mensaje
Responder Citando Subir
Antiguo 31/10/2009, 17:24   #9
Coke-OFF
Invitado
 
Fecha de ingreso: 08/may/2007
Mensajes: 2.152
Coke-OFF A este paso se convertirá en leyenda de este foroCoke-OFF A este paso se convertirá en leyenda de este foroCoke-OFF A este paso se convertirá en leyenda de este foroCoke-OFF A este paso se convertirá en leyenda de este foroCoke-OFF A este paso se convertirá en leyenda de este foroCoke-OFF A este paso se convertirá en leyenda de este foroCoke-OFF A este paso se convertirá en leyenda de este foroCoke-OFF A este paso se convertirá en leyenda de este foroCoke-OFF A este paso se convertirá en leyenda de este foroCoke-OFF A este paso se convertirá en leyenda de este foroCoke-OFF A este paso se convertirá en leyenda de este foro
has probado el original?...funciona?

Coke.
Coke-OFF está desconectado
Respuesta rápida a este mensaje
Responder Citando Subir
Antiguo 31/10/2009, 17:32   #10
antoniogas 
Usuario PREMIUM+
 
Avatar de antoniogas
 
Fecha de ingreso: 28/ene/2004
Mensajes: 590
antoniogas es realmente agradableantoniogas es realmente agradableantoniogas es realmente agradableantoniogas es realmente agradable
Cita:
Iniciado por Coke Ver mensaje
has probado el original?...funciona?

Coke.
Si, el original con el define si funciona.

Salu2
antoniogas está desconectado
Respuesta rápida a este mensaje
Responder Citando Subir
Antiguo 31/10/2009, 17:34   #11
Coke-OFF
Invitado
 
Fecha de ingreso: 08/may/2007
Mensajes: 2.152
Coke-OFF A este paso se convertirá en leyenda de este foroCoke-OFF A este paso se convertirá en leyenda de este foroCoke-OFF A este paso se convertirá en leyenda de este foroCoke-OFF A este paso se convertirá en leyenda de este foroCoke-OFF A este paso se convertirá en leyenda de este foroCoke-OFF A este paso se convertirá en leyenda de este foroCoke-OFF A este paso se convertirá en leyenda de este foroCoke-OFF A este paso se convertirá en leyenda de este foroCoke-OFF A este paso se convertirá en leyenda de este foroCoke-OFF A este paso se convertirá en leyenda de este foroCoke-OFF A este paso se convertirá en leyenda de este foro
Cita:
Iniciado por antoniogas Ver mensaje
Si, el original con el define si funciona.

Salu2
si, ya lo he comprobado...via mirá.

Coke.
Coke-OFF está desconectado
Respuesta rápida a este mensaje
Responder Citando Subir
Antiguo 31/10/2009, 17:39   #12
Coke-OFF
Invitado
 
Fecha de ingreso: 08/may/2007
Mensajes: 2.152
Coke-OFF A este paso se convertirá en leyenda de este foroCoke-OFF A este paso se convertirá en leyenda de este foroCoke-OFF A este paso se convertirá en leyenda de este foroCoke-OFF A este paso se convertirá en leyenda de este foroCoke-OFF A este paso se convertirá en leyenda de este foroCoke-OFF A este paso se convertirá en leyenda de este foroCoke-OFF A este paso se convertirá en leyenda de este foroCoke-OFF A este paso se convertirá en leyenda de este foroCoke-OFF A este paso se convertirá en leyenda de este foroCoke-OFF A este paso se convertirá en leyenda de este foroCoke-OFF A este paso se convertirá en leyenda de este foro
prueba con mi solucion...

[QUOTE]#include <stdio.h>
#include <conio.h>

/*limitar rango ( limita los valores de x al rango [0, N] )*/
//#define lr( x, N )( (x)<0 ? N+(x)%N : ( (x)>=N ? (x)%N : (x) ) )


void main()
{
int cuadrado[7][7],x,y,n,N=7;

printf( "\nCuadrado Magico de orden %ix%i :\n\n", N, N);

/*Se inicia los elementos del cuadrado magico con ceros*/
for(x=0;x<N;x++)
{
for(y=0;y<N;y++)
{
cuadrado[x][y]=0;
}
}
/*Se aplica el algoritmo general para obtener cuadrados magicos de orden impar*/
for( x=N/2,y=2,n=1; n<=N*N; ) /*se hace N*N iteraciones...*/
{
if(!cuadrado[x][y]) /*si el elemento seleccionado es cero*/
{
cuadrado[x][y] = n++; /*se inserta un número natural */

//x=lr(x+1,N); /*se incrementa x en 1 */

if(++x < 0) x = N+(x)%N;
else if(x >= N) x = (x)%N;
else x = x;

//y=lr(y-1,N); /*se decrementa y en 1 */

if(--y < 0) y = N+(y)%N;
else if(y >= N) y = (y)%N;
else y = y;
}
else
{
//x=lr(x-1,N); /*se decrementa x en 1 */

if(--x < 0) x = N+(x)%N;
else if(x >= N) x = (x)%N;
else x = x;

//y=lr(y-1,N); /*se incrementa y en 2 */

if(--y < 0) y = N+(y)%N;
else if(y >= N) y = (y)%N;
else y = y;
}

}
/*se imprime el cuadrado magico en pantalla*/
for(x=0;x<N;x++)
{
for(y=0;y<N;y++)
{
printf("\n");
for(x=0;x<N;x++)
{
getch();
printf("%4i",cuadrado[x][y]);
}
}
}
printf("\n\n Suma = %i\n\n",(N*(N*N+1))/2); /*se imprime la suma*/

getch();
}
[/QUOTE]

PD: incluso el else final, no tienes que ponerlo...quiero decir...

[QUOTE]#include <stdio.h>
#include <conio.h>

/*limitar rango ( limita los valores de x al rango [0, N] )*/
//#define lr( x, N )( (x)<0 ? N+(x)%N : ( (x)>=N ? (x)%N : (x) ) )


void main()
{
int cuadrado[7][7],x,y,n,N=7;

printf( "\nCuadrado Magico de orden %ix%i :\n\n", N, N);

/*Se inicia los elementos del cuadrado magico con ceros*/
for(x=0;x<N;x++)
{
for(y=0;y<N;y++)
{
cuadrado[x][y]=0;
}
}
/*Se aplica el algoritmo general para obtener cuadrados magicos de orden impar*/
for( x=N/2,y=2,n=1; n<=N*N; ) /*se hace N*N iteraciones...*/
{
if(!cuadrado[x][y]) /*si el elemento seleccionado es cero*/
{
cuadrado[x][y] = n++; /*se inserta un número natural */

//x=lr(x+1,N); /*se incrementa x en 1 */

if(++x < 0) x = N+(x)%N;
else if(x >= N) x = (x)%N;

//y=lr(y-1,N); /*se decrementa y en 1 */

if(--y < 0) y = N+(y)%N;
else if(y >= N) y = (y)%N;
}
else
{
//x=lr(x-1,N); /*se decrementa x en 1 */

if(--x < 0) x = N+(x)%N;
else if(x >= N) x = (x)%N;

//y=lr(y-1,N); /*se incrementa y en 2 */

if(--y < 0) y = N+(y)%N;
else if(y >= N) y = (y)%N;
}

}
/*se imprime el cuadrado magico en pantalla*/
for(x=0;x<N;x++)
{
for(y=0;y<N;y++)
{
printf("\n");
for(x=0;x<N;x++)
{
getch();
printf("%4i",cuadrado[x][y]);
}
}
}
printf("\n\n Suma = %i\n\n",(N*(N*N+1))/2); /*se imprime la suma*/

getch();
}
[/QUOTE]

Coke.

Última edición por Coke-OFF; 31/10/2009 a las 17:45.
Coke-OFF está desconectado
Respuesta rápida a este mensaje
Responder Citando Subir
Antiguo 31/10/2009, 17:46   #13
antoniogas 
Usuario PREMIUM+
 
Avatar de antoniogas
 
Fecha de ingreso: 28/ene/2004
Mensajes: 590
antoniogas es realmente agradableantoniogas es realmente agradableantoniogas es realmente agradableantoniogas es realmente agradable
Si, ahora si funciona, muchas gracias por todo.

Salu2
antoniogas está desconectado
Respuesta rápida a este mensaje
Responder Citando Subir
Antiguo 31/10/2009, 17:58   #14
Coke-OFF
Invitado
 
Fecha de ingreso: 08/may/2007
Mensajes: 2.152
Coke-OFF A este paso se convertirá en leyenda de este foroCoke-OFF A este paso se convertirá en leyenda de este foroCoke-OFF A este paso se convertirá en leyenda de este foroCoke-OFF A este paso se convertirá en leyenda de este foroCoke-OFF A este paso se convertirá en leyenda de este foroCoke-OFF A este paso se convertirá en leyenda de este foroCoke-OFF A este paso se convertirá en leyenda de este foroCoke-OFF A este paso se convertirá en leyenda de este foroCoke-OFF A este paso se convertirá en leyenda de este foroCoke-OFF A este paso se convertirá en leyenda de este foroCoke-OFF A este paso se convertirá en leyenda de este foro
Cita:
Iniciado por antoniogas Ver mensaje
Si, ahora si funciona, muchas gracias por todo.

Salu2
bien, me alegro...de nada.

Coke.
Coke-OFF está desconectado
Respuesta rápida a este mensaje
Responder Citando Subir
Antiguo 31/10/2009, 18:14   #15
kezuziyo
Zumbao
 
Avatar de kezuziyo
 
Fecha de ingreso: 22/ene/2004
Mensajes: 38.393
kezuziyo Cuando busquemos reputación en Wikipedia, saldrá su avatarkezuziyo Cuando busquemos reputación en Wikipedia, saldrá su avatarkezuziyo Cuando busquemos reputación en Wikipedia, saldrá su avatarkezuziyo Cuando busquemos reputación en Wikipedia, saldrá su avatarkezuziyo Cuando busquemos reputación en Wikipedia, saldrá su avatarkezuziyo Cuando busquemos reputación en Wikipedia, saldrá su avatarkezuziyo Cuando busquemos reputación en Wikipedia, saldrá su avatarkezuziyo Cuando busquemos reputación en Wikipedia, saldrá su avatarkezuziyo Cuando busquemos reputación en Wikipedia, saldrá su avatarkezuziyo Cuando busquemos reputación en Wikipedia, saldrá su avatarkezuziyo Cuando busquemos reputación en Wikipedia, saldrá su avatar
lo puedes simplificar un poco, ya que realmente lo que hace esa "función" es calcular la función módulo N positivo de un número x, que devuelve un entero entre 0 y N-1 (no entre 0 y N como dice)
/*limitar rango ( limita los valores de x al rango [0, N] )*/
#define lr( x, N )( (x)<0 ? N+(x)%N : [B]( (x)>=N ? (x)%N : (x) )[/B] )
la parte en negrita se puede sustituir perfectamente por [B](x)%N[/B] ya que cuando x<N=>x%N=x, por lo que puedes quitar todos los if que hay después de los else
__________________



>>>FOTO DE LA KEDADA DEL SURESTE 2008<<<
Consejos sobre como navegar por ZackY: Navegando por el foro
>>> [URL="http://www.jezuzillo.es/images/NoToros.htm"]Porque estoy en contra de las corridas de toros y de la existencia de una sección sobre las mismas en este foro[/URL] <<<
>>> [URL="http://foros.zackyfiles.com/showthread.php?t=591397"]Si quieres eliminar la sección taurina de tu navegador, pincha aquí[/URL] <<<
kezuziyo está desconectado
Respuesta rápida a este mensaje
Responder Citando Subir
Antiguo 31/10/2009, 18:54   #16
Coke-OFF
Invitado
 
Fecha de ingreso: 08/may/2007
Mensajes: 2.152
Coke-OFF A este paso se convertirá en leyenda de este foroCoke-OFF A este paso se convertirá en leyenda de este foroCoke-OFF A este paso se convertirá en leyenda de este foroCoke-OFF A este paso se convertirá en leyenda de este foroCoke-OFF A este paso se convertirá en leyenda de este foroCoke-OFF A este paso se convertirá en leyenda de este foroCoke-OFF A este paso se convertirá en leyenda de este foroCoke-OFF A este paso se convertirá en leyenda de este foroCoke-OFF A este paso se convertirá en leyenda de este foroCoke-OFF A este paso se convertirá en leyenda de este foroCoke-OFF A este paso se convertirá en leyenda de este foro
y como la "y" es igual en las dos condiciones, se puede sacar fuera...y el algoritmo quedaria asi...

Código PHP:
for(221<= N;) {
      if(!
cuadrado[x][y]) {
          
cuadrado[x][y] = n++;
        
          if(++
0N;
          else 
N;
      }else {
          if(--
0N;
          else 
N;
      }

      if(--
0N;
      else 
N;

Coke.
Coke-OFF está desconectado
Respuesta rápida a este mensaje
Responder Citando Subir
Antiguo 31/10/2009, 21:13   #17
antoniogas 
Usuario PREMIUM+
 
Avatar de antoniogas
 
Fecha de ingreso: 28/ene/2004
Mensajes: 590
antoniogas es realmente agradableantoniogas es realmente agradableantoniogas es realmente agradableantoniogas es realmente agradable
Muchas gracias, ya está todo simplificado y funciona todo de maravilla,

Ahora tengo una duda, la matriz se imprime valor a valor, es decir, cuadrado[1][1],cuadrado[1][2],etc...me gustaria que imprimiese el cuadrado mágico de forma que se imprima el 1 en la posición que esté, luego el 2 y así sucesivamente, hasta el 49.

Esto se podría hacer, es muy lioso??

Salu2 y gracias por todo.
antoniogas está desconectado
Respuesta rápida a este mensaje
Responder Citando Subir
Antiguo 02/11/2009, 02:11   #18
Coke-OFF
Invitado
 
Fecha de ingreso: 08/may/2007
Mensajes: 2.152
Coke-OFF A este paso se convertirá en leyenda de este foroCoke-OFF A este paso se convertirá en leyenda de este foroCoke-OFF A este paso se convertirá en leyenda de este foroCoke-OFF A este paso se convertirá en leyenda de este foroCoke-OFF A este paso se convertirá en leyenda de este foroCoke-OFF A este paso se convertirá en leyenda de este foroCoke-OFF A este paso se convertirá en leyenda de este foroCoke-OFF A este paso se convertirá en leyenda de este foroCoke-OFF A este paso se convertirá en leyenda de este foroCoke-OFF A este paso se convertirá en leyenda de este foroCoke-OFF A este paso se convertirá en leyenda de este foro
si es una aplicacion de consola, como es el caso...no es posible, ya que la funcion printf(); imprime en pantalla como si de una maquina de escribir se tratara...

Coke.
Coke-OFF está desconectado
Respuesta rápida a este mensaje
Responder Citando Subir
Antiguo 02/11/2009, 04:01   #19
antoniogas 
Usuario PREMIUM+
 
Avatar de antoniogas
 
Fecha de ingreso: 28/ene/2004
Mensajes: 590
antoniogas es realmente agradableantoniogas es realmente agradableantoniogas es realmente agradableantoniogas es realmente agradable
Cita:
Iniciado por Coke Ver mensaje
si es una aplicacion de consola, como es el caso...no es posible, ya que la funcion printf(); imprime en pantalla como si de una maquina de escribir se tratara...

Coke.
Vale,no pasa nada,muchisimas gracias por todo,si necesitais algo,aqui me teneis.
Salu2
antoniogas está desconectado
Respuesta rápida a este mensaje
Responder Citando Subir
Antiguo 02/11/2009, 13:11   #20
antoniogas 
Usuario PREMIUM+
 
Avatar de antoniogas
 
Fecha de ingreso: 28/ene/2004
Mensajes: 590
antoniogas es realmente agradableantoniogas es realmente agradableantoniogas es realmente agradableantoniogas es realmente agradable
Hola de nuevo, perdonad por ser tan pesado, pero es que sigo encabezonado en imprimir la matriz por orden

Por ahora he conseguido imprimirla del uno al 45, pero no entiendo porqué se para en el 46, cuando deberia de seguir hasta el 49.

Os dejo todo el código, lo que he hecho yo para imprimirlo por orden, está al final del código.

Cita:
/*Programa que imprime un cuadrado magico impar*/
#include <stdio.h>
#include <conio.h>

main()
{
int cubo[7][7],x,y,n,p,f,me,pfila,pcolumna,ma,num;

printf( "\nCuadrado Magico de orden %dx%d :\n\n",7,7);

/*Se inicia los elementos del cuadrado magico con ceros*/
for(x=0;x<7;x++)
{
for(y=0;y<7;y++)
{
cubo[x][y]=0;
}
}
/*Se aplica el algoritmo general para obtener cuadrados magicos de orden impar*/
x=7/2;
y=2;
for(n=1;n<=7*7
{
if(!cubo[x][y]) /*si el elemento seleccionado es cero*/
{
cubo[x][y]=n++; /*se inserta un número natural */

if(++x<0)
x=7+x%7;
else
x=x%7;
}
else
{
if(--x<0)
x=7+x%7;
else
x=x%7;
}
if(--y<0)
y=7+y%7;
else
y=y%7;
}
/*se imprime el cuadrado magico en pantalla*/
ma=2;
me=0;
do
{
for(x=0;x<7;x++)
{
for(y=0;y<7;y++)
{
if(cubo[x][y]>me && cubo[x][y]<ma)
{
num=cubo[x][y];
pfila=3*(x+10);
pcolumna=y+10;
gotoxy(pfila,pcolumna);
printf("%d",num);
getch();
me++;
ma++;
x=0;
y=0;
}
}
}
}
while(num>49);
}
Bueno, ahora se imprime hasta el 45, y quedan 4 por imprimir y no se porque...

Salu2

Última edición por antoniogas; 02/11/2009 a las 13:21.
antoniogas está desconectado
Respuesta rápida a este mensaje
Responder Citando Subir
Antiguo 02/11/2009, 15:00   #21
Coke-OFF
Invitado
 
Fecha de ingreso: 08/may/2007
Mensajes: 2.152
Coke-OFF A este paso se convertirá en leyenda de este foroCoke-OFF A este paso se convertirá en leyenda de este foroCoke-OFF A este paso se convertirá en leyenda de este foroCoke-OFF A este paso se convertirá en leyenda de este foroCoke-OFF A este paso se convertirá en leyenda de este foroCoke-OFF A este paso se convertirá en leyenda de este foroCoke-OFF A este paso se convertirá en leyenda de este foroCoke-OFF A este paso se convertirá en leyenda de este foroCoke-OFF A este paso se convertirá en leyenda de este foroCoke-OFF A este paso se convertirá en leyenda de este foroCoke-OFF A este paso se convertirá en leyenda de este foro
otias, po si se puede...nunca me lo habia planteado...bueno a lo que vamos.

en el bucle te falla la y...la igualas a 0, pero luego se incrementa por lo que el 46 que esta en cubo[0][0] no lo encuentra.

y = -1;

si quieres poder compilar el codigo con cualquier compilador, no uses gotoxy(); que es de Borland...usa esta funcion...por ejemplo, necesita la libreria "windows.h".

Código PHP:
void Migotoxy(int xint y) {
    
COORD coord;
    
coord.x;
    
coord.y;
    
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);

Coke.
Coke-OFF está desconectado
Respuesta rápida a este mensaje
Responder Citando Subir
Antiguo 02/11/2009, 16:27   #22
antoniogas 
Usuario PREMIUM+
 
Avatar de antoniogas
 
Fecha de ingreso: 28/ene/2004
Mensajes: 590
antoniogas es realmente agradableantoniogas es realmente agradableantoniogas es realmente agradableantoniogas es realmente agradable
Hola coke, prefiero usar el gotoxy, ya que nosotros en clase nos han explicado el gotoxy (usamos borland en clase) y prefiero usar lo que ha explicado.

Si a x e y, le doy valor -1 en vez de 0, la matriz no se imprime correctamente, el 2 lo posiciona en otro lugar en vez del que debe ir, eso ya lo habia probado, y no funciona.

No entiendo porque la posicion 0,0 no la encuentra, cuando deberia encontrarla correctamente.

Salu2
antoniogas está desconectado
Respuesta rápida a este mensaje
Responder Citando Subir
Antiguo 02/11/2009, 16:30   #23
antoniogas 
Usuario PREMIUM+
 
Avatar de antoniogas
 
Fecha de ingreso: 28/ene/2004
Mensajes: 590
antoniogas es realmente agradableantoniogas es realmente agradableantoniogas es realmente agradableantoniogas es realmente agradable
Buenas de nuevo coke, he igualado la y a -1, (yo igualaba la "x" y la "y", y el error era que la x no habia que igualarla a -1).

Ahora si me sale todo correctamente y todo conforme me lo pidieron que lo entregara.

El codigo quedaria así:

[quote]/*Programa que imprime un cuadrado magico impar*/
#include <stdio.h>
#include <conio.h>

main()
{
int cubo[7][7],x,y,n,ma,me,num,pfila,pcolumna,p,f;

printf( "\nCuadrado Magico de orden %dx%d :\n\n",7,7);

/*Se inicia los elementos del cuadrado magico con ceros*/
for(x=0;x<7;x++)
{
for(y=0;y<7;y++)
{
cubo[x][y]=0;
}
}

x=7/2;
y=2;
for(n=1;n<=7*7
{
if(!cubo[x][y]) /*si el elemento seleccionado es cero*/
{
cubo[x][y]=n++; /*se inserta un número natural */

if(++x<0)
x=7+x%7;
else
x=x%7;
}
else
{
if(--x<0)
x=7+x%7;
else
x=x%7;
}
if(--y<0)
y=7+y%7;
else
y=y%7;
}
/*se imprime el cuadrado magico en pantalla*/
ma=2;
me=0;
do
{
for(x=0;x<7;x++)
{
for(y=0;y<7;y++)
{
if(cubo[x][y]>me && cubo[x][y]<ma)
{
num=cubo[x][y];
pfila=3*(x+5);
pcolumna=y+5;
gotoxy(pfila,pcolumna);
printf("%d",num);
getch();
me++;
ma++;
x=0;
y=-1;
}
}
}
}
while(num>49);

p=(7*(7*7+1)/2);
for(f=5;f<=11;f++)
{
gotoxy(35,f);
printf(" ==> La suma de la fila es: %d",p);
}
printf("\n\n La suma de cada una de las filas, columnas y diagonales es: %d\n\n",(7*(7*7+1))/2); /*se imprime la suma*/
getch();
}[/quote]

Muchas gracias por todo, habeis sido de gran ayuda.

Salu2

Última edición por antoniogas; 02/11/2009 a las 16:36.
antoniogas está desconectado
Respuesta rápida a este mensaje
Responder Citando Subir
Antiguo 02/11/2009, 18:31   #24
Coke-OFF
Invitado
 
Fecha de ingreso: 08/may/2007
Mensajes: 2.152
Coke-OFF A este paso se convertirá en leyenda de este foroCoke-OFF A este paso se convertirá en leyenda de este foroCoke-OFF A este paso se convertirá en leyenda de este foroCoke-OFF A este paso se convertirá en leyenda de este foroCoke-OFF A este paso se convertirá en leyenda de este foroCoke-OFF A este paso se convertirá en leyenda de este foroCoke-OFF A este paso se convertirá en leyenda de este foroCoke-OFF A este paso se convertirá en leyenda de este foroCoke-OFF A este paso se convertirá en leyenda de este foroCoke-OFF A este paso se convertirá en leyenda de este foroCoke-OFF A este paso se convertirá en leyenda de este foro
de nada Antonio...una ultima cosa...

if(x > 0 && x < 2) == if(x == 1)
if(x > 1 && x < 3) == if(x == 2)
.
.
.
por lo que el bucle, se puede poner asi...

Código PHP:
num 1;

do {
    for(
07x++) {
        for(
07y++) {
            if(
cubo[x][y] == num) {
                
pfila * (5);
                
pcolumna 5;
                
gotoxy(pfilapcolumna);            
                
printf("%d"num);
                
getch();                
                
0;
                
= -1;
                
num++;
            }
        }
    }
}while(
num 50); 
un saludo.

Coke.
Coke-OFF está desconectado
Respuesta rápida a este mensaje
Responder Citando Subir
Antiguo 02/11/2009, 19:29   #25
antoniogas 
Usuario PREMIUM+
 
Avatar de antoniogas
 
Fecha de ingreso: 28/ene/2004
Mensajes: 590
antoniogas es realmente agradableantoniogas es realmente agradableantoniogas es realmente agradableantoniogas es realmente agradable
Muchas gracias de nuevo por todo coke.
Salu2
antoniogas está desconectado
Respuesta rápida a este mensaje
Responder Citando Subir
Publicidad: Conoce las ofertas de ANUNCIATE
Respuesta


Usuarios viendo actualmente este tema: 1 (0 usuarios registrados y 1 visitantes)
 
Herramientas

Permisos para publicar mensajes
No puedes crear nuevos temas
No puedes responder mensajes
No puedes subir archivos adjuntos
No puedes editar tus mensajes

Los BB code están Activado
Los Emoticones están Activado
El código [IMG] está Activado
El Código HTML está Desactivado

Ir al foro


!! ADVERTENCIAS !!: Las informaciones aquí publicadas NO CONTIENEN KEYS para la decodificación de ningún sistema: NO SON OPERATIVOS en sistemas SAT que precisen de su correspondiente suscripción.

ESTA TOTALMENTE PROHIBIDO EL USO DE ESTAS INFORMACIONES PARA LA MODIFICACIÓN O  DEFRAUDACIÓN DE SISTEMAS DE ACCESO CONDICIONAL.

ESTOS FOROS SON MODERADOS Y NO SE PERMITE LA PUBLICACIÓN DE INFORMACIONES ILEGALES POR PARTE DE LOS USUARIOS. EN CASO DE DETECTARSE ESTE TIPO DE INFORMACIONES, LOS USUARIOS SERÁN EXCLUIDOS DE ESTAS PÁGINAS.

USO DE COOKIES: Utilizamos COOKIES y de terceros para mejorar nuestros servicios y navegación por la web. Si continua navegando, consideramos que acepta su uso.  


La franja horaria es GMT +2. Ahora son las 13:29.


-------------------------------------------------------------------- --------------------------------------------------------------------

Powered por vBulletin™ Version 3.8.10
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.
Traducido por vBsoporte - vBulletin en español
Hispaservicios - J.G.C - 29112549T - Rio Cinca, 2, 30 (50180) SPAIN.
Todos los derechos reservados. Prohibida cualquier reproducion total o parcial.


Foros Patrocinados por anunciantes.