제일 싫은게 미적미적 마무리 하는 것. 사실 C도 몇 번이나 수박 겉핧기로 보느라 많은 시간을 낭비해왔다. 그에 비해서 C++은 시작한지 반 년만에 쏴악 가는 중이다. 아무래도 예전에 자바를 좀 봤기 때문에 객체에 대해서 조금은 맛은 봤기 때문일 것이다.

꾸역꾸역 다시 봐야겠다. 내가 잘하는 것은 무엇인지 모르겠지만 말이다.
반응형

'Programming' 카테고리의 다른 글

쉼없이 코딩한다는 것  (0) 2014.09.15
나비 입력기  (0) 2014.07.12
구글은 언제나 위대하다  (0) 2014.06.26
조급해 지는 것은 사실인듯 하다.  (0) 2014.04.30
cin.getline(name, name_len)  (0) 2014.04.16

 오늘은 sas에서 잘 모르는 에러가 발생했다. 대충 알아보니 원래 sas 파일에 인덱스 파일이 별도로 있었는데, 이 파일들이 사라지면서 원본 sas파일들이 모두 문제가 생긴 것이다. 이에 대해서 문의가 왔을 때, 난 솔직히 이것을 어떻게 다뤄야 할지 몰랐다. 이것을 못하면 물어본 대리님이 집에 못가는 상황이 생긴다고 했다.

 

 대충 감을 잡아서 구글로 검색을 했다. 영어를 사용해야 하니까 그럴듯한 작문을 해서 검색을 했고 대충 찾아서 검색을 해보니 되기는 하더라. 일단 찾을 것을 갖고 테스트를 해봤고 다행히 데이터는 잘 복구되었다. sas라는 것을 오랫동안 사용하면서 느낀 점은 이 넘이 워낙에 복잡하고 방대한 코드를 갖고 있는지라, 모든 것을 외우려고 하는 것은 불가능하다고 본다.

 

 좀더 자세하게 공부를 하기 보다, 나는 통계족으로 트는 것을 선택했다. 따라서 필요한 것을 얻기 위해서는 기본적인 개념과 생각만 있다면 구글을 이용해서 그때그때 찾는 것을 선호하게 되었다. C++를 배우면서 아직도 한심한 상황이며 기본적인 프로그램조차 잘 구동하지 못한다. 내가 원하는 정도의 수준까지 올라가려면 아마도 STL까지는 해야 할텐데, 아직도 한~참 갈길이 멀기만 하다.

 

 C++도 레퍼런스 책을 하나 사고 찾아볼 수 있도록 해야겠다. 그 책이 익숙해질 때쯤이면 지금처럼 구글로 모든 것을 찾을 수 있는 정도가 되겠지.

반응형

'Programming' 카테고리의 다른 글

나비 입력기  (0) 2014.07.12
그래도 끝은 봐야겠지?  (0) 2014.07.07
조급해 지는 것은 사실인듯 하다.  (0) 2014.04.30
cin.getline(name, name_len)  (0) 2014.04.16
좋은 디자인 사이트  (0) 2014.02.20

 점점 나이를 먹는다는 생각에 쫓긴다고 느끼고 있다. 예전에는 아직 젊다고 생각했는데, 아무것도 이루지 못하고 이렇게 그냥 늙어만 가는게 아닌가 생각을 해본다. 적어도 C++, Java만큼은 자유롭게 사용할 수 있었으면 했는데 지금 보면 상속과 객체에 대한 개념조차 제대로 잡지를 못하고 있다.


 생각보다 어려운 것은 은닉화라는 것이라고 본다. 객체의 private 데이터 보호를 위해서 사방에 const를 주는 것도 그렇고 상속하는 부분도 쉽지만은 않다고 본다. C를 제대로 하지 않은 상태에서 C++를 하는 것은 아니라는 생각을 하게 된다. C++의 특성이 C처럼 절차지향으로 짤 수 있고 Java처럼 객체지향으로 짤 수도 있다는 것이라고 하네.


 C의 최고봉이 포인터였고 그것을 이해하는데 생각보다 많은 시간과 노력이 필요했다.

반응형


cin.getline(name, name_len) 이렇게 했는데 왜 에러가 나오지도 않고 실행하면 그냥 넘어갈까. 정확히 문제를 알면 쉽게 해결이 될텐데, 답답하네.

반응형

 회사에서는 이글루스가 접속이 안되어서 이렇게 글을 남겨본다.


http://minamjun11.egloos.com/1352449


Whole UI

ICON


반응형

저는 비전공자인데, 업무와 공부 때문에 통계팩키지를 사용하고 취미로 코딩을 배우려고 하는 사람입니다. 원래는 sas를 좀더 편리하고 다양하게 사용하기 위해서 배웠던게 프로그래밍 공부였는데, Java/C/VBA 등등을 손을 대는 전형적인 '입으로만' 코더입니다. 프로그래머 단계까지도 않은 상태이지요.


 얼마전부터 시간이 있어서 예전에 건성건성 보던 열혈강의 C 책을 다시 보기 시작했습니다. 오랫동안 들고 다니고 봐서 너덜너덜 한데, 참 내용이 많습니다. 초보자들 대부분이 초반에 짐을 싸고 나가게 만든다는 포인터 부분을 다시 씩씩하게 복습하고 있습니다. 책에 있는 예제를 그냥 쳐보고 이해하는 것은 쉬운데, 막상 정답이 없는 '도전 프로그래밍'을 하려니 죽을 맛이었습니다. 저는 한 가지 문제를 오랫동안 앉아서 풀릴 때까지 기다리는 것을 참 못해요, 그래서 고딩때 수학 성적도 바닥을 기었죠.


 근데 대학교 4학년때부터 조금씩 숫자에 눈을 뜨다가 군대 있을 때 숫자와 통계에 대해서 눈을 뜨게 되었고 엉뚱하게 통계분석을 주로 하는 팀에서 일하게 되었습니다. 그래서 이것저것 손대다가 최근에 열심히 보던 것이 열혈강의 C책인데, 아래 내용은 1주일 정도를 골똘히 생각해 보다가 만들어 낸 것입니다. 다른 사람들이 블로그에 정리해 놓은 개념을 잡고 겨우 손으로 그려가면서 만들어 놓은 것이 이 프로그램이다.


 sas로 코딩을 할  때에는 늘 노트에 이런 저런 것들을 그리면서 개념을 잡고 하는데, c로 할 때에는 이것저것 막히는 게 많아서 그런 것들을 하는 것보다 검색해서 함수를 찾는 경우가 많았다. vba를 배우면서 배열을 많이 사용하는데, sas에서는 강력한 매크로로 모든 것들을 해결하는데, 다른 언어들은 그런 경우가 없으니까 참 배우기가 어렵다. 반복문과 분기 제어만 잘 해도 왠만한 것들은 다 잘한다고 본다.


 이번에는 회사에서 야근하면서 종종 만들어 보았던 것이 바로 이 달팽이 배열이다. 처음에 시작할 때에는 배열간에 움직이는 것 자체가 개념이 없어서 힘들었다. 그리고 이것을 만들면서 배열과 포인터가 왜 필요한지 이해하게 되었다. 그전까지는 그냥 필요하니까 하겠지 했는데, 이번에 보니 함수로 빼야 하는게 필수적으로 존재하고 일부분은 포인터 값을 계속 움직여 가면서 해야 하는게 꼭 필요하더라.


 어찌 되었던 1주일간 고민하면서 집에서 코딩했던 것을 공유해 본다. 전문가들의 눈에는 안차겠지만 그래도 내가 처음부터 끝까지 별별 엉뚱한 에러를 다 겪으면서 만들었던 것이라서 참 애착이 간다.


 근데 이넘을 만들면서 느꼈던 것이 움직이는 것들을 어떻게 숫자로 표현할 것이냐 했던 것들인데, 항상 계산해서 하려 했던 것과 달리 C는 계산을 돕는 넘들이 있어서 편했다. 일반 프로그래머는 수학과 논리가 필요하다는 생각을 그다지 해본적이 없다. sas를 쓰면서도 실제 논리가 필요한 것들은 그리 많지 않았고 주로 자잘한 함수와 sas가 제공하는 강력한 procedure로 해결했는데 C는 그런 것들이 없으니 실제 많은 생각을 해야만 했다.


 이번에 얻은 것들


1. 포인터가 얼마나 절실히 필요한지

2. 배열을 함수에서 건드리는 것이 왜 필요한지

3. 기본적인 수학을 못하면 뭘 하려는 것은 걍 포기하자. 우리는 사무실에서 날코딩으로 몇 년치 월 마지막 날짜를 달력 보면서 다 넣는 사람들도 쉽게 알 수 있다.

4. 논리나 로직을 이해하는 첫 번째 길은 종이 한 장을 꺼내서 이것저것 그려보고 그러면서 생각해 보자. 한 방에 머리로 모든 것을 해결하고 그리는 사람은 천재이고 나는 천재는 커녕 둔재다.


 이번에 참 재미있고 유익했다.


/* 열혈강의 Page435 도전 프로그래밍 2 */


#include <stdio.h>


void initial(int (*pArr)[100]);

void show(int (*pArr)[100], int n);

void make(int *pArr, int n);

void showx(int *pArr, int n);

void horz(int (*pArr)[100], int seq, int* row, int* column, int* k, int t);

void vert(int (*pArr)[100], int seq, int* row, int* column, int* k, int t);



int main(void)

{

int turn[100],i, n, k;


    int row = 0, column = 0; 

int snail[100][100];


printf("숫자를 입력하세요 : ");

scanf("%d", &n);


make(turn, n);

//show(turn, n);

printf("달팽이 배열에 사용할 회전 값을 보여줍니다.\n");

for(i = 1; i < n * 2 - 1; i++)

{

printf("%d ", turn[i-1]);

}

printf("\n");

// 달팽이 초기화

initial(snail);

printf("초기화된 달팽이 배열의 값을 보여줍니다.\n");

show(snail, n);


k = 0;




for(i = 1; i <= (n * 2 - 1); i++)

{

printf("%d, turn[%d] is %d\n", i, i-1, turn[i-1]);


// 홀수의 경우(In case of odds)


        if(i%2 != 0)

        {

printf("홀수입니다.\n");

printf("i : %d, row : %d, column : %d, k : %d, turn[i-1] : %d\n", i, row, column, k, turn[i-1]);

horz(snail, i, &row, &column, &k, turn[i-1]);

        }

        else

        {

printf("짝수입니다.\n");

printf("i : %d, row : %d, column : %d, k : %d, turn[i-1] : %d\n", i, row, column, k, turn[i-1]);

   vert(snail, i, &row, &column, &k, turn[i-1]);

        }


}

printf("결과값을 보여 줍니다.\n");

show(snail, n);




return 0;

}


// 달팽이 배열, 열

void vert(int (*pArr)[100], int seq, int* row, int* column, int* k, int t)

{

int i;


    // 아래쪽으로 이동하는 코드 : D

if(seq == 2 || seq%4 == 2)

{

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

        {

*k += 1;

            pArr[*row][*column] = *k;

*row += 1;

        }

*row    -= 1;

*column -= 1;

    }

// 윗쪽으로 이동하는 코드 : U

    else if(seq == 4 || seq%4 == 0)

    {

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

        {

*k += 1;

            pArr[*row][*column] = *k;

*row -= 1;

        }

*row += 1;

*column +=1;

    }

         

}


// 달팽이 배열, 행 : 

void horz(int (*pArr)[100], int seq, int* row, int* column, int* k, int t)

{

int i;


    // 오른쪽으로 이동하는 코드 : R

if(seq == 1 || seq%4 == 1)

{

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

        {

*k += 1;

            pArr[*row][*column] = *k;

*column += 1;

        }

*column -= 1;

*row    += 1;

    }

// 왼쪽으로 이동하는 코드 : L

    else if(seq == 3 || seq%4 == 3)

    {

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

        {

*k += 1;

pArr[*row][*column] = *k;

*column -= 1;

        }

*column += 1;

*row    -= 1;

    }



printf("row is %d and column is %d\n", *row, *column);

         

}


// 사용할 배열 초기화

void initial(int (*pArr)[100])

{

int i, j;

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

{

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

{

pArr[i][j] = 0;

}

}

}



// 달팽이 배열을 보여주는 함수

void show(int (*pArr)[100], int n)

{

int i, j;

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

{

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

{

printf("%d ", pArr[i][j]);

}

printf("\n");

}

}




// 달팽이가 방향을 바꾸는 구간을 구하는 배열

void make(int *pArr, int n)

{

int i;

int k = n;

for(i = 0; i < n * 2 - 1; i++)

{

if(i%2 == 0)

   {

   pArr[i] = k;

}

else

{

   k -= 1;

   pArr[i] = k;

}

}

}




// 배열을 보여주는 함수

void showx(int *pArr, int n)

{

int i;

for(i = 0; i < n * 2 - 1; i++)

{

printf("pArr[%d] is %d\n", i, pArr[i]);

}

}

반응형

'Programming' 카테고리의 다른 글

cin.getline(name, name_len)  (0) 2014.04.16
좋은 디자인 사이트  (0) 2014.02.20
이제 일 주일이 지났다.  (0) 2013.07.07
R cookbook 최고다  (0) 2013.05.24
Excellent explanation of P&I logic  (0) 2013.05.06

+ Recent posts