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 |
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=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 |
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) } } |
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...:p PD: perdon, mientras hacia mi post ya te habian contestado. Coke. |
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 |
[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. |
[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. |
has probado el original?...funciona?
Coke. |
Cita:
Salu2 |
Cita:
Coke. |
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. |
Si, ahora si funciona, muchas gracias por todo.
Salu2 |
Cita:
Coke. |
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 |
y como la "y" es igual en las dos condiciones, se puede sacar fuera...y el algoritmo quedaria asi...
Código PHP:
|
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. |
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. |
Cita:
Salu2 |
Hola de nuevo, perdonad por ser tan pesado, pero es que sigo encabezonado en imprimir la matriz por orden :D
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:
Salu2 |
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:
|
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 |
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 |
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:
Coke. |
Muchas gracias de nuevo por todo coke.
Salu2 |
La franja horaria es GMT +2. Ahora son las 15:54. |
Powered por vBulletin™ Version 3.8.10
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.
Traducido por vBsoporte - vBulletin en español
ZackYFileS - Foros de Debate