29 - Parámetros de métodos de tipo puntero


Hemos visto que cuando un método debe retornar un dato disponemos al principio del método el tipo de dato que retornará (int, float etc.) y dentro del método especificamos con la palabra return el valor que devuelve.
¿Qué sucede si queremos retornar dos valores o más en un solo método? Una forma de solucionar este problema es pasar la dirección de dos variables y que las reciban dos parámetros de tipo puntero, luego por medio de estos punteros modificamos las variables que les pasamos por ejemplo desde la main.

Problema 1:

Confeccionar una clase que permita administrar un vector de 5 enteros. Definir dos métodos: uno que permita cargar el vector y otro que retorne el mayor y el menor valor del vector. Emplear dos punteros para poder retornar dos datos en un único método.

Programa:

#include<iostream>

using namespace std;

class Vector {
    int vec[5];
public:
    void cargar();
    void retornarMayorMenor(int *pmay, int *pmen);
};

void Vector::cargar()
{
    for (int f = 0; f < 5; f++)
    {
        cout << "Ingrese componente:";
        cin >> vec[f];
    }
}

void Vector::retornarMayorMenor(int *pmay, int *pmen)
{
    *pmay = vec[0];
    *pmen = vec[0];
    for (int f = 1; f < 5; f++)
    {
        if (vec[f]>*pmay)
        {
            *pmay = vec[f];
        }
        else
        {
            if (vec[f]<*pmen)
            {
                *pmen = vec[f];
            }
        }
    }
}


int main()
{
    Vector vector1;
    vector1.cargar();
    int ma, me;
    vector1.retornarMayorMenor(&ma, &me);
    cout << "El elemento mayor del vector es:" << ma << "\n";
    cout << "El elemento menor del vector es:" << me << "\n";
    return 0;
}

Este proyecto lo puede descargar en un zip desde este enlace : ParametrosPuntero1.zip

Es muy importante entender como funciona el método retornarMayorMenor. En la main definimos dos variables de tipo entera:

    int ma, me;

Y llamamos al método rotornarMayorMenor enviándole la dirección de estas dos variables (recordemos que mediante el operador & se accede a la dirección de una variable):

    vector1.retornarMayorMenor(&ma, &me);

Como estamos enviando direcciones de variables el método debe tener parámetros de tipo puntero como lo son *pmay y *pmen:

void Vector::retornarMayorMenor(int *pmay, int *pmen)

Mediante estos dos punteros estamos accediendo a las variables definidas en la main llamadas: ma y me.

Cargamos en las dos variables definidas en la main (accediendo a las mismas por los punteros) la primer componente del vector:

    *pmay = vec[0];
    *pmen = vec[0];

Luego mediante un for recorremos el resto del vector para ver si hay alguna componente más grande a la que hemos considerado hasta ahora la mayor (lo mismo hacemos para la menor componente):

    for (int f = 1; f < 5; f++)
    {
        if (vec[f]>*pmay)
        {
            *pmay = vec[f];
        }
        else
        {
            if (vec[f]<*pmen)
            {
                *pmen = vec[f];
            }
        }
    }

Como podemos observar luego en la main cuando imprimimos los contenidos de las variables ma y me aparecen en pantalla el valor mayor y menor del vector:

    cout << "El elemento mayor del vector es:" << ma << "\n";
    cout << "El elemento menor del vector es:" << me << "\n";

Como vemos en ningún momento asignamos valores directamente a las variables ma y me, sino que lo hicimos con los parámetros que apuntan a dichas variables.

Problema propuesto

  1. Crear una matriz de 3 filas por 3 columnas. Implementar un método que permita cargar todas sus componentes, otro que la imprima y otra método que retorne la fila y columna (retorna dos datos el método) donde se encuentra el mayor elemento del vector (si está repetido retorne la posición de cualquiera de ellos)
Solución
#include<iostream>

using namespace std;

class Matriz {
private:
    int mat[3][3];
public:
    void cargar();
    void imprimir();
    void retornarFilaColumna(int *pf, int *pc);
};

void Matriz::cargar()
{
    for (int f = 0; f < 3; f++)
    {
        for (int c = 0; c < 3; c++)
        {
            cout << "Ingrese componente:";
            cin >> mat[f][c];
        }
    }
}

void Matriz::imprimir()
{
    for (int f = 0; f < 3; f++)
    {
        for (int c = 0; c < 3; c++)
        {
            cout << mat[f][c] << " ";
        }
        cout << "\n";;
    }
}

void Matriz::retornarFilaColumna(int *pf, int *pc)
{
    int mayor = mat[0][0];
    *pf = 0;
    *pc = 0;
    for (int f = 0; f < 3; f++)
    {
        for (int c = 0; c < 3; c++)
        {
            if (mat[f][c] > mayor)
            {
                mayor = mat[f][c];
                *pf = f;
                *pc = c;
            }
        }
    }
}


int main()
{
    Matriz matriz1;
    matriz1.cargar();
    matriz1.imprimir();
    int fila,  columna;
    matriz1.retornarFilaColumna(&fila, &columna);
    cout << "Fila donde se encuentra el mayor:" << fila <<"\n";
    cout << "Columna donde se encuentra el mayor:" << columna<< "\n";
    return 0;
}

Este proyecto lo puede descargar en un zip desde este enlace :ParametrosPuntero2.zip

Retornar