1
votes

Comment combiner deux fonctions?

Je travaille dans mon projet sur quelque chose qui obtient un tableau et trouve les nombres max et min et je l'ai fait avec deux fonctions distinctes et je veux les combiner en une seule fonction. Comment puis-je faire ça correctement?

La première fonction trouve le nombre maximum dans le tableau et la deuxième fonction trouve le minimum et j'essaye de l'amener à une fonction appelée MinMaxArray par exemple.

LE CODE:

#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;
}


7 commentaires

Par exemple, créez une nouvelle fonction minmax (int array [], int index, int len, int mode) . Lorsque mode vaut 1, il renvoie le maximum, lorsqu'il est 0, il renvoie le minimum.


Votre recherche récursive de max et min peut, pour les grands tableaux, provoquer un débordement de la pile des appels. Pourquoi récursif de toute façon? Quel est le problème avec une boucle? Cela faciliterait également la fusion des deux fonctions.


Je suis obligé d'utiliser des fonctions récursives car c'est la tâche que nous a confiée le professeur d'université.


@ShayFletcher La plupart des cours universitaires qui enseignent la récursivité sont malheureusement nuisibles. Il existe très peu de cas réels où vous pouvez et devez utiliser la récursivité. Cela m'attriste que presque toutes les classes de débutants semblent aborder la récursivité, car les débutants ne peuvent pas dire quand il est logique de l'utiliser. Le plus souvent, évitez-le comme la peste.


@Shay Fletcher Où êtes-vous pressé? Voyez ma réponse. C'est en fait la meilleure réponse.


@VladfromMoscow c'est une bonne réponse mais je ne peux pas utiliser #include


@ShayFletcher C'est juste un programme démonstratif. J'ai montré comment la fonction peut être écrite. Vous pouvez utiliser votre fonction avec vos propres tableaux. Vous avez choisi une mauvaise réponse comme la meilleure.


4 Réponses :


0
votes

Deux options ici. Affiche des arguments ou renvoie une structure.

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;
}


2 commentaires

Fournir un index des éléments au lieu des valeurs est une bonne idée, car l'appelant sait que min se trouve à arr [i] et s'il veut également connaître la valeur, il peut simplement -référencer cet élément.


@lundin. Bonne idée. De même, lorsque len == 0 (ou array == NULL), le pointeur peut être NULL pour n'indiquer aucun minimum.



-2
votes

Définissez une structure comme celle-ci pour renvoyer:

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 
}

Fonction 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;
}

Fonction 2 (ou): (utilisez le débogueur pour savoir comment la fonction fonctionne exactement)

typedef struct
{
    int min;
    int max;
}vector;

Merci. (Désolé pour le mauvais anglais, je ne suis pas bien en anglais)


3 commentaires

Veuillez indiquer une raison pour voter contre. Cela aide à corriger le code


Le code sans explication n'est pas une bonne réponse. Stack Overflow n'est pas destiné à être un service de codage gratuit. Il est destiné à fournir un référentiel durable de questions et réponses. De préférence, les réponses devraient donner des informations généralement utiles, y compris des explications sur les techniques de codage, et pas seulement un code spécifique.


Je n'ai pas voté contre. Mais il me semble que les commentaires que vous avez ajoutés ne traitent pas de l'idée la plus importante, l'utilisation de la structure que vous avez ajoutée pour renvoyer deux valeurs.



0
votes

Une autre option viable:

Oubliez ces fonctions et qsort vos données à la place. Ensuite, saisissez simplement le numéro d'article 0 et le numéro d'article n - voilà, il y a votre min et votre max. En prime, une recherche plus approfondie dans les données peut être effectuée avec "O (log n)" à partir de maintenant, car elles sont triées.


0 commentaires

0
votes

Il suffit de déclarer seulement deux paramètres pour la fonction combinée de recherche du minimum et du maximum d'un tableau.

Vous y êtes.

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

Voici plusieurs sorties de programme possibles.

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

ou

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

ou

#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;
}


0 commentaires