C의 MIN 및 MAX 함수

Ammar Ali 2023년10월12일
C의 MIN 및 MAX 함수

이 튜토리얼에서는 매크로 또는 루프를 사용하여 C에서 MINMAX 기능을 구현하는 방법에 대해 설명합니다.

C의 MINMAX 기능

MINMAX 기능은 두 값에서 최소값과 최대값을 찾는 데 사용되며 C 언어에서는 사전 정의되지 않습니다. MINMAX 기능을 사용하려면 C에서 정의해야 합니다.

매크로를 사용하여 C 언어에서 MINMAX 기능을 정의할 수 있습니다. 매크로는 변수 값과 기능을 정의하는 데 사용되는 코드 세그먼트입니다.

매크로를 호출하면 해당 값이나 함수로 대체됩니다. 예를 들어 PI와 같은 변수의 값을 정의할 수 있으며 코드에서 PI라는 이름을 사용할 때 이름은 해당 값으로 대체됩니다.

매크로를 코드에 이름을 쓰면 호출되는 함수로 정의할 수도 있습니다. #define 키워드를 사용하여 C 언어에서 매크로를 정의합니다.

예를 들어, C 언어 매크로를 사용하여 MINMAX 기능을 정의해 보겠습니다. 아래 코드를 참조하십시오.

#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__ 명령을 사용하여 MINMAX 기능을 정의하여 위의 문제를 피할 수 있으므로 더 안전하고 버그가 적습니다.

__typeof__ 명령은 표현식의 유형을 나타냅니다. 표현식 및 유형과 함께 typeof 명령을 사용할 수 있습니다.

예를 들어 __typeof__ 명령을 사용하여 위의 MINMAX 함수를 정의해 보겠습니다. 아래 코드를 참조하십시오.

#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가 되며 길이의 데이터 유형은 동일하게 유지됩니다.

작가: Ammar Ali
Ammar Ali avatar Ammar Ali avatar

Hello! I am Ammar Ali, a programmer here to learn from experience, people, and docs, and create interesting and useful programming content. I mostly create content about Python, Matlab, and Microcontrollers like Arduino and PIC.

LinkedIn Facebook

관련 문장 - C Function