使用可變引數函式查詢和、最大值和最小值的 C 程式


假設我們想建立一些可以接收多個引數的函式,並且引數的數量沒有固定。我們想要建立三個函式 sum()、max() 和 min(),它們分別可以計算數字的總和、數字的最大值和給定數字的最小值。這些函式中的每一個都將引數數量作為其第一個引數。為了定義這種型別的函式,我們需要在函式引數中使用省略號 (...) 三個點。要使用它,我們必須包含 stdarg.h 標頭檔案。這種型別的函式稱為可變引數函式。要訪問可變引數,我們可以注意到四種不同的情況:

  • va_list:儲存所有給定的引數

  • va_start:開始訪問可變引數 ap 變數

  • va_arg:用於檢索給定型別的下一個引數

  • va_end:結束訪問可變引數列表

因此,如果我們呼叫如下函式:

  • sum(5, 5, 2, 8, 9, 3)
  • max(3, 5, 9, 2)
  • min(6, 8, 5, 2, 6, 7, 9)

那麼輸出將是 27(所有五個數字的總和)、9(給定的三個數字中的最大值)、2(給定的六個數字中的最小值)。

為了解決這個問題,我們將遵循以下步驟:

定義一個函式 sum(),它將接收 cnt 和可變數量的引數

  • 定義 va_list ap
  • 透過 va_start(ap, cnt) 初始化 ap
  • n := 0
  • 對於初始化 i := 0,當 i < cnt 時,更新(將 i 增加 1),執行
    • n := n + 透過 va_arg(ap, int) 獲取的下一個引數
  • 透過 va_end(ap) 結束訪問 ap
  • 返回 n
  • 定義一個函式 min(),它將接收 cnt 和可變數量的引數
  • 定義 va_list ap
  • 透過 va_start(ap, cnt) 初始化 ap
  • minimum := 99999
  • 對於初始化 i := 0,當 i < cnt 時,更新(將 i 增加 1),執行
    • current := 透過 va_arg(ap, int) 獲取的下一個引數
    • 如果 current < minimum,則
      • minimum := current
  • 透過 va_end(ap) 結束訪問 ap
  • 返回 minimum
  • 定義一個函式 max(),它將接收 cnt 和可變數量的引數
  • 定義 va_list ap
  • 透過 va_start(ap, cnt) 初始化 ap
  • maximum := 0
  • 對於初始化 i := 0,當 i < cnt 時,更新(將 i 增加 1),執行
    • current := 透過 va_arg(ap, int) 獲取的下一個引數
    • 如果 current > maximum,則
      • maximum := current
  • 透過 va_end(ap) 結束訪問 ap
  • 返回 maximum

示例

讓我們看看以下實現,以便更好地理解:

#include <stdio.h>
#include <stdarg.h>
int sum (int cnt,...) {
    va_list ap;
    int i, n;
    va_start(ap, cnt);
    n = 0;
    for (i=0;i<cnt;i++){
        n += va_arg(ap, int);
     }
    va_end(ap);
    return n;
}
int min(int cnt,...) {
    va_list ap;
    int i, current, minimum;
    va_start(ap, cnt);
    minimum = 99999;
    for (i=0;i<cnt;i++){
        current = va_arg(ap, int);
        if (current < minimum)
            minimum = current;
    }
    va_end(ap);
    return minimum;
}
int max(int cnt,...) {
    va_list ap;
    int i, current, maximum;
    va_start(ap, cnt);
    maximum = 0;
    for (i=0;i<cnt;i++){
        current = va_arg(ap, int);  
        if (current > maximum)
            maximum = current;
    }
    va_end(ap);
    return maximum;
}
int main(){
    printf("%d
",sum(5, 5, 2, 8, 9, 3));     printf("%d
",max(3, 5, 9, 2));     printf("%d
",min(6, 8, 5, 2, 6, 7, 9)); }

輸入

sum(5, 5, 2, 8, 9, 3)
max(3, 5, 9, 2)
min(6, 8, 5, 2, 6, 7, 9)

輸出

27
9
2

更新於: 2021年10月8日

2K+ 次瀏覽

開啟您的 職業生涯

透過完成課程獲得認證

開始學習
廣告