Page 68 - Do it! 자료구조와 함께 배우는 알고리즘(C 언어, 3쇄)
P. 68
a 함수 형식 매크로 swap의 잘못된 정의
1 #define swap(type, x, y) { type t = x; x = y; y = t; }
if(a > b) if(조건식)
{ type t = a; a = b; b = t; } ; 명령문 명령문
if문 종료!
else else
{ type t = a; a = c; c = t; } ; 명령문 명령문
여기까지만 if문으로 해석합니다. 나머지
명령문은 대응하는 if문이 끊어집니다.
그래서 오른쪽 B 처럼 세미콜론을 없애면 매크로가 치환한 다음의 컴 B if(a > b)
파일 오류는 피할 수 있습니다. 하지만 이러한 코드는 C 언어 프로그 swap(int, a, b)
else
램답지 않습니다. 또한 실수로 세미콜론을 붙이는 것만으로 오류가 발 swap(int, a, c)
생할 수도 있는 호출 방법을 사용자에게 권할 수는 없습니다.
올바른 정의(블록을 do문으로 둘러싸는 경우)
함수 형식 매크로 swap의 올바른 정의와 이를 사용한 프로그램의 일부(치환한 모습)인 A 를 나타낸 것
이 그림 b 입니다. 이렇게 해야 치환한 다음의 전체 코드가 올바른 if문이 됩니다. 왜냐하면 do문의 구
문 표기법은 ‘do문 while(식);’이기 때문입니다. do문은 do부터 세미콜론까지가 하나의 구문입니다.
b 함수 형식 매크로 swap의 올바른 정의
2 #define swap(type, x, y) do { type t = x; x = y; y = t; } while(0)
if(a > b) if(조건식)
do { type t = a; a = b; b = t; } while(0); 명령문
else else
do { type t = a; a = c; c = t; } while(0); 명령문
전체가 if문
[그림 2C-3] 함수 형식 매크로 swap은 문장이 그대로 치환됩니다.
기수 변환
이번에는 정수 값을 임의의 기수(基數)로 변환하는 알고리즘을 살펴보겠습니다. 10진수 정수
를 n진수 정수로 변환하려면 정수를 n으로 나눈 나머지를 구하는 동시에 그 몫에 대해 나눗셈
을 반복해야 합니다. 이 과정을 몫이 0이 될 때까지 반복하고, 이런 과정으로 구한 나머지를
거꾸로 늘어 놓은 숫자가 기수로 변환한 숫자입니다. 이런 생각을 바탕으로 10진수 59를 2진
수, 8진수, 16진수로 변환하는 모습을 그림 2-11에 나타냈습니다.
68 C 알고리즘