¿Cómo devolver múltiples valores de una función en C o C++?

Los nuevos programadores generalmente buscan formas de devolver múltiples valores de una función. Desafortunadamente, C y C++ no permiten esto directamente. Pero afortunadamente, con un poco de programación inteligente, podemos lograrlo fácilmente. A continuación se muestran los métodos para devolver múltiples valores de una función en C:

  1. Mediante el uso de punteros.
  2. Mediante el uso de estructuras.
  3. Mediante el uso de arrays.

Ejemplo: Considere un ejemplo donde la tarea es encontrar el mayor y el menor de dos números distintos. Podríamos escribir múltiples funciones. El problema principal es la molestia de llamar a más de una función, ya que necesitamos devolver múltiples valores y, por supuesto, tener más líneas de código para escribir.

  1. Devolver múltiples valores Usando punteros: Pase el argumento con su dirección y realice cambios en su valor usando el puntero. Para que los valores se cambien al argumento original. 

C++

// Modified program using pointers
#include <iostream>
using namespace std;
 
// add is the short name for address
void compare(int a, int b, int* add_great, int* add_small)
{
    if (a > b) {
 
        // a is stored in the address pointed
        // by the pointer variable *add_great
        *add_great = a;
        *add_small = b;
    }
    else {
        *add_great = b;
        *add_small = a;
    }
}
 
// Driver code
int main()
{
    int great, small, x, y;
 
    cout << "Enter two numbers: \n";
    cin >> x >> y;
 
    // The last two arguments are passed
    // by giving addresses of memory locations
    compare(x, y, &great, &small);
    cout << "\nThe greater number is " << great << " and the smaller number is "
      << small;
 
    return 0;
}
 
// This code is contributed by sarajadhav12052009

C

// Modified program using pointers
#include <stdio.h>
 
// add is the short name for address
void compare(int a, int b, int* add_great, int* add_small)
{
    if (a > b) {
 
        // a is stored in the address pointed
        // by the pointer variable *add_great
        *add_great = a;
        *add_small = b;
    }
    else {
        *add_great = b;
        *add_small = a;
    }
}
 
// Driver code
int main()
{
    int great, small, x, y;
 
    printf("Enter two numbers: \n");
    scanf("%d%d", &x, &y);
 
    // The last two arguments are passed
    // by giving addresses of memory locations
    compare(x, y, &great, &small);
    printf("\nThe greater number is %d and the smaller number is %d",
           great, small);
 
    return 0;
}
Producción:

Enter two numbers: 
5 8
The greater number is 8 and the smaller number is 5
  1. Devolver múltiples valores usando estructuras: como la estructura es un tipo de datos definido por el usuario. La idea es definir una estructura con dos variables enteras y almacenar los valores mayores y menores en esas variables, luego usar los valores de esa estructura. 

C

// Modified program using structures
#include <stdio.h>
struct greaterSmaller {
    int greater, smaller;
};
 
typedef struct greaterSmaller Struct;
 
Struct findGreaterSmaller(int a, int b)
{
    Struct s;
    if (a > b) {
        s.greater = a;
        s.smaller = b;
    }
    else {
        s.greater = b;
        s.smaller = a;
    }
 
    return s;
}
 
// Driver code
int main()
{
    int x, y;
    Struct result;
 
    printf("Enter two numbers: \n");
    scanf("%d%d", &x, &y);
 
    // The last two arguments are passed
    // by giving addresses of memory locations
    result = findGreaterSmaller(x, y);
    printf("\nThe greater number is %d and the"
           "smaller number is %d",
           result.greater, result.smaller);
 
    return 0;
}
Producción:

Enter two numbers: 
5 8
The greater number is 8 and the smaller number is 5
  1. Devolver valores múltiples usando una array (funciona solo cuando los elementos devueltos son del mismo tipo): cuando una array se pasa como argumento, su dirección base se pasa a la función, por lo que, independientemente de los cambios realizados en la copia de la array, se cambia en la array original. A continuación se muestra el programa para devolver valores múltiples usando una array, es decir, almacenar un valor mayor en arr[0] y menor en arr[1]. 

C++

// Modified program using array
#include <iostream>
using namespace std;
 
// Store the greater element at 0th index
void findGreaterSmaller(int a, int b, int arr[])
{
 
    // Store the greater element at
    // 0th index of the array
    if (a > b) {
        arr[0] = a;
        arr[1] = b;
    }
    else {
        arr[0] = b;
        arr[1] = a;
    }
}
 
// Driver code
int main()
{
    int x, y;
    int arr[2];
 
    cout << "Enter two numbers: \n";
    cin >> x >> y;
 
    findGreaterSmaller(x, y, arr);
 
    cout << "\nThe greater number is " << arr[0]  << " and the "
           "smaller number is " << arr[1];
 
    return 0;
}
 
// This code is contributed by sarajadhav12052009

C

// Modified program using array
#include <stdio.h>
 
// Store the greater element at 0th index
void findGreaterSmaller(int a, int b, int arr[])
{
 
    // Store the greater element at
    // 0th index of the array
    if (a > b) {
        arr[0] = a;
        arr[1] = b;
    }
    else {
        arr[0] = b;
        arr[1] = a;
    }
}
 
// Driver code
int main()
{
    int x, y;
    int arr[2];
 
    printf("Enter two numbers: \n");
    scanf("%d%d", &x, &y);
 
    findGreaterSmaller(x, y, arr);
 
    printf("\nThe greater number is %d and the "
           "smaller number is %d",
           arr[0], arr[1]);
 
    return 0;
}
Producción:

Enter two numbers: 
5 8
The greater number is 8 and the smaller number is 5

Métodos solo de C++

  1. Devolver valores múltiples usando referencias: Usamos referencias en C++ para almacenar valores devueltos. 

CPP

// Modified program using References in C++
#include <stdio.h>
 
void compare(int a, int b, int &add_great, int &add_small)
{
    if (a > b) {
        add_great = a;
        add_small = b;
    }
    else {
        add_great = b;
        add_small = a;
    }
}
 
// Driver code
int main()
{
    int great, small, x, y;
 
    printf("Enter two numbers: \n");
    scanf("%d%d", &x, &y);
 
    // The last two arguments are passed
    // by giving addresses of memory locations
    compare(x, y, great, small);
    printf("\nThe greater number is %d and the"
           "smaller number is %d",
           great, small);
 
    return 0;
}
Producción:

Enter two numbers: 
5 8
The greater number is 8 and the smaller number is 5
  1. Devolver múltiples valores usando Clase y Objeto: La idea es similar a las estructuras. Creamos una clase con dos variables enteras y almacenamos los valores mayores y menores en esas variables, luego usamos los valores de esa estructura. 

CPP

// Modified program using class
#include <stdio.h>
 
class GreaterSmaller {
public:
    int greater, smaller;
};
 
GreaterSmaller findGreaterSmaller(int a, int b)
{
    GreaterSmaller s;
    if (a > b) {
        s.greater = a;
        s.smaller = b;
    }
    else {
        s.greater = b;
        s.smaller = a;
    }
 
    return s;
}
 
// Driver code
int main()
{
    int x, y;
    GreaterSmaller result;
 
    printf("Enter two numbers: \n");
    scanf("%d%d", &x, &y);
 
    // The last two arguments are passed
    // by giving addresses of memory locations
    result = findGreaterSmaller(x, y);
    printf("\nThe greater number is %d and the"
           "smaller number is %d",
           result.greater, result.smaller);
 
    return 0;
}
Producción:

Enter two numbers: 
5 8
The greater number is 8 and the smaller number is 5
  1. Devolver múltiples valores usando tupla STL: La idea es similar a las estructuras. Creamos una tupla con dos variables enteras y devolvemos la tupla, y luego dentro de la función principal usamos la función de enlace para asignar valores a min y max que devuelve la función. 

CPP

// Modified program using C++ STL tuple
#include<iostream>
#include<tuple>
 
using namespace std;
 
tuple <int, int> findGreaterSmaller(int a, int b)
{
    if (a < b) {
    return make_tuple(a, b);
    }
    else {
    return make_tuple(b, a);
    }
}
 
// Driver code
int main()
{
    int x = 5, y= 8;
    int max, min;
    tie(min, max) = findGreaterSmaller(x, y);
 
    printf("The greater number is %d and the "
        "smaller number is %d",
        max, min);
 
    return 0;
}
 
// This article is contributed by Blinkii
Producción:

The greater number is 8 and the smaller number is 5

Publicación traducida automáticamente

Artículo escrito por Amrutesh99 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *