C의 MIN 및 MAX 함수
이 튜토리얼에서는 매크로 또는 루프를 사용하여 C에서 MIN
및 MAX
기능을 구현하는 방법에 대해 설명합니다.
C의 MIN
및 MAX
기능
MIN
및 MAX
기능은 두 값에서 최소값과 최대값을 찾는 데 사용되며 C 언어에서는 사전 정의되지 않습니다. MIN
및 MAX
기능을 사용하려면 C에서 정의해야 합니다.
매크로를 사용하여 C 언어에서 MIN
및 MAX
기능을 정의할 수 있습니다. 매크로는 변수 값과 기능을 정의하는 데 사용되는 코드 세그먼트입니다.
매크로를 호출하면 해당 값이나 함수로 대체됩니다. 예를 들어 PI
와 같은 변수의 값을 정의할 수 있으며 코드에서 PI
라는 이름을 사용할 때 이름은 해당 값으로 대체됩니다.
매크로를 코드에 이름을 쓰면 호출되는 함수로 정의할 수도 있습니다. #define
키워드를 사용하여 C 언어에서 매크로를 정의합니다.
예를 들어, C 언어 매크로를 사용하여 MIN
및 MAX
기능을 정의해 보겠습니다. 아래 코드를 참조하십시오.
#include <stdio.h>
#define MIN(i, j) (((i) < (j)) ? (i) : (j))
#define MAX(i, j) (((i) > (j)) ? (i) : (j))
int main() {
printf("Min = %d\n", MIN(0, 10));
printf("Max = %d", MAX(0, 10));
return 0;
}
출력:
Min = 0
Max = 10
위의 코드에서 ?
기호는 삼항 연산자이며 if-else
문 대신 사용됩니다. 삼항 연산자 앞의 조건이 참이면 출력은 콜론 :
의 왼쪽과 같고 조건이 거짓이면 콜론 :
의 오른쪽과 같습니다.
위의 코드에서는 입력이 a+b
와 같은 표현식이 될 수도 있기 때문에 대괄호를 사용했으며 대괄호를 사용하지 않으면 출력이 변경됩니다. 삼항 연산자 대신 if-else
문을 사용할 수도 있습니다.
위의 코드는 함수 내부에 표현식을 전달하는 이중 평가 부작용의 경우 문제를 일으킬 것입니다. __typeof__
명령을 사용하여 MIN
및 MAX
기능을 정의하여 위의 문제를 피할 수 있으므로 더 안전하고 버그가 적습니다.
__typeof__
명령은 표현식의 유형을 나타냅니다. 표현식 및 유형과 함께 typeof
명령을 사용할 수 있습니다.
예를 들어 __typeof__
명령을 사용하여 위의 MIN
및 MAX
함수를 정의해 보겠습니다. 아래 코드를 참조하십시오.
#include <stdio.h>
#define MAX(x, y) \
({ \
typeof(x) _x = (x); \
typeof(y) _y = (y); \
_x > _y ? _x : _y; \
})
#define MIN(x, y) \
({ \
typeof(x) _x = (x); \
typeof(y) _y = (y); \
_x < _y ? _x : _y; \
})
int main() {
printf("Min = %d\n", MIN(0, 10));
printf("Max = %d", MAX(0, 10));
return 0;
}
출력:
Min = 0
Max = 10
위의 코드에서 __typeof__
명령을 사용하여 입력 유형을 참조한 다음 삼항 연산자를 사용하여 if-else
문을 정의했습니다. 출력이 이전 예제와 동일함을 알 수 있습니다.
위의 매크로는 인수를 한 번만 평가하므로 위의 코드는 이중 평가 문제를 피할 수 있습니다. 위의 방법은 두 개의 정수 입력의 경우에만 작동합니다.
숫자 배열에 있는 최소값과 최대값을 찾으려면 위의 방법에서 두 개의 숫자만 비교하기 때문에 위의 방법을 사용할 수 없습니다. 배열의 경우 배열에 있는 최소값 또는 최대값을 찾기 위해 모든 요소를 함께 비교해야 합니다.
배열의 첫 번째 요소를 변수에 저장할 수 있으며 루프를 사용하여 이 요소를 배열의 다른 요소와 비교할 수 있습니다.
최대 개수의 경우 다음 요소가 배열에 있는 다음 요소보다 크면 저장된 요소가 배열에 존재하는 최대 요소가 아님을 의미하며 저장된 요소를 다음 요소로 대체합니다. 저장된 요소가 배열에 있는 모든 요소와 비교할 때까지 이 절차를 반복합니다.
최소 개수의 경우 다음 요소가 저장된 요소보다 작은 경우에만 저장된 요소를 다음 요소로 교체하고 저장된 요소가 배열에 있는 모든 요소와 비교할 때까지 이 절차를 반복합니다.
#include <stdio.h>
int MAX(int My_array[], int len);
int MIN(int My_array[], int len);
int main() {
int My_array[] = {6, 3, 15, 9, 10, 50, 99, 11};
int len = sizeof(My_array) / sizeof(My_array[0]);
int numMax = MAX(My_array, len);
int numMin = MIN(My_array, len);
printf("Max number = %d\n", numMax);
printf("Min number = %d", numMin);
return 0;
}
int MAX(int My_array[], int len) {
int num = My_array[0];
for (int i = 1; i < len; i++) {
if (My_array[i] > num) {
num = My_array[i];
}
}
return num;
}
int MIN(int My_array[], int len) {
int num = My_array[0];
for (int i = 1; i < len; i++) {
if (My_array[i] < num) {
num = My_array[i];
}
}
return num;
}
출력:
Max number = 99
Min number = 3
위의 코드에서 두 개의 입력 인수가 있는 MAX()
및 MIN()
두 함수를 만들었습니다. 첫 번째 인수는 지정된 배열이고 두 번째 인수는 배열의 길이입니다.
sizeof()
함수를 사용하여 전체 배열의 크기를 찾고 이를 배열의 첫 번째 요소 크기로 나누어 주어진 배열의 길이를 구했습니다.
MAX()
및 MIN()
함수 내에서 배열의 첫 번째 요소를 변수에 저장한 다음 정수 i
는 배열의 길이와 같아지며 루프가 배열의 끝에 도달했음을 의미합니다.
루프 내에서 if
문을 사용하여 배열의 다음 요소를 저장한 값과 비교하고 MAX()
의 경우 다음 요소가 저장된 요소보다 크면 값을 대체했습니다. 함수이고 MIN()
함수에서 다음 요소가 저장된 요소보다 작으면 값을 대체합니다. printf()
함수를 사용하여 MIN()
및 MAX()
함수에서 반환된 값을 인쇄했습니다.
위의 코드는 정수 데이터 유형의 배열에 대해서만 작동하지만 float
와 같은 다른 데이터 유형의 경우 최소 및 최대 숫자를 찾기 위해 위 코드를 변경할 수도 있습니다. 위의 코드에서 float
데이터 유형의 배열인 경우 int
데이터 유형을 float
로 변경해야 합니다.
예를 들어 배열의 데이터 유형은 float
가 되고 배열의 첫 번째 요소를 저장하는 데 사용되는 변수의 데이터 유형도 float
가 되며 길이의 데이터 유형은 동일하게 유지됩니다.