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

在上面的程式碼中,? symbol 是三元運算子,用於代替 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