函数在C中获得最少三个或更多参数

时间:2013-08-28 12:41:30

标签: c minimum math.h

在C / C ++的 库中,函数fmin(x,y)返回两个参数x和y的最小值,如the C++ reference中所述。 / p>

但是,是否有类似的函数fminimum(a,b,c,... x,y,z)可用于查找相同数据类型的三个或更多参数的最小值?

编辑:抱歉混淆。这个问题仅限于C,所以没有C ++

4 个答案:

答案 0 :(得分:9)

注意:问题最初标记为C ++。原始答案仅适用于C ++,但我提供了遵循相同原则的C解决方案。

这个想法是表示一个范围的开始和一个结束的指针传递给函数,并返回指向最小元素的指针。

int* min_element(int *start, int *end)
{
    if (start == end) return end;

    int *min = start++;
    for (; start != end; ++start)
        if (*start < *min) min = start;

    return min;
}

用法:

int data[] = {1, 5, 3, 66, 4, 81, 23, 2, 6};
int * min = min_element(data, data + 9);
if (min != data + 9)
{
  // range was not empty, min value is *min
}

原始C++回答std::min_element,它为您提供了迭代器,它是由一对迭代器指定的范围中的最小元素。

int arr[] = { 3,1,6,8,9,34,17,4,8};
auto it = std::min_element(std::begin(arr), std::end(arr));

编辑2 :从已删除的答案中,C ++ 11有一个std::min重载,需要initializer_list,所以你可以说

auto minval = std::min({a, b, c, x, y, z});

其中abc等都是支持operator<的一种类型。

答案 1 :(得分:5)

老式的方式......

int arr[] = { 1, 3, 6, 100, 50, 72 };

int min_array( int arr[], int len )
{
    int min = arr[0];

    for ( int i = 1; i < len; i++ )
        if ( arr[i] < min )
            min = arr[i];

    return min;
}

答案 2 :(得分:3)

“任意数量的参数”的问题是你怎么知道有多少。

std::minstd::min_element通过处理容器来解决这个问题 - 换句话说,我们知道多少感谢容器对象本身知道多少容器。

在简单的C中,你无法真正做到这一点。所以需要一些其他的方法。

一种方法是使用<cstdarg>,并使用特殊值标记结尾:

#include <iostream>
#include <cstdarg>

using namespace std;

int countargs(int arg, ...)
{
    if (arg == -1)
    return 0;

    int count = 1;   // arg is not -1, so we have at least one arg.
    va_list vl;
    int cur;
    va_start(vl, arg);
    for(;;)
    {
    cur = va_arg(vl, int);
    if(cur == -1)
        break;
    count++;
    }
    va_end(vl);
    return count;
}


int main()
{
    cout << "Should give 0: " << countargs(-1) << endl;
    cout << "Should give 1: " << countargs(1, -1) << endl; 
    cout << "Should give 3: " << countargs(1, 2, 3, -1) << endl;
    cout << "Should give 6: " << countargs(1, 2, 3, 1, 2, 3, -1) << endl;
    cout << "Should give 12: " << countargs(1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, -1) << endl;
    return 0;
}

上面没有说明如何获得min值,但不应该难以弄清楚。它也是C ++,但并不依赖任何特殊的C ++特性。

“标记结束”的替代方法是将元素数量传递给函数本身。

当然,如果参数在数组中,真正的解决方案就是遍历它们。如果没有那么多,你当然可以使用:

v = min(a, min(b, min(c, d)));; 

答案 3 :(得分:0)

唯一可以执行此操作的libc函数会做更多事情,因为它会排序,这可能被视为过度杀伤。它是qsort()