Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何组合两个功能?_C_Arrays_Visual Studio_Function_Recursion - Fatal编程技术网

C 如何组合两个功能?

C 如何组合两个功能?,c,arrays,visual-studio,function,recursion,C,Arrays,Visual Studio,Function,Recursion,我在我的项目中做了一件事,得到一个数组,找到最大值和最小值,我用两个独立的函数,我想把它们组合成一个函数。 我怎样才能正确地做到这一点 第一个函数查找数组中的最大值,第二个函数查找最小值,我尝试将其交给一个名为MinMaxArray的函数 守则: #include <stdio.h> #define MAX_SIZE 100 int maximum(int array[], int index, int len); int minimum(int array[], int ind

我在我的项目中做了一件事,得到一个数组,找到最大值和最小值,我用两个独立的函数,我想把它们组合成一个函数。 我怎样才能正确地做到这一点

第一个函数查找数组中的最大值,第二个函数查找最小值,我尝试将其交给一个名为MinMaxArray的函数

守则:

#include <stdio.h>
#define MAX_SIZE 100 

int maximum(int array[], int index, int len);
int minimum(int array[], int index, int len);


int main()
{
    int array[MAX_SIZE], N, max, min;
    int i;
    printf("Enter size of the array: ");
    scanf("%d", &N);
    printf("Enter %d elements in array: ", N);
    for (i = 0; i < N; i++)
    {
        scanf("%d", &array[i]);
    }

    max = maximum(array, 0, N);
    min = minimum(array, 0, N);

    printf("Minimum element in array = %d\n", min);
    printf("Maximum element in array = %d\n", max);

    return 0;
}



int maximum(int array[], int index, int len)
{
    int max;
    if (index >= len - 2)
    {
        if (array[index] > array[index + 1])
            return array[index];
        else
            return array[index + 1];
    }
    max = maximum(array, index + 1, len);

    if (array[index] > max)
        return array[index];
    else
        return max;
}


int minimum(int array[], int index, int len)
{
    int min;

    if (index >= len - 2)
    {
        if (array[index] < array[index + 1])
            return array[index];
        else
            return array[index + 1];
    }

    min = minimum(array, index + 1, len);

    if (array[index] < min)
        return array[index];
    else
        return min;
}

这里有两种选择。输出参数或返回结构

struct vector2d {
    int x;
    int y;
};

struct vector2d minmax1(int array[], int index, int len)
{
    struct vector2d ret;
    int max, min;
    // Calculate max and min however you want
    ret.x = max;
    ret.y = min;
    return ret;
}

void minmax1(int array[], int index, int len, int *minval, int *maxval)
{
    int max, min;
    // Calculate max and min however you want
    *minval = min;
    *maxval = max;
}

定义这样的结构以返回:

typedef struct
{
    int min;
    int max;
}vector;
职能1:

vector MinMax(int array[], int index, int len)
{
    vector temp;

    temp.min = minimum(array,index,len);     
    temp.max = maximum(array,index,len);  //using the two function written by you

    return temp;
}
函数2或:使用调试器了解函数的确切工作方式

vector MinMax(int array[], int len)      //len is from 0
{
    static vector v;                     // static variable

    v.min = array[len];                  // assign value of array respect to len
    v.max = array[len];

    if( (len-1) >= 0 )                   // check (len-1) is <= 0 to call function again
    {
       MinMax(array,len-1);
    }

    if(v.min > array[len])               //compare and store
        v.min = array[len];

    if(v.max < array[len])               //compare and store
        v.max = array[len];

    return v;                            //return 
}
谢谢。很抱歉英语不好,我的英语不好。另一个可行的选择是:


忘记这些函数,改为对数据进行Q排序。然后,只需抓取项目编号0和项目编号n-瞧,这是您的最小值和最大值。作为奖励,从现在起,可以使用Olog n对数据进行进一步搜索,因为它已排序。

只需为搜索数组最小值和最大值的组合函数声明两个参数就足够了

给你

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

struct Pair { size_t min; size_t max; }
minmax_element( const int a[], size_t n )
{
    struct Pair current = { .min = 0, .max = 0 };

    if ( !( n < 2 ) )
    {
        struct Pair prev = minmax_element( a + 1, n - 1 );

        if ( a[prev.min + 1] < a[current.min] ) current.min = prev.min + 1; 
        if ( a[current.max] < a[prev.max + 1] ) current.max = prev.max + 1; 
    }

    return current;
}

int main(void) 
{
    const size_t N = 10;
    int a[N];

    srand( ( unsigned int )time( NULL ) );

    for ( size_t i = 0; i < N; i++ )
    {
        a[i] = rand() % ( int )N;
    }

    for ( size_t i = 0; i < N; i++ )
    {
        printf( "%d ", a[i] );
    }
    putchar( '\n' );

    struct Pair minmax = minmax_element( a, N );

    printf( "The minimum element is %d at position %zu\n", 
            a[minmax.min], minmax.min );

    printf( "The maximum element is %d at position %zu\n", 
            a[minmax.max], minmax.max );

    return 0;
}


例如,生成一个新函数minmaxint array[],int index,int len,int mode。模式为1时返回最大值,为0时返回最小值。对于大型数组,递归搜索max和min可能会导致调用堆栈溢出。为什么是递归的?循环有什么问题?我被迫使用递归函数,因为这是大学讲师给我们的任务。@ShayFletcher遗憾的是,大多数教授递归的大学课程都是有害的。在现实世界中,可以并且应该使用递归的情况很少。让我难过的是,几乎每个初学者类似乎都在处理递归,因为初学者不知道什么时候使用递归是有意义的。大多数情况下,要像躲避瘟疫一样避开它。@Shay Fletcher你急着去哪里?看看我的答案。这实际上是最好的答案。为项而不是值提供索引是一个好主意,因为这样调用方就知道在arr[i]上找到了min,如果他们也想知道该值,就可以取消引用该项。@lundin。好主意另外,当len==0或array==NULL时,指针可以为NULL,以表示没有最小值。请提供否决投票的理由。这有助于在没有解释的情况下更正编解码器不是一个好答案。堆栈溢出不是免费的编码服务。它旨在提供问题和答案的持久存储库。答案最好能给出一般有用的信息,包括对编码技术的解释,而不仅仅是具体的代码。我没有投反对票。但在我看来,您添加的注释并没有讨论最重要的想法,即使用您添加的结构返回两个值。
9 1 2 9 1 0 7 1 5 5 
The minimum element is 0 at position 5
The maximum element is 9 at position 0
9 4 2 9 3 9 9 5 7 0 
The minimum element is 0 at position 9
The maximum element is 9 at position 0
4 3 4 9 1 3 6 9 3 3 
The minimum element is 1 at position 4
The maximum element is 9 at position 3