Guía # 10: Funciones definidas por el programador, Parte II UNIVERSIDAD DON BOSCO FACULTAD DE ESTUDIOS TECNOLÓGICOS COORDINACION DE COMPUTACION CICLO: 01/ 2015 Nombre de la Practica: Lugar de Ejecución: Estimado: MATERIA: GUIA DE LABORATORIO #10 Funciones definidas por el programador, Parte II Centro de Computo Tiempo 2 horas y 30 minutos Introducción a la Programación I. OBJETIVOS Que el alumno sea capaz de: Determinar correctamente cuando utilizar un parámetro por valor o un parámetro por referencia. Seleccionar el listado apropiado de parámetros que utilizara una nueva función al ser invocada. Transferir correctamente arreglos y matrices entre funciones por medio de parámetros. Desarrollar diferentes definiciones para una misma funcion (sobrecarga de funciones) II. INTRODUCCION TEORICA Tipo de dato de retorno de una función Las funciones en C++ las podemos dividir en varios tipos: Procedimiento Es una función que realiza una tarea específica pero que no devuelve valores al programa principal o a la función que la llamó. El tipo de dato de retorno se indica con void. void funcion() Función Función que realiza operaciones con los argumentos o manipulan datos y devuelven un valor (TipoDatoRetorno) con la sentencia return(expresión). TipoDatoRetorno funcion(ListaParametros){ ... return(expresión); … } Una vez que se ejecuta una sentencia return(), termina la ejecución de la función. 1 Guía # 10: Funciones definidas por el programador, Parte II Una función puede tener cualquier número de sentencias return en su cuerpo de instrucciones, pero al menos debe haber una. El valor a retornar puede ser el resultado de alguna operaciones ó un indicador de si la manipulación de los datos ha sido exitosa o no. El tipo de dato a devolver (TipoDatoRetorno) puede ser: + Tipo dato simple (int, char, etc.) + Tipos compuestos (struct) + Matrices + Cualquier objeto/puntero de C++ Cuando se llama a este tipo de funciones, puede haber una variable que guarde el valor que devolverá la función, es decir, la función se escribe en una sentencia de asignación, por ej. TipoDatoRetorno variable; variable = funcion(ListaParametros); Lista de parámetros de una función C++ proporciona dos métodos para realizar ésta transferencia de datos hacia o desde una función. • Paso de parámetros por valor • Cuando se llama a la función, se pasa solo el valor de la variable argumento. • Este método también se llama paso por copia. • El compilador hace una copia de los parámetros. Esto implica que cualquier modificación en el valor de los parámetros no se mantiene cuando termina la función. • Este método se utiliza cuando no se necesita que se modifiquen los argumentos con los que se llama a la función Para pasar un parámetro por referencia, hay que poner el operador de dirección & detrás del tipo del parámetro, ej.: void inversa (int &a){ } Los arrays como parámetros No hace falta añadir el operador de dirección & cuando el parámetro que se pasa en un array. Sobrecarga de funciones Lenguaje C++ permite definir varias funciones diferentes y que cuente cada una de ellas con el mismo identificador. A este listado de varias funciones llamadas igual se le conoce como “Sobrecarga de funciones”. En otras palabras, sobrecargar una función significa incluir más de una definición de la misma función C++ tiene muchas funciones sobrecargadas, por ej. Cuando usted invoca a la función pow(x,y) incluida en la biblioteca de funciones matemáticas math.h, la función viene sobrecargada, para que dependiendo del tipo de datos que le pasemos (argumentos) al invocarla, el compilador seleccione a una u otra definición de función. Se puede implementar sobrecarga para cualquier función, pero con la única condición que en el encabezado de cada una de ellas, el número y/o el tipo de los parámetros sean distintos. 2 Guía # 10: Funciones definidas por el programador, Parte II Esta combinación diferente de parámetros y de tipo de retorno, permite al compilador elegir ¿Cuál de las de las definiciones de funciones ejecutara? Resolución de sobrecarga Cuando se realiza la invocación de una función sobrecargada, es decir que existen otras del mismo nombre en el mismo ámbito, el compilador decide cuál de ellas se utilizará mediante un proceso denominado resolución de sobrecarga ("Overload resolution"). Cada prototipo de una función sobrecargada, se considera una función “candidata” a ser elegida para ejecutarse. El compilador hace esta elección de la función mediante un proceso que analiza el número y el tipo de los argumentos usados en la invocación de la función, para así verificar cual de las declaraciones (prototipos de funciones) se ajusta mejor al número y tipo de los argumentos utilizados al ser invocada. Si ninguna de las funciones se adapta a los parámetros indicados, se aplicarán las reglas implícitas de conversión de tipos. En caso que 2 o más prototipos tengan una misma concordancia entre argumentos y el tipo de dato retornado, el compilador detectara un “error de ambigüedad”. III. MATERIALES Y EQUIPO Para la realización de la guía de práctica se requerirá lo siguiente: No. Requerimiento Cantidad 1 Guía de Laboratorio #10 de IP 1 2 Disquete ó Memoria USB 1 3 PC con el programa DEV-C++ 1 IV. PROCEDIMIENTO 1. Cree una carpeta denominada IPguia10proc_CARNET, en el cual se guardara los códigos fuente (cpp) de los ejemplos del procedimiento a continuación. Parte 1: Transferencia de datos entre funciones (Uso de Parámetros y Argumentos) 2. Redacte, compile, ejecute y analice cada uno de los códigos fuentes siguientes. Guia10ejemplo1.cpp Una función que retorna más de un valor: Parámetros por referencia!! Crear una función que reciba en parámetros a la información necesaria para calcular el monto final a pagar por un préstamo con una tasa de interés compuesto anual, así como el monto de interés a pagar al final por el mismo. 3 Guía # 10: Funciones definidas por el programador, Parte II Las formulas a tomar en cuenta son: S = Px(1+i)^n I= S - P En donde: S= Monto final, P = Monto inicial, i = tasa interés compuesta anual, n= cantidad años del préstamo. I= Monto en concepto de interés. 3. Compile el código fuente anterior. Observar uso de los últimos 2 parámetros, que son por referencia (de salida). 4. Ejecutar la aplicación para comprobar que la función altera las variables (montoFinal y montoInteres), enviadas como argumentos para sus variable parámetros (S y luego I, respectivamente). 4 Guía # 10: Funciones definidas por el programador, Parte II PARTE 2: Uso parámetros por referencia y también sentencia return( ) Guia10ejemplo2.cpp Una función que retorna más de un valor: Parámetros por referencia!! Crear una función que reciba 2 valores enteros en parámetros por valor, para que esta retorne en otros 4 parámetros por referencia el resultado de las 4 operaciones matemáticas básicas. Y además, esta función retornara true si la división fue posible. 5 Guía # 10: Funciones definidas por el programador, Parte II Parte 3: Transferencia de arreglos entre funciones Guia10ejemplo3.cpp Desarrollar una función que reciba en un parámetro a un arreglo de 10 valores decimales. Luego, la función ordena el listado de valores recibidos de forma ascendente. 6 Guía # 10: Funciones definidas por el programador, Parte II 5. Ejecutar la aplicación anterior. Ingrese el listado de valores solicitado de manera aleatoria, para luego comprobar si función ordena el arreglo (recibido como parámetro). Evalúe lo que sucede al arreglo a[] de main() cuando finaliza función OrdenarLista(). ¿Altero la función OrdenarLista el valor de las posiciones del arreglo a[ ] perteneciente a main? Lo anterior, significa que en C++, los arreglos en los argumentos son pasados como parámetros por referencia hacia otras funciones. Parte 4: Sobrecarga de funciones Guia10ejemplo4.cpp Desarrollar una función llamada nummayor( ), que determine y retorne el numero mayor entre: A. Dos números B. 3 numeros C. Un listado de N números almacenados en un vector Para que C++ diferencie a cada caso anterior, deberá definir una función sobrecargada 7 Guía # 10: Funciones definidas por el programador, Parte II 8 Guía # 10: Funciones definidas por el programador, Parte II 6. Compile y ejecute el cod. fuente anterior. Observe como el compilador diferencia a cada definición de la misma función nummayor( ), gracias al listado de argumentos enviados en cada invocación dentro de main. 7. modifique el código anterior, reactivando el 1er cout documentado cout<<"Entre 9, 6, 14 y 2, el mayor valor es "<<nummayor(9,6,14,2); Compile el código y analice los mensajes de error generados. ¿Por qué el compilador no logra crear el archivo .exe final? 8. Comente nuevamente el cout del paso anterior y quite el comentario (//) a la línea del 2do cout. Intente compilar nuevamente. ¿Qué hace el compilador cuando se envía argumentos que no coinciden con los tipos de datos de los parámetros de ninguno de los prototipos de esta función sobrecargada? 9. Intercambie los argumentos de esta llamada de función: nummayor(6,a), de esta forma nummayor(a, 6), Vuelva a compilar, ¿Cuál es el motivo del error ahora? 10. Restaure el cambio hecho en el paso anterior. Finalmente, reemplace el argumento a de la llamada nummayor(6,a) por el siguiente: nummayor(6,e2) ¿Que hace el compilador de C++ ante este cambio? 9 Guía # 10: Funciones definidas por el programador, Parte II PROBLEMAS A RESOLVER PROBLEMA 1: Del ejemplo de la Parte 3, modifique la función OrdenarLista(), de tal forma que el arreglo N[ ] de su parámetro sea recibido exclusivamente “por valor”, y no “por referencia” como se hace actualmente. El cambio solicitado debe realizarse solamente en el interior del cuerpo de la función OrdenarLista( ). No debe modificarse ningún otro codigo. La modificación realizada se podrá comprobar fácilmente si la lista que muestra main antes de finalizar, se presentan en el mismo orden como se ingreso cada dato. PROBLEMA 2: Cree una función que permita calcular la nota final de cualquier materia en la Universidad Don Bosco, a partir de las notas de periodo del estudiante. La función debe recibir la información que necesita (como el nombre de la materia, la nota de cada periodo, etc) exclusivamente en forma de parámetros. Y finalmente, debe mostrar en pantalla el listado de notas de periodo recibidas y la nota final del curso. Tome en cuenta que las materias se diferencian académicamente por ser solo de teoría o llevar practica de laboratorio. Y también, puede ser de la facultad de ingeniería o de la facultad de tecnológico. Por cada aclaración del párrafo anterior, deberá sobrecargar esta función, para incluir en cada definición a un caso diferente. 10