Continuamos revisando el tema de funciones, en la sección anterior presentamos generalidades de las funciones, es esta sección ahondaremos en sus características.
Anteriormente revisamos las funciones con parámetros fijos, es decir, al momento de compilar, le indicamos al compilador cuántos y de que tipo, una función recibirá los parámetros que se le pasen. De hecho es la forma más habitual de definir una función, recordemos la sintaxis.
[extern|static] <tipo_valor_retorno> [modificadores] <identificador>(<lista_parámetros>) { [sentencias] }
A modo de repaso definiremos un programa que utiliza funciones, a continuación desarrollamos un programa para realizar conversiones, te sugiero revisar el código, entenderlo y modificarlo.
El programa no realiza (ni pretende) ninguna tarea sofisticada, pero es un punto de partida que vale la pena revisar en su estructura en general.
A continuación te presentamos el código, como siempre es importante que lo analices y entiendas. Y después hagas de todo con él. Cambia todo lo que puedas cambiar y observa los resultados.
// cpp_58__funciones3.cpp // Este programa forma parte del tutorial de introducción al lenguaje C++ // http://a.ehack.info/leguaje-c-introduccion/ // Se ilustra el uso de funciones con varios parámetros y la llamada de funciones // por otra función // 2018, Por http://about.me/carlosgbr // Versión 1 // Compilado en https://www.onlinegdb.com/online_c++_compiler #include <iostream> using namespace std; float Suma(float x, float y) { return x+y; } float Resta(float x, float y) { return x-y; } float Producto(float x, float y) { return x*y; } float Division(float x, float y) { return x/y; } float Operacion(float x, float y, char operando) { float resultado = 0; switch (operando) { case '+': { resultado = Suma(x, y); break; } case '-': { resultado = Resta(x, y); break; } case '*': { resultado = Producto(x, y); break; } case '/': { resultado = Division(x, y); break; } } return resultado; } int main() { float operando1 = 0, operando2 = 0; char operador; cout << "Este programa realiza la operación solicitada sobre 2 operandos" << endl << endl; cout << "Escribe el símbolo de la operación que deseas realizar: + - * /" << endl; cin >> operador; cout << "Escribe el primero operando: "; cin >> operando1; cout << "Escribe el segundo operando: "; cin >> operando2; cout << "El resultado de " << operando1 << " " << operador << " " << operando2 << " = " << Operacion(operando1, operando2, operador) << endl; return 0; }
Cuando ejecutes el programa verás que aunque básico, ya es una unidad “autocontenida”, te ofrece una descripción, te guía en su uso, te presenta un menú, controla si quieres continuar realizando más conversiones, y termina de forma controlada. Nota que el simple hecho de solo aceptar 2 entradas (S/N) requiere muchas líneas de código, aunque no sean parte de la conversión de temperaturas.
Por otra parte el programa tiene un “error” premeditado, si observas los resultados de convertir grados centígrados a Kelvin y de Kelvin a grados Centígrados, están invertidos, como puedes apreciar en la siguiente salida del programa:
En este caso es solo cuestión de poner el cálculo correcto para cada conversión y para ello solo debemos modificar la función correspondiente, no es necesario tocar el código principal, reduciendo de este modo errores potenciales de olvidar cambiar cada punto en donde se utilice nuestra función.
Realiza el cambio de código entre las funciones de ºC a K y viceversa para que ofrezcan conversiones correctas.
Nuestras funciones pueden llamar a otras funciones (de hecho desde el primer programa hemos estado llamado a varias funciones), de modo que puedes definir funciones primitivas como los bloques sobre los cuales puedes construir funciones de mayor complejidad.
En el siguiente ejemplo se ilustra una función que recibirá 3 parámetros (recuerda que nuestras funciones pueden recibir cualquier cantidad de parámetros que necesitemos). Uno de los parámetros nos indicará la operación que queremos realizar (en nuestro caso solo consideramos la suma, resta, multiplicación y división real), los otros 2 parámetros serán los operandos.
Podríamos hacer todo en una función pero para ilustrar funciones que llaman a otras funciones, lo haremos todo en funciones distintas.
En la siguiente liga puedes descargar el código completo en donde puedes revisar el código, puedes notar que las funciones “primitivas” toman 2 parámetros y nuestra función principal toma 3 parámetros de los cuales uno es de tipo distinto.
Antes de ver el código, te sugiero que intentes generar las funciones que permitan que el código principal que a continuación se muestra, funcione.
int main() { float operando1 = 0, operando2 = 0; char operador; cout << "Este programa realiza la operación solicitada sobre 2 operandos" << endl << endl; cout << "Escribe el símbolo de la operación que deseas realizar: + - * /" << endl; cin >> operador; cout << "Escribe el primero operando: "; cin >> operando1; cout << "Escribe el segundo operando: "; cin >> operando2; cout << "El resultado de " << operando1 << " " << operador << " " << operando2 << " = " << Operacion(operando1, operando2, operador) << endl; return 0; }
A continuación te muestro 2 posibles salidas del programa:
Nota: Esta es otra de las características de las funciones, puedes asignar la implementación de funciones a tu equipo de trabajo, solo definiendo la información que vas a proporcionar y el valor que deseas recibir. De modo que la implementación no afecte el desarrollo de otras partes del código.
C++. como herencia de C nos permite pasar un número variable de parámetros a una función, de modo que no es necesario saber cuántos parámetros recibirá una función al momento de compilarla.
Para utilizar parámetros variables, es necesario tener en consideración algunos puntos importantes(1):
tipo funcion (tipo last, ... );
en donde,
Para poder utilizar una lista de argumentos variable C++ tienen definido en el archivo de cabecera estándar stdarg.h una serie de macros y un tipo de dato, que nos permiten gestionar las l istas de argumentos variables.
Macros, búfer, direcciones de memoria, cast, typedef, promoción, cabecera, pseudocódigo… En 2 párrafos un mundo de términos que ni en todo lo que va de este tutorial… si no estudias sistemas, te pido ignores estos términos. No los necesitarás. Pero es imprescindible, por rigor, utilizar los términos para documentar adecuadamente los parámetros variables.
A continuación tienes el pseudocódigo que muestra el uso de parámetros variables en funciones.
tipo funcionVariable(tipo ultimo , ...) { va_list pa; tipo_X argumento_de_tipo_X; va_start(pa, ultimo); while (quedanArgumentos) argumento_de_tipo_X = va_arg(pa, tipo_X); va_end(pa); }
// cpp_59_funciones4.cpp // Este programa forma parte del tutorial de introducción al lenguaje C++ // http://a.ehack.info/leguaje-c-introduccion/ // Se ilustra el uso de parámetros variables en una función // 2018, Por http://about.me/carlosgbr // Versión 1 // Compilado en https://www.onlinegdb.com/online_c++_compiler #include <iostream> #include <stdarg.h> // Necesaria para utilizar va_list, va_start, va_arg, va_end using namespace std; float Promedio(int calificacion, ...) // Los ... indican que son parC!metros variables { float sumaCalif = 0; int cuenta = 0; int indice = calificacion; // C-dice = calificacion para determinar un punto // para determinar cuando es el C:ltimo valor. va_list marcador; // Definimos a marcador como lista variable va_start(marcador, calificacion); // Asignamos el argumento al puntero marcador while (indice != -1){ sumaCalif += indice; cuenta++; indice = va_arg(marcador,int); //recuperamos el valor actual de marcador // le asignamos tipo } va_end (marcador); // Terminamos la lista variable return sumaCalif; } int main() { cout << "La suma de boletas entregadas es: " << Promedio(1,2,3,9,-1) << endl; cout << "La suma de boletas entregadas es: " << Promedio(6, 8, 9, 10, 4, 7, 9,-1) << endl; cout << "La suma de boletas entregadas es: " << Promedio(10, 7,-1) << endl; cout << "La suma de boletas entregadas es: " << Promedio(10, 10, 0,-1) << endl; return 0; }
Puedes comprobar que nuestra función recibe cualquier número de argumentos y realiza la suma de los mismos. Puedes probar mejorar el código haciendo que sea el usuario quien introduzca los números a sumar.
En los comentarios dentro del programa se realizan las observaciones que considero oportunas.
Después de los punteros, creo que este tema es el más complejo, expuesto hasta el momento. Por el perfil de este tutorial (para no programadores) dejo en este punto la exposición de parámetros variables en funciones. El objetivo es dejar señalada la existencia de este tema y una exposición inicial. Si el lector desea profundizar en el tema, antes de publicar nuestro curso para programadores, les sugiero revisar las siguientes lecturas:
- Parámetros y Argumentos en el Lenguaje de Programación C++ del Ing. Ubaldo José Bonaparte
- Argumentos variables de Fernando A. Gómez F.
- Funciones con listas de argumentos de variable (C++) de Microsoft Developer Network
- Parámetros y argumentos de Zator.com
Para finalizar este tema concluyo con un extracto de la obra del Ing. Ubaldo José Bonaparte (2):
“Los parámetros juegan un papel demasiado importante en los desarrollos, donde el programador haciendo el uso adecuado de los mismos, alimentará el buen hábito de controlar exhaustivamente la persistencia y manipulación de sus variables u objetos y como consecuencia mantendrá distancia de los efectos colaterales. En la actualidad, la programación con lenguajes como Java, J#, .Net, C# y otros, continua sobre la base de los conceptos expuestos. De modo tal que recomendamos este artículo, especialmente a principiantes que deseen manejar cuidadosamente los parámetros y argumentos.”
Funciones II en C++ by Roberto C. González is licensed under a Creative Commons Reconocimiento-NoComercial-CompartirIgual 4.0 Internacional License.
El comando dnsenum es una herramienta de línea de comandos para realizar enumeración de DNS…
En esta entrada te presento 24 de las listas negras más comunes que los servidores…
ZoomIt es una herramienta de anotación y zoom de pantalla para presentaciones técnicas que incluyen…
WinObj es el visor de espacios de nombres de Object Manager definitivo. Es la primera…
Whois realiza el registro de registro para el nombre de dominio o la dirección IP…
VolumeID – Esta utilidad, le permite cambiar los identificadores de los discos FAT y NTFS…