2차원 배열 포인터란 2차원 배열을 담는 포인터이다.

 int temp_array[3][2] = {{0,1},{3,5},{7,9}}; //2차원 배열
int (*temp)[2]; //2차원 배열포인터

temp = temp_array;

2차원 배열은 이렇게 2차원 배열포인터를 이용해서 가르킬수 있다.


아래서는 대상체에 대해서 개념을 이해해보자.
대상체란 말 그대로 가르키는 대상이 무엇이냐인데 아래를 보자.

int (*temp)[2];
 int temp_array[3][2] = {{0,1},{3,5},{7,9}};
 
1. temp = temp_array;
2. temp = temp_array[0];
3. temp = &temp_array[0][0];

위와 같이 실행하게되면 되야 된다고 생각할 수 있지만 1번만 성립된다.
왜냐하면...여기서 대상체에 대한 이해가 필요하다.
우선 1,2,3번은 주소값은 모두 같다.

1번은 temp는 2개의 대상체를 가진 값을 가르킬수 있는 포인터이고 temp_array는 2차원 배열의 배열명이기 때문에 당연히 성립한다.

문제는 2번과 3번인데

2번은 temp_array[0]같은 경우 행을 대표하는 것으로서 대상 체가 1번과 같이 배열 전체가 아니라 해당 행 전체인 것이다. 그러므로 temp가 가르킬 수 없는 것이다.

3번 같은 경우도 비슷하다. &temp_array[0][0]는  대상체가 temp_array[0][0]여서 불가능하다.




이번엔 더 분명하게 대상체에 대해서 sizeof를 통해서 알아보자.

int (*temp)[2]; //*temp는 2개의 대상체를 가지고있는 배열을 가르킨다 라고 생각하자.
 int temp_array[3][2] = {{0,1},{3,5},{7,9}};
 

 temp = temp_array;

 cout<<temp_array<<endl;
 cout<<temp_array[0]<<endl;
 cout<<&temp_array[0][0]<<endl;

 cout<<sizeof(temp_array)<<endl;
 cout<<sizeof(temp_array[0])<<endl; 
 cout<<sizeof(&temp_array[0][0])<<endl;

이렇게 모두 주소가 같지만 다른 메모리 크기가 나오는것을 확인할 수 있다.






 

'프로그래밍 기초 > C포인터' 카테고리의 다른 글

문자열 포인터  (0) 2010.05.25
2차원 포인터 배열  (0) 2010.05.25
배열포인터의 특징  (0) 2010.05.25
배열과 포인터  (0) 2010.05.19
포인터란?  (0) 2010.05.19
Posted by 아몰라

우선 간단히 배열이란 무엇인지 생각해봐야한다.

int temp1;
int temp2[10];

temp라는 변수명을 가진 변수는 4바이트지만
temp2는 하나의 변수명으로 무려 10개의 int형 변수를 10개를 만든 것이다.


배열의 특징 세가지를 정리하면

1. 배열명은 주소를 뜻한다.

2. 배열명은 배열의 첫번째 배열 요소의 주소를 뜻한다.

 int temp_array[3] = {1, 3, 5};
 int *temp;

 temp = temp_array;

 cout<<*temp<<endl;
 cout<<*(temp+1)<<endl;
 cout<<*(temp+2)<<endl;

 cout<<temp_array<<endl;  //배열명을 출력해보았다. 주소가 나온다.
 cout<<temp_array+1<<endl;
 cout<<temp_array+2<<endl;

 cout<<*temp_array<<endl;  //이렇게 배열명을 역참조를 해보면 값이 나온다.
 cout<<*(temp_array+1)<<endl;
 cout<<*(temp_array+2)<<endl; 



위와 같이 포인터랑 배열에 +1같은 연산을 함으로서 첫번째 배열에 있는 값이 아닌 값을 참조 할 수도 있다.


또 추가적으로

 cout<<&temp_array<<endl;
 cout<<&temp_array+1<<endl;
 cout<<&temp_array+2<<endl;

이렇게 해보면 배열명에 주소에 접근한뒤 +1 이나 +2를 하면 주소값이 12씩 증가하게 되었다.
즉, 배열명의 크기만큼 증가하게 되었다.

근데 의문이 가는게 &temp_array+1 과 temp_array+1 이 값이 다르게 나오는게 이해가 가지않는다.
temp_array랑 &temp_array는 배열명이기 때문에 어차피 똑같은 주소(0012FF58)가 나오는데 그 주소에서 +1을 하면 둘다 같아야 되는게 아닌가? 누군가에게 물어봐야겠다 -_-


3. 배열명에는 주소를 할당 할 수 없다. 배열명은 포인터변수가 아니라 배열명 자체일 뿐이다.

말 그대로 할당 할 수 없다

temp = temp_array;
temp = temp_array+1;
가능하다. 포인터에 배열의 주소값들이 들어갈수있을것이다.

temp_array = temp;
temp_array = temp+1;
불가능하다. 배열에는 포인터가 아니라 값이 들어가야 한다.


--------------------------------------------------------------------------------------------------------
알아본 결과 예전에는 temp_array 는 배열 상수일뿐이고 저장된 영역이 없기때문에 출력하라는거 자체가 말이 안되서 오류가 났다고 한다. 하지만 ANSI에서 배열명에 &연산자를 허용해주어서 에러가 안나는것이라 한다.
그러므로 &temp_array 자체가 말이안되는 것이다.  temp_array+1은 첫번째 주소에서 자료형크기만큼 &temp_array+1 는 배열명 크기만큼 커진다는 것만 이해해야겠다.

&temp_array는 어떠한 대상을 가르키고 있는것이 아닌 그냥 주소값일뿐 그래서 sizeof를 하게되면 4가나오게된다.

'프로그래밍 기초 > C포인터' 카테고리의 다른 글

문자열 포인터  (0) 2010.05.25
2차원 포인터 배열  (0) 2010.05.25
배열포인터의 특징  (0) 2010.05.25
2차원 배열포인터와 대상체  (0) 2010.05.20
포인터란?  (0) 2010.05.19
Posted by 아몰라

포인터란?

포인터
는 번지에 대한 기호화된 표현을 말한다.

즉, 주소를 말한다고 할 수 있다.

int temp;

temp라는 이름을 가진 변수가 선언되면

int형은 4바이트 메모리로 시스템이 할당을 해주고

각 바이트들은 다 주소가 있게 마련이다.

그 주소들이 포인터가 되는것이다.


포인터변수란?

말 그대로 포인터들을 담는 변수가 되는 것이다.

포인터변수에는 주소들만 저장할수 있게된다.

예를 들어 int *temp 이런식으로 포인터변수 정의를 할수 있는데

이렇게 되면 정수가 저장된 곳의 위치를 가르킬 수 있게 되는 것이다.

그러므로 temp = 5; 이런식의 표현은 되지않는다.

 int *temp;
 int t = 2;

 temp = &t;

cout<<*temp;  이런식으로 하면 temp포인터변수가 가르키고있는 값 2가 출력하게된다.

cout<<temp;  temp포인터변수에있는 가르키고있는 포인터가 출력된다. 즉, 주소가 출력된다.

cout<<&temp; temp포인터변수에 주소가 출력된다.

물론 주소는 4바이트니까 연속적으로
0x12FF60
0x12FF61
0x12FF62
0x12FF63
저장되지만 &temp로 출력을 하게되면 가장앞에 주소(60)가 출력되게된다.



포인터를 사용하므로서 생기는 장점은 차차 포인터를 정리하면서 마지막에 정리하겠다.

p.s  아 그리고 포인터들은 int *temp; 나 char * temp 나 다 4바이트씩 메모리를 가지게된다.






'프로그래밍 기초 > C포인터' 카테고리의 다른 글

문자열 포인터  (0) 2010.05.25
2차원 포인터 배열  (0) 2010.05.25
배열포인터의 특징  (0) 2010.05.25
2차원 배열포인터와 대상체  (0) 2010.05.20
배열과 포인터  (0) 2010.05.19
Posted by 아몰라

연결리스트를 위해 구조체를 정의하였다.


typedef struct TreeNode{
char * data;
struct TreeNode * left;
struct TreeNode * right;
}TreeNode;

그리고 3가지의 순회방법이 있는데

전위, 중위, 후위가 있다.

전위는
root-left-right
중위는
left-root-right
후위는
left-right-root


트리구조는 이렇게 만들었다.


순회를 시키면
이런 순으로 트리를 순회하는 것이다.

'프로그래밍 기초 > 자료구조 & 알고리즘' 카테고리의 다른 글

유전 알고리즘  (0) 2010.06.10
영향력 분포도  (0) 2010.06.10
트리의 배열표현 방법  (0) 2010.05.14
큐 만들기  (0) 2010.05.14
스택만들기  (0) 2010.05.13
Posted by 아몰라

우선 이진트리란 루트노드가 있으면  하나의 루트노드당 왼쪽노드와 오른쪽노드 두개의 노드만 있을 수 있는 트리 구조이다.

배열로 이진트리를 표현하는 방법은 부모 노드의 인덱스가 i라하면
왼쪽자식노드는 [i*2] 오른쪽자식노드는[i*2+1]이 된다.

반대로 자식의 부모를 알아볼려고 할 때는 [i/2]를  하여서 나온 몫이 부모가 되게 된다.
그러므로 루트노드는 1부터 시작한다. 아무리 나눠도 0으로 나눌수 없기 때문이다.

'프로그래밍 기초 > 자료구조 & 알고리즘' 카테고리의 다른 글

영향력 분포도  (0) 2010.06.10
연결리스트를 이용한 이진트리의 순회방법  (0) 2010.05.14
큐 만들기  (0) 2010.05.14
스택만들기  (0) 2010.05.13
LCD 디스플레이  (0) 2010.05.13
Posted by 아몰라

큐는 스택과는 다르게 FIFO 방식으로 먼저 들어온 녀석이 먼저나가는 방식이다.

그냥 일반큐를 만들어보았다.

구조체를 이용해 front, rear, count, q 를 하나로 통합시켰다.

typedef struct{
 int q[QueueSize+1];
 int front;
 int rear;
 int count;
}queue;


front에서는 Dequeue할 원소를 가르키고 있고 rear에서는 삽입할 자리를 가르키고있다. 또 count를
이용해 Deque나 Enqueue가 가능한지 확인하도록 사용하였다.

'프로그래밍 기초 > 자료구조 & 알고리즘' 카테고리의 다른 글

연결리스트를 이용한 이진트리의 순회방법  (0) 2010.05.14
트리의 배열표현 방법  (0) 2010.05.14
스택만들기  (0) 2010.05.13
LCD 디스플레이  (0) 2010.05.13
여행(The Trip)  (0) 2010.05.11
Posted by 아몰라
예전에 자료구조 배울때 못해보았던

스택만들기를 해보았다.

스택에 대한 간단한 이해만 있으면 어렵지 않게 만들 수 있는 것 같다.

현재 스택에 위치는 top 변수를 만들어서 사용했고

스택에 크기는 10으로 고정하였다.


맨 위에 3은 View가 3번이라서 그렇다. 스택이 아니다 -_-;;;

요 근래 계속 느끼는건데 c랑 c++에 대한 이해가 부족하다.
기본적인 배열이나 int 나 char나 뭔가가 부족하다. 확실하게 못짚겠다.
기초플러스 한번도 제대로 안봤는데 짬내서 봐야겄다.

'프로그래밍 기초 > 자료구조 & 알고리즘' 카테고리의 다른 글

트리의 배열표현 방법  (0) 2010.05.14
큐 만들기  (0) 2010.05.14
LCD 디스플레이  (0) 2010.05.13
여행(The Trip)  (0) 2010.05.11
지뢰찾기  (0) 2010.05.03
Posted by 아몰라

입력 파일은 여러 줄로 구성되며 표시될 각각의 숫자마다 한 줄씩 입력된다. 각 줄에는 s와 n이라는 두 개의 정수가 들어있으며 n은 출력될 숫자(0<=n<=99,999,999), s는 숫자를 표시하는 크기(1<=s<=10)를 의미한다. 0이 두 개의 입력된 줄이 있으면 입력이 종료되며 그 줄은 처리되지 않는다.

기본적인 문법이나 활용하는면에서 많이 미숙함을 느꼈던 문제

프로그래밍을 많이안해봐서 그런듯하다. 책보단 역시 코딩을 해봐야되는거같다 -_-

'프로그래밍 기초 > 자료구조 & 알고리즘' 카테고리의 다른 글

큐 만들기  (0) 2010.05.14
스택만들기  (0) 2010.05.13
여행(The Trip)  (0) 2010.05.11
지뢰찾기  (0) 2010.05.03
3n+1  (0) 2010.05.03
Posted by 아몰라
일년에 한번 씩 다른 여행지로 여행을 가는 학생 모임이 있다. 이 학생들은 여행 경비를 모두 똑같이 부담하기로 합의했지만 돈을 쓸 때마다 나눠서 내는 것은 별로 실용적이지 못하다. 그래서 한명씩 식비, 호텔비, 택시비, 비행기표를 부담하기로 한다. 여행이 끝난 후에 각 학생이 지출한 내역을 계산한 다음 1센트 단위 내에서 모든 학생들이 쓴 돈이 같도록 돈을 주고 받는다. 하지만 이전 여행의 경험에 비추어보면 돈을 주고 받는 과정은 정말 지루하고 오랜 시간을 요하는 작업이었다. 지출 내역이 주어졌을 때 모든 학생이 쓴 돈이(1센트 단위 내에서)똑같아지기위해 전달되어야 하는 최소 액수를 구해보자.

각 여행에 대해 각 학생이 사용한 금액이 똑같아지기 위해 전달되어야 하는 금액의 총합을 출력한다.

입력                      출력
3                           10.00
10.00                      12.00
20.00
30.00
4
15.00
15.01
3.00
3.01



재밌는 문제였던거같다. 처음에는 엄청 간단해보였는데 문제를 잘못이해해서 아주 쉽게 생각했었다.
이 문제의 해결은 학생들의 평균을 구해서 그 값보다 큰 것들을 모두 더하면 금액이 같아지기위해서 이동하는 돈의 총액이 된다. 가장 문제였던게 계산후에 자리수를 맞추기위해 반올림을 할려고 했는데 c랑 c++에서는 반올림 함수를 제공해주지 않는걸 몰라서 찾는데 시간이 좀 걸린것같다.

'프로그래밍 기초 > 자료구조 & 알고리즘' 카테고리의 다른 글

스택만들기  (0) 2010.05.13
LCD 디스플레이  (0) 2010.05.13
지뢰찾기  (0) 2010.05.03
3n+1  (0) 2010.05.03
스케줄링 (라운드 로빈)  (0) 2009.12.17
Posted by 아몰라

C++에서 제공해주지 않는 반올림 함수를 만들어보자~

1.첫번째

double round( double value, int pos )

{

      double temp;

      temp = value * pow( 10, pos );  // 원하는 소수점 자리수만큼 10의 누승을 함

      temp = floor( temp + 0.5 );          // 0.5를 더한후 버림하면 반올림이 됨

      temp *= pow( 10, -pos );           // 다시 원래 소수점 자리수로

      return temp;

}
 

2.두번째

double Round(double x, int n)
{
       int i;
       // 자릿수맞춤
       for ( i = 0; i < n; ++i )
             x *= 10;
       if ( x - (int)x >= 0.5 )
             // 소수점이하부분이0.5보다크거나같으면올림
             x = ceil(x);
       else
             // 작으면버림
             x = floor(x);           
       // 자릿수복구
       for ( i = 0; i < n; ++i )
             x /= 10;

'프로그래밍 기초 > C++' 카테고리의 다른 글

가상함수테이블  (0) 2010.03.04
다형성  (0) 2010.03.04
This 포인터  (0) 2010.01.24
템플릿이란!?  (0) 2009.11.20
Posted by 아몰라
이전버튼 1 2 3 4 5 6 7 8 ··· 16 이전버튼