반응형

프로그래밍 215

C언어 포인터에 대한 이해(1)

C언어를 사용하게되면 포인터에 대한 이해가 필수입니다. 그래서 천천히 정리도 할겸 글을 씁니다. 그전에 포인터를 그냥 공부하기보단 왜 포인터가 필요한가를 느껴야지 더 와닿지 않을까 생각합니다. 저도 한동한 손을 놓고 있던지라 생각나는대로 정리를 하겠습니다. 포인터는 정말 유용한 도구인데요, 우선 포인터의 정의를 알아야 하겠습니다. 포인터는 번지값을 가지는 변수입니다. Type *P; 여기서 *는 포인터 변수를 선언하는 구두점입니다. Type은 포인터 변수가 가리키는 주소에 선언된 변수의 타입을 나타냅니다. 포인터변수는 주소값만을 취하기때문에 포인터변수의 크기는 항상 4byte로 일정합니다.(여기서 4byte는 32비트시스템에 해당함) 번지값을 갖는것은 의미가 참 큽니다. 그림으로 생각해야 이해가 쉬우니 ..

MinGw을 사용해보자

MinGw은 GCC를 윈도우에서 사용할수있게 해주는 도구모음입니다. 뭐 그밖에 여러가지 도구들이 있죠 MSYS같은. 어쨋은 GCC를 사용하기위해 MinGw를 설치하는데요. 에디트플러스에 맞물려 사용해보려합니다. 우선 MinGw홈페이지에가서 다운로드를 합시다. 실행을 하게되면 필요에 맞는 도구를 선택하고 설치하면됩니다. http://sourceforge.net/projects/mingw/files/Installer/mingw-get-setup.exe/download 에디티 플러스도 설치를 해주시구요. 윈도우 실행창에서 시스템 환경 변수 편집을 쳐서 찾습니다. 환경변수(N)...에 가셔서 시스템 변수(S) 중 path 항목에가서 아래 추가를 해줍니다. 추가값은 자신의 MinGw 설치위치에따라 달라집니다. 여..

프로그래밍/cpp 2013.11.28

유클리드 호제법(최대공약수, 최소공배수 구하기)

유클리드의 호제법은 쉽게 말해서 최대공약수를 구하는 알고리즘이다. A와 B의 최대공약수를 구한다면, A=QB+R 위 식처럼 A와 B의 관계를 나타내도록한다.(A>B) 이상태에서 다시 제수(B)과 나머지(R)의 관계를 같은 형식으로 나타내보자. B=Q'R+R' 나머지로 제수를 계속해서 나눠간다. 이렇게 반복하다보면 언젠가 제수가 딱 떨어지는 순간이 생기게된다. 생각해 보면 모든 수에대하여 성립한다. 이 때 떨어지는 순간 제수가 최대 공약수가 된다는 것이 호제법이다. 연습삼아 유클리드 호제법으로 최대공약수를 구해보자. *제수:나누는 수 *피제수:나눔을 당하는수 *나머지:나머지 GCD(3,6) 2 = 6/3...0 나머지가 0일때 제수가 3이므로 GCD는 3 GCD(8,28) 3 = 28 / 8...4 2 =..

다익스트라 알고리즘

다익스트라의 핵심은 다음글을 보기 바랍니다. 2015/06/02 - [프로그래밍/알고리즘] - 다익스트라 알고리즘(Dijkstra Algorithm)최단경로 알고리즘 아래 글은 제가 오래전 다익스트라를 처음 공부할 때 쓴 글이므로 이해가지 않는 부분도 있고 많이 부족합니다. 코드만 참고하시길 바랍니다. 다익스트라 알고리즘, 이름조차 어렵다. 이 알고리즘을 이해하기위해선 깊이 우선, 너비우선 탐색을 이해해야한다. 2013/06/05 - [프로그래밍/알고리즘] - 탐색-깊이우선탐색, 너비우선탐색 2013/06/07 - [프로그래밍/알고리즘] - 위상정렬(topological sort) 다익스트라 알고리즘은 시작점을 정하고 끝점을 정하면 그 두점사이 최단거리를 구하는 알고리즘이다. 다익스트라 알고리즘의 너비우..

3항연산자

A?B:C; 위 식은 3항연산자의 기본형태다. A가 참이면 B 거짓이면 C로 가라는 의미다. 특징을 좀더 살펴보면 ? 뒤의 문장과 :뒤의 문장은 if esle 문과 비슷하다. else문이 스위치형식으로 거짓인경우 실행되고 참인경우 실행안되는 것 처럼 말이다. 그럼아래식을 보고 이야기하자. A?B,B':C:C'; 여기서 B'와 C'는 조건에 대한 결과와는 상관없다. 여기서 if else문과 좀 다른 특징이 눈에 뛰는데 A가 참인경우 B와 B'가 실행된다. 그리고 C'가 실행된다. 하지만 A가 거짓인경우? B' 가 실행되는가? 그렇지않다 이경우 C와 C'가 실행된다. 이는 if else문의 성격을 띠지만 ,연산자가 쓰이게되면 goto문의 특징을 갖게된다는것이다. 결국 A가 참인경우 C는 실행이 안되므로 결론..

프로그래밍/cpp 2013.06.17

클래스 내부의 static 에 관한 고찰

static 멤버함수는 this객체를 받지않는다.(static은 사용범위가 지정되어 있기때문이다. static멤버함수의 경우 사용범위는 클래스가 생성한 객체가아닌 클래스 전반적으로 사용하는 함수, 다시말하면 클래스의 static 멤버를 다루는 함수라 봐도 좋다) 때문에 static 멤버함수는 클래스형에 의해서 호출되는 함수다. 객체를 통해 호출하려고해도 그 객체의 클래스형만 살펴본 후 맞다면 호출한다. static이 아닌 멤버의 경우 함수내에서 this의 호출을 통해 이루어진다. 기본적으로 this가 전달된후 컴파일러상에서 this로 접근한다. 그렇기때문에 static 멤버변수가 아닌 변수를 접근하는건 불가능하다. 또산 static 선언은 목적파일 링크시에 알리지않는다는 뜻이다.(선언된 파일 내부에서만 ..

프로그래밍/cpp 2013.06.13

포인터사용시 주의점2

일반적으로 포인터는 특정 변수를 가르킨다. 그리고 이 포인터가 가르키는 변수는 타입이 정해져서 그 변수가 담고있는 내용은 틀에 맞춰 끼워진내용이란말이다. 다시말해 형식이 정해져있는 내용이다. 예를들어 int형 변수를 가르키는 포인터는 그변수가 int형(4Byte)를 가르키기때문에 그에 맞춰 변수의 주소값과 변수의 타입명을 확실히 알고 값에 접근할 수가있다. 이제부터 쓰는 내용은 이런 확실함에 대한 이야기다. 내부적으로 컴파일러의 설계에 따라 달라질 수 가 있을지모르겠고, 난 전혀 컴파일러를 설계해보지 않았기때문에 경험적으로 말하는 것임을 미리 말해둔다. char* str; 위선언은 무척 많이 보았을것이다. 위선언을 보고 동적할당을 해야겠구나. 라고 생각을 한다면, 어느정도 기본을 충실히 한 사람일 것이다..

객체지향의 시작 첫번째글

객체지향은 왜 시작되었을까.. 그리고 왜 필요한것일까. C언어를 공부하다 C++을 접하게되면 객체지향의 필요성에대해서 의문을 가지게된다. C언어의 순차적이고 직관적인 문법에비해, 이론만으론 추상적인 개념들에 왜 필요한지 적용하는방법에대해서도 서툴기만하다. 프로그래밍을하면 크게 변수, 함수, 그리고 제어구문 이렇게 큰틀의 반복이다. 전부 변수를 다루기위한것이다. 이런변수를 다루면서 코드의 길이가 길어지면 변수도 많아지고 함수도많아지고 지역변수도많아지고 점점 헷갈리게된다. 또한 전역적으로필요한 변수도 동류끼리 구분지어질 필요가 있을경우가있다. 객체지향은 이런 변수와 함수를 잘사용하기위해 필요하지않을까 생각한다. 객체지향의 이점중 한가지가 계통정리를 통해 동류의 변수들을 묶을 수 있다는 것이다. 또한 이런 동..

프로그래밍/cpp 2013.06.12

오일러의 한붓그리기(작성중)

깊이우선 탐색과 별반 다르지않다. 하지만 알고리즘의 1%만 수정되어도 제대로 이해를 하지못한다면 완전 다르게 보일수도있다. 컴퓨터의 알고리즘이란 1%로인해 전체적이 해법과 결과물이 달라지기때문이다. 익히 말한바와 같이 깊이 우선탐색은 재귀의 진행시 계속해서 시작정점을 반환하는 탐색방법이다. 내가 쓴방법은 한번 갔던 곳은 플래그로 표시를 해두었기때문에 판정을통해 다시는 안가도록 해놓았다. 이런경우는 노드와 노드사이의 간선이 하나만 존재할때 가능한일이다. 간선이 2개이상일땐 플래그를 해놓는 방법은 유용하지않다. 직접 행렬상의 간선의 개수를 지우는 방식으로 하겠다. 또한 한붓그리기의 취지에 맞게 모든 간선을 한번에 다 지나가야하므로 판정을 간선을 다 통과했는지 해야하고 이러한 모든 방법의 수를 구하기위해선, ..

반응형