//p5magic.c --- ¦p¤§«e¦U½d¨Ò, ­n¥Î¥ß©e¤uµ{Âà¥]·§©À: ©î¦¨ function ! // ½Ð¬G·N¿é¤J 2 ©Î 38 ¬Ý¬Ý·|«ç¼Ë? /// @CopyLeft by tsaiwn@cs.nctu.edu.tw /// Last modified date and time: 2010/10/24 11:15 /// Original creation date and time: 2010/10/11 16:15 //////////// // ª`·N: magOdd( )­t³d©_¼Æ¶¥, mag4k()­t³d°¸¼Æ¶¥; // ¦@¥Î array x[N_MAX][N_MAX]; ¦¹¥~, ¤]¦@¥Î int n; ¥Nªí n ¶¥; // ÁÙ¦³, ¥Î¨Ó¦L¥X magic square ³¡¤À«h©â¥X¨Ó¼g¦¨function ¦@¥Î // ÁÙ¦³ÁÙ¦³, ¥|ªº­¿¼Æ¶¥¥t¼g isOnDiag(r, c) ¬d¬Ý x[r][c] ¦³¨S¦b¹ï¨¤½u #include #include #define N_MAX 19 int n; // ª`·N³o n ¬O int, ¥H«e¬O¥Î long, ²{¦b¬G·N§ï¥Î int // ª`·N§Ú­Ì¬G·N§â Global array x ¼g¦b main( )«á«h main()¬Ý¤£¨ì! // (ª`·N) atol( ), atoi( ), ¥H¤Î atof( ) ³£«Å§i¦b long getLong(void); // ¥ý«Å§i(Án©ú)·|¼g¤@­Ó getLong( ) function ƒº void magOdd(int); // for ©_¼Æ¶¥ Magic Square void mag4k(int); // for order = 4k where k = 1, 2, 3, ... void ggyy(int n) { printf("Sorry, can NOT process order n = %d\n", n); printf(" Please try order = 3.. %d\n", N_MAX); } int main( ) { // ¤j¦h¼Æ main program ³£³o¼Ë¶}ÀY for( ;; ) { // (ª`·N) Loop forever printf("Magic Square of order n, Give me n: "); n = (int)getLong( ); // ¼g¦¨¨ç¼Æ(function;¨ç¦¡)¬O«Ü¦nªº²ßºD if(feof(stdin)) n = -1; // force to terminate if EOF if(n == 0) n = 4; // default order = 4 for fun :-) if( n < 0 ) break; // ­Y¬O­t¼Æ´N°± ! ª`·N¥i§ï¥Î§Oªº¤èªk if((n < 3) || (n > N_MAX) ) { // n ¤£²Å¦X³W©w ! ggyy(n); continue; // will goto top of the Loop, §Y for(;;) } if( (n%2) == 1) magOdd(n); // ©_¼Æ¶¥ else if( (n%4) == 0) mag4k(n); // order = 4k where k=1,2,... else { ggyy(n); // ·Q¤@·Q, why ¦¹³B¤£»Ý¥Î continue; ??? } // (ª`·N) ¥i¥H°Ý user ­n¤£­nÄ~Äò? } // while printf("Bye bye!\nHit RETURN key ..."); getchar( ); // ¥ø¹ÏŪ¨ú¤@­Ó char, Åýµ{¦¡°±µÛµ¥ User «ö RETURN Áä return 0; // §iª¾§@·~¨t²Î(OS)ªí¥Ü§Ú­Ì³o¥Dµ{¦¡¥¿±`µ²§ô }// main( long getLong( ) { // ¥H«á­n§ï¿é¤Jªº¤èªk¥u­n§ï³o function ´N¥i :-) static char buf[99]; // a string buffer for input; why "static" ? double ans; fgets(buf, sizeof(buf), stdin); // stdin ´N¬OÁä½L, ­n°O±o§t¤J ans = atol(buf); // ±q¦r¦ê¤¤Åª¥X long ¾ã¼Æ (long) ////// ­Y¬O¹ê¼Æ´N§â atol §ï¬° atof ³o¤]¬O§O¤H¼g¦nªº¨ç¼Æ(¨ç¦¡) return ans; } int x[N_MAX][N_MAX]; // ¼g¦b³o ¥Dµ{¦¡ main( ) ¬Ý¤£¨ì :-) int i, j, k; // µ¹¥H¤U functions ¥Î©ó Loop ±±¨îÅÜ¼Æ :-) //.. ·íµM¤]¥i¥H¦b functions ¤º¦Û¤v¥t¥~©w¸qÅÜ¼Æ void printARY(int n); // ¥ý«Å§i´N¥i¥Î¤F, ¤º®e©w¸q«h«á­±¦A¨Ó¼g void magOdd(int n) { // ¥i¥H¥Î¤W­±ªº int x[ ] [ ] int i, k, row, col, hand=0; printf("Magic square of ORDer = %d\n", n); row = -1; // above the top row col = n/2; // in the middle for(i=1; i <= n; ++i) { // °µ n ¦¸ ++row; ++hand; x[row][col]=hand; for(k=0; k< n-1; ++k) { // ³o¼Ë¤]¬O°µ n ¦¸ --row; if(row<0) row = n-1; // wrap around col++; if(col>= n) col = 0; //¶]¨ì¥kÃä­n±²¦^¥ªÃä x[row][col]= ++hand; // ³o¸Ì ++ ­n¼g¥ªÃä¤~¹ï ! }//for k }//for i printARY(n); }// magOdd( /// ///////// int isOnDiag(int, int); // ¥ý«Å§i, ¦WºÙ¥Î Java ªº²ßºD :) void mag4k(int n) { // ¥i¥H¥Î¤W­±ªº int x[ ] [ ] int i, k, sum, hand=0; printf("Magic square of order = %d\n", n); if( n%4 != 0) return; // ¨¾§b :-) sum = 1 + n*n; // (³Ì¤p + ³Ì¤j) ©ñ sum ³Æ¥Î for(i=0; i < n; ++i) { // ³o¦¸¤@©w­n 0 .. n-1 for(k=0; k < n; ++k) { // ¤]¬O 0 .. n-1 ++hand; x[i][k]=hand; // ¥ý©ñ³o­Ó if(isOnDiag(i,k)) x[i][k] = sum - hand; }//for k }//for i printARY(n); }// mag4k( void printARY(int n) { int i, k; for(i=0; ipath c:\Dev-Cpp\bin;%path% D:\testc>gcc p5magic.c D:\testc>a Magic Square of order n, Give me n: 2 Sorry, can NOT process order n = 2 Please try order = 3.. 19 Magic Square of order n, Give me n: 38 Sorry, can NOT process order n = 38 Please try order = 3.. 19 Magic Square of order n, Give me n: 5 Magic square of ORDer = 5 17 24 1 8 15 23 5 7 14 16 4 6 13 20 22 10 12 19 21 3 11 18 25 2 9 Magic Square of order n, Give me n: 4 Magic square of order = 4 16 2 3 13 5 11 10 8 9 7 6 12 4 14 15 1 Magic Square of order n, Give me n: 3 Magic square of ORDer = 3 8 1 6 3 5 7 4 9 2 Magic Square of order n, Give me n: 8 Magic square of order = 8 64 2 3 61 60 6 7 57 9 55 54 12 13 51 50 16 17 47 46 20 21 43 42 24 40 26 27 37 36 30 31 33 32 34 35 29 28 38 39 25 41 23 22 44 45 19 18 48 49 15 14 52 53 11 10 56 8 58 59 5 4 62 63 1 Magic Square of order n, Give me n: 99 Sorry, can NOT process order n = 99 Please try order = 3.. 19 Magic Square of order n, Give me n: -1 Bye bye! Hit RETURN key ... D:\testc> **********************/