使用可变参数函数查找和、最大值和最小值的 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
广告
数据结构
网络
关系型数据库管理系统
操作系统
Java
iOS
HTML
CSS
Android
Python
C 编程
C++
C#
MongoDB
MySQL
Javascript
PHP