01 //p5magic.c --- ¦p¤§«e¦U½d¨Ò, ­n¥Î¥ß©e¤uµ{Âà¥]·§©À: ©î¦¨ function ! 02 // ½Ð¬G·N¿é¤J 2 ©Î 38 ¬Ý¬Ý·|«ç¼Ë? 03 /// @CopyLeft by tsaiwn@cs.nctu.edu.tw 04 /// Last modified date and time: 2010/10/24 11:15 05 /// Original creation date and time: 2010/10/11 16:15 06 //////////// 07 // ª`·N: magOdd( )­t³d©_¼Æ¶¥, mag4k()­t³d°¸¼Æ¶¥; 08 // ¦@¥Î array x[N_MAX][N_MAX]; ¦¹¥~, ¤]¦@¥Î int n; ¥Nªí n ¶¥; 09 // ÁÙ¦³, ¥Î¨Ó¦L¥X magic square ³¡¤À«h©â¥X¨Ó¼g¦¨function ¦@¥Î 10 // ÁÙ¦³ÁÙ¦³, ¥|ªº­¿¼Æ¶¥¥t¼g isOnDiag(r, c) ¬d¬Ý x[r][c] ¦³¨S¦b¹ï¨¤½u 11 #include 12 #include 13 #define N_MAX 19 14 int n; // ª`·N³o n ¬O int, ¥H«e¬O¥Î long, ²{¦b¬G·N§ï¥Î int 15 // ª`·N§Ú­Ì¬G·N§â Global array x ¼g¦b main( )«á«h main()¬Ý¤£¨ì! 16 // (ª`·N) atol( ), atoi( ), ¥H¤Î atof( ) ³£«Å§i¦b 17 long getLong(void); // ¥ý«Å§i(Án©ú)·|¼g¤@­Ó getLong( ) function ƒº 18 void magOdd(int); // for ©_¼Æ¶¥ Magic Square 19 void mag4k(int); // for order = 4k where k = 1, 2, 3, ... 20 void ggyy(int n) { 21 printf("Sorry, can NOT process order n = %d\n", n); 22 printf(" Please try order = 3.. %d\n", N_MAX); 23 } 24 int main( ) { // ¤j¦h¼Æ main program ³£³o¼Ë¶}ÀY 25 for( ;; ) { // (ª`·N) Loop forever 26 printf("Magic Square of order n, Give me n: "); 27 n = (int)getLong( ); // ¼g¦¨¨ç¼Æ(function;¨ç¦¡)¬O«Ü¦nªº²ßºD 28 if(feof(stdin)) n = -1; // force to terminate if EOF 29 if(n == 0) n = 4; // default order = 4 for fun :-) 30 if( n < 0 ) break; // ­Y¬O­t¼Æ´N°± ! ª`·N¥i§ï¥Î§Oªº¤èªk 31 if((n < 3) || (n > N_MAX) ) { // n ¤£²Å¦X³W©w ! 32 ggyy(n); 33 continue; // will goto top of the Loop, §Y for(;;) 34 } 35 if( (n%2) == 1) magOdd(n); // ©_¼Æ¶¥ 36 else if( (n%4) == 0) mag4k(n); // order = 4k where k=1,2,... 37 else { 38 ggyy(n); // ·Q¤@·Q, why ¦¹³B¤£»Ý¥Î continue; ??? 39 } 40 // (ª`·N) ¥i¥H°Ý user ­n¤£­nÄ~Äò? 41 } // while 42 printf("Bye bye!\nHit RETURN key ..."); 43 getchar( ); // ¥ø¹ÏŪ¨ú¤@­Ó char, Åýµ{¦¡°±µÛµ¥ User «ö RETURN Áä 44 return 0; // §iª¾§@·~¨t²Î(OS)ªí¥Ü§Ú­Ì³o¥Dµ{¦¡¥¿±`µ²§ô 45 }// main( 46 long getLong( ) { // ¥H«á­n§ï¿é¤Jªº¤èªk¥u­n§ï³o function ´N¥i :-) 47 static char buf[99]; // a string buffer for input; why "static" ? 48 double ans; 49 fgets(buf, sizeof(buf), stdin); // stdin ´N¬OÁä½L, ­n°O±o§t¤J 50 ans = atol(buf); // ±q¦r¦ê¤¤Åª¥X long ¾ã¼Æ (long) 51 ////// ­Y¬O¹ê¼Æ´N§â atol §ï¬° atof ³o¤]¬O§O¤H¼g¦nªº¨ç¼Æ(¨ç¦¡) 52 return ans; 53 } 54 int x[N_MAX][N_MAX]; // ¼g¦b³o ¥Dµ{¦¡ main( ) ¬Ý¤£¨ì :-) 55 int i, j, k; // µ¹¥H¤U functions ¥Î©ó Loop ±±¨îÅÜ¼Æ :-) 56 //.. ·íµM¤]¥i¥H¦b functions ¤º¦Û¤v¥t¥~©w¸qÅÜ¼Æ 57 void printARY(int n); // ¥ý«Å§i´N¥i¥Î¤F, ¤º®e©w¸q«h«á­±¦A¨Ó¼g 58 void magOdd(int n) { // ¥i¥H¥Î¤W­±ªº int x[ ] [ ] 59 int i, k, row, col, hand=0; 60 printf("Magic square of ORDer = %d\n", n); 61 row = -1; // above the top row 62 col = n/2; // in the middle 63 for(i=1; i <= n; ++i) { // °µ n ¦¸ 64 ++row; ++hand; x[row][col]=hand; 65 for(k=0; k< n-1; ++k) { // ³o¼Ë¤]¬O°µ n ¦¸ 66 --row; if(row<0) row = n-1; // wrap around 67 col++; if(col>= n) col = 0; //¶]¨ì¥kÃä­n±²¦^¥ªÃä 68 x[row][col]= ++hand; // ³o¸Ì ++ ­n¼g¥ªÃä¤~¹ï ! 69 }//for k 70 }//for i 71 printARY(n); 72 }// magOdd( 73 /// ///////// 74 int isOnDiag(int, int); // ¥ý«Å§i, ¦WºÙ¥Î Java ªº²ßºD :) 75 void mag4k(int n) { // ¥i¥H¥Î¤W­±ªº int x[ ] [ ] 76 int i, k, sum, hand=0; 77 printf("Magic square of order = %d\n", n); 78 if( n%4 != 0) return; // ¨¾§b :-) 79 sum = 1 + n*n; // (³Ì¤p + ³Ì¤j) ©ñ sum ³Æ¥Î 80 for(i=0; i < n; ++i) { // ³o¦¸¤@©w­n 0 .. n-1 81 for(k=0; k < n; ++k) { // ¤]¬O 0 .. n-1 82 ++hand; x[i][k]=hand; // ¥ý©ñ³o­Ó 83 if(isOnDiag(i,k)) x[i][k] = sum - hand; 84 }//for k 85 }//for i 86 printARY(n); 87 }// mag4k( 88 void printARY(int n) { 89 int i, k; 90 for(i=0; ipath c:\Dev-Cpp\bin;%path% 103 D:\testc>gcc p5magic.c 104 D:\testc>a 105 Magic Square of order n, Give me n: 2 106 Sorry, can NOT process order n = 2 107 Please try order = 3.. 19 108 Magic Square of order n, Give me n: 38 109 Sorry, can NOT process order n = 38 110 Please try order = 3.. 19 111 Magic Square of order n, Give me n: 5 112 Magic square of ORDer = 5 113 17 24 1 8 15 114 23 5 7 14 16 115 4 6 13 20 22 116 10 12 19 21 3 117 11 18 25 2 9 118 Magic Square of order n, Give me n: 4 119 Magic square of order = 4 120 16 2 3 13 121 5 11 10 8 122 9 7 6 12 123 4 14 15 1 124 Magic Square of order n, Give me n: 3 125 Magic square of ORDer = 3 126 8 1 6 127 3 5 7 128 4 9 2 129 Magic Square of order n, Give me n: 8 130 Magic square of order = 8 131 64 2 3 61 60 6 7 57 132 9 55 54 12 13 51 50 16 133 17 47 46 20 21 43 42 24 134 40 26 27 37 36 30 31 33 135 32 34 35 29 28 38 39 25 136 41 23 22 44 45 19 18 48 137 49 15 14 52 53 11 10 56 138 8 58 59 5 4 62 63 1 139 Magic Square of order n, Give me n: 99 140 Sorry, can NOT process order n = 99 141 Please try order = 3.. 19 142 Magic Square of order n, Give me n: -1 143 Bye bye! 144 Hit RETURN key ... 145 146 D:\testc> 147 **********************/