brunch

매거진 Sinclair

You can make anything
by writing

C.S.Lewis

by Sinclair Feb 13. 2016

배열과 포인터: X-files

홀수 마방진, 진실은 저 너머에 VI




이번 시간에는 그 동안 배웠던 배열을 활용하여 홀수 마방진을 만들어주는 프로그램을 함께 작성해 보도록 하겠습니다.


마방진은 역사가 오랜 역사를 자랑하고 있으며, 실제로 그 아름다운 숫자 배열에 매력을 느낀 수 많은 수학자들의 연구 대상이기도 합니다.

우리 선조들도 이 마방진을 여러 곳에 활용했는데 일례로 단원 김홍도 선생의 씨름도를 보면 그림에 등장하는 인물의 배치에 마방진의 숫자 배열을 사용했다는 것을 알 수 있습니다.


기존에 이차원 배열을 이용한 일반적인 프로그램은 검색 사이트 많이 나와 있으므로 우선 우리는 일차원 배열을 이용해 작성해 보도록 하겠습니다. 짝수 마방진 알고리즘도 있습니다만 마방진을 연구하는 것이 목적이 아니므로 오늘은 홀수 마방진만 만들어 보도록 하겠습니다.


나중에 동적 할당을 배운 후에 역시 다시 한번 바꿔 보도록 하겠습니다.

조건은 다음과 같습니다. 3이상 19이하의 홀수 n을 입력 받도록 하겠습니다. 배열을 사용해야 하므로 반드시 최대값을 지정하고 시작해야 합니다.


여기에서 작성한 프로그램의 마방진 함수에 사용한 일부 알고리즘은 신권영님의 사이트(http://user.chollian.net/~brainstm/)에서 얻었습니다. 이 자리를 빌어 다시 한번 고마운 마음을 전합니다.(현재 사이트는 막혔습니다.)

 


   




홀수 마방진을 만들어 주는 프로그램 i: 정적 할당  


#include <stdio.h>  

/*

* copyleft ⓛ 2006 - 2017 programmed by Sinclair

*/  

// prototypes from https://brunch.co.kr/@sinclairo/18   

extern int onlyInt(int *) ;

extern int fgets4(register char * , int) ;  


int magic(register int * , int );

int presentation(register const int * , int) ;  


int main() {  

    int matrix[19*19] ;

    int digit ;


    char toBeContinue ;  

    while(1) {

        toBeContinue = 0 ;  

       while(1) {

            if( toBeContinue++ > 5 ) {

                puts("정녕 마방진을 구하구 싶은 게냐? 콱이걸 증말...") ;

                exit(-1) ;

            } // end if

            puts("마방진 구해드립니다.. 3 이상의 홀수를 입력하세요..") ;

            if(onlyInt(&digit)) {

                puts("어허~ 숫자가 아닌 걸 입력하면 아니되오..") ;

                continue ;

            } // end if  

            if( !(digit % 2) || (digit < || digit > 20 ) ) {

                puts("한글 못 읽어요? 홀수 몰라? odd number말야~") ;

                continue ;

            } // end if

            break ;

         } //end inner while  

        magic(matrix , digit) ;  

        presentation(matrix , digit) ;

        puts("한 번 더 해드릴까요?(y/any key) 웬만하면 좀 그만두시죠..") ;

        fgets4((char*)&digit , 2/*sizeof digit*/) ;

        if( tolower(*(char*)&digit) != 'y' ) break ;

        system("clear") ; // on DOS system("cls") ;  

    } // end outer while

    return 0 ;  

} // end main()  


int magic(register int * m , int n) {

    // Thanks for 신권영( http://user.chollian.net/~brainstm/ )

    register i , j , num = 1 ;

    int seed = n * / 2 ;  

    for(i = 0; i < n ; i++)

        for(j = 0 ; j < n ; j++)

            m[((j-i+seed)%n) * n + (i*2-j+n)%n] = num++ ;  

    return 0 ;  

} //end magic()  


int presentation(register const int * m , int n) {  

    register i , j ;  

    for ( i = ; i < n ; i++ )     {

        for ( j = ; j < n ; j++ )         {

            printf("%5d" , m[ i * n + j ]) ;

        } // end inner for

        putchar('\n') ;

    } // end outer for  

    putchar('\n') ;  

    return 0 ;  

} // end presentation()   












게다가 잘 찾아 보시면 이 그림엔 수수께끼 같은 해학도 숨겨져 있습니다. 마치 프로그래머들이 프로그램 속에 숨겨 둔 이스터에그처럼 말이죠.







C언어 및 기타 프로그래밍 관련 질문은 오픈 카톡으로

group talk - https://is.gd/yourc

1:1 talk - https://is.gd/aboutc

#Sinclair #씽클레어 #싱클레어 #씽클레어도씨 #씨언어 #씨프로그래밍  #C언어 #Cprogramming #C_Programming #C #Programming #Clanguage #C_Language

매거진의 이전글 배열과 포인터: X-files
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari